package nl.bstoi.poiparser.core.strategy.factory; import java.math.BigDecimal; import java.util.Calendar; import java.util.Date; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import nl.bstoi.poiparser.api.strategy.converter.Converter; import nl.bstoi.poiparser.core.exception.NonExistentConverterException; import nl.bstoi.poiparser.core.strategy.converter.*; public class DefaultConverterFactory { private final Map<Class<?>, Class<? extends Converter<?>>> typeConvertorMap = new ConcurrentHashMap<Class<?>, Class<? extends Converter<?>>>(); public DefaultConverterFactory() { // Register default converters registerConverter(String.class, StringConverter.class); registerConverter(Short.class, ShortConverter.class); registerConverter(Short.TYPE, ShortConverter.class); registerConverter(Integer.class, IntegerConverter.class); registerConverter(Integer.TYPE, IntegerConverter.class); registerConverter(Long.class, LongConverter.class); registerConverter(Long.TYPE, LongConverter.class); registerConverter(BigDecimal.class, BigDecimalConverter.class); registerConverter(Date.class, DateConverter.class); registerConverter(Calendar.class, CalendarConverter.class); registerConverter(Boolean.class, BooleanConverter.class); registerConverter(Boolean.TYPE, BooleanConverter.class); } public Converter<?> getConverter(final Class<?> type) throws InstantiationException, IllegalAccessException, NonExistentConverterException { if (hasConverterForType(type)) { return typeConvertorMap.get(type).newInstance(); } throw new NonExistentConverterException(String.format("No converter found for type %s", type.getCanonicalName())); } public void registerConverter(final Class<?> type, final Class<? extends Converter<?>> converterType) { typeConvertorMap.put(type, converterType); } public boolean hasConverterForType(final Class<?> type) { return typeConvertorMap.containsKey(type); } }