001: package dalma.container.model;
002:
003: import dalma.EndPoint;
004: import dalma.Engine;
005:
006: import java.text.ParseException;
007: import java.io.File;
008:
009: /**
010: * Converts a persisted configuration value into an object of the appropriate type.
011: *
012: * TODO: consider adding pluggability.
013: *
014: * @author Kohsuke Kawaguchi
015: */
016: abstract class Converter<T> {
017:
018: abstract Class<T> getType();
019:
020: abstract T load(Engine engine, String propertyName, String value)
021: throws ParseException;
022:
023: //String save(T value);
024:
025: /**
026: * Finds a converter that handles the given type.
027: *
028: * @return
029: * null if no suitable converter was found.
030: */
031: public static <V> Converter<? super V> get(Class<V> type) {
032: for (Converter conv : ALL) {
033: if (conv.getType().isAssignableFrom(type))
034: return conv;
035: }
036: return null;
037: }
038:
039: /**
040: * All converters.
041: */
042: public static final Converter[] ALL = { new Converter<String>() {
043: public Class<String> getType() {
044: return String.class;
045: }
046:
047: public String load(Engine engine, String propertyName,
048: String value) {
049: return value;
050: }
051:
052: public String save(String value) {
053: return value;
054: }
055: },
056:
057: new Converter<File>() {
058: public Class<File> getType() {
059: return File.class;
060: }
061:
062: public File load(Engine engine, String propertyName,
063: String value) {
064: return new File(value);
065: }
066:
067: public String save(String value) {
068: return value;
069: }
070: },
071:
072: new Converter<Boolean>() {
073: public Class<Boolean> getType() {
074: return Boolean.class;
075: }
076:
077: public Boolean load(Engine engine, String propertyName,
078: String value) {
079: return Boolean.valueOf(value);
080: }
081:
082: public String save(Boolean value) {
083: if (value == null)
084: value = false;
085: return Boolean.toString(value);
086: }
087: },
088:
089: new Converter<Integer>() {
090: public Class<Integer> getType() {
091: return Integer.class;
092: }
093:
094: public Integer load(Engine engine, String propertyName,
095: String value) {
096: if (value == null)
097: return 0;
098: return Integer.valueOf(value);
099: }
100:
101: public String save(Integer value) {
102: if (value == null)
103: return null;
104: return Integer.toString(value);
105: }
106: },
107:
108: new Converter<EndPoint>() {
109: public Class<EndPoint> getType() {
110: return EndPoint.class;
111: }
112:
113: public EndPoint load(Engine engine, String propertyName,
114: String value) throws ParseException {
115: return engine.addEndPoint(propertyName, value);
116: }
117: } };
118: }
|