/*
* Copyright (C) 2011 Peransin Nicolas.
* Use is subject to license terms.
*/
package org.mypsycho.beans.converter;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
/**
* Class for ...
* <p>Details</p>
*
* @author Peransin Nicolas
*
*/
public class ConverterContainer extends ReflectConverter {
Map<Class<?>, TypeConverter> delegates = new HashMap<Class<?>, TypeConverter>();
TypeConverter defaultConverter;
/**
*
*/
public ConverterContainer() {
PrimitiveConverter.register(this);
}
public void register(TypeConverter converter) {
for (Class<?> type : converter.getSupported()) {
register(type, converter, true);
}
}
public void register(Class<?> key, TypeConverter converter, boolean direct) {
TypeConverter previous = delegates.get(key);
if (previous != null) {
if (previous == converter) {
return;
}
if (!direct && previous.getSupported().contains(key)) {
return;
}
}
delegates.put(key, converter);
if ((key.getSuperclass() != null) && !Object.class.equals(key.getSuperclass())) {
register(key.getSuperclass(), converter, false);
}
for (Class<?> type : key.getInterfaces()) {
register(type, converter, false);
}
}
@Override
public Collection<? extends Class<?>> getSupported() {
return delegates.keySet();
}
@Override
public Object convert(Class<?> expected, String value, Object context) {
TypeConverter converter = delegates.get(expected);
return (converter != null) ? converter.convert(expected, value, context) //
: super.convert(expected, value, context);
}
}