Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

No Format
import java.util.*;
import org.apache.commons.betwixt.expression.*;
import org.apache.commons.betwixt.strategy.*;

/**
 * 
 *
 * @author Jesse Sweetland
 */
public class CustomObjectStringConverter extends ObjectStringConverterDefaultObjectStringConverter {
    private final Map<Class, ObjectStringConverter> _converters = new HashMap<Class, ObjectStringConverter>();
    
    public void register(ObjectStringConverter converter, Class forType) {
        _converters.put(forType, converter);
    }
    
    public void deregister(Class forType) {
        _converters.remove(forType);
    }

    public ObjectStringConverter resolve(Class forType) {
        int minDistance = Integer.MAX_VALUE;
        ObjectStringConverter converter = null;
        for(Map.Entry<Class, ObjectStringConverter> entry: _converters.entrySet()) {
            int distance = getDistance(entry.getKey(), forType);
            if((distance >= 0) && (distance < minDistance)) {
                minDistance = distance;
                converter = entry.getValue();
            }
        }
        return converter;
    }
    
    private int getDistance(Class superClass, Class type) {
        if(superClass.isAssignableFrom(type)) {
            Class temp = type;
            int distance = 0;
            while(temp != null) {
                if(temp.equals(superClass)) return distance;
                for(Class ifc: temp.getInterfaces()) {
                    if(ifc.equals(superClass)) return distance;
                }
                distance++;
                temp = temp.getSuperclass();
            }
        }
        return -1;
    }
    
    public String objectToString(Object object, Class type, Context context) {
        if(object == null) return null;
        ObjectStringConverter converter = resolve(type);
        if(converter != null) {
            return converter.objectToString(object, type, context);
        } else {
            return super.objectToString(object, type, context);
        }
    }
    
    public Object stringToObject(String value, Class type, Context context) {
        if(value == null) return null;
        ObjectStringConverter converter = resolve(type);
        if(converter != null) {
            return converter.stringToObject(value, type, context);
        } else {
            return super.stringToObject(value, type, context);
        }
    }    
}

...