package com.browseengine.bobo.facets.data; import java.lang.reflect.Constructor; import java.util.Date; import java.util.HashMap; import java.util.Map; /** * Class supported: * <ul> * <li> {@link Integer}</li> * <li> {@link Float}</li> * <li> {@link Character}</li> * <li> {@link Double}</li> * <li> {@link Short}</li> * <li> {@link Long}</li> * <li> {@link Date}</li> * </ul> * * Autoboxing: primitive types corresponding classes above are supported. */ public class PredefinedTermListFactory<T> implements TermListFactory<T> { private static Map<Class<?>, Class<? extends TermValueList<?>>> supportedTypes = new HashMap<Class<?>, Class<? extends TermValueList<?>>>(); static { supportedTypes.put(int.class, TermIntList.class); supportedTypes.put(float.class, TermFloatList.class); supportedTypes.put(char.class, TermCharList.class); supportedTypes.put(double.class, TermDoubleList.class); supportedTypes.put(short.class, TermShortList.class); supportedTypes.put(long.class, TermLongList.class); supportedTypes.put(Integer.class, TermIntList.class); supportedTypes.put(Float.class, TermFloatList.class); supportedTypes.put(Character.class, TermCharList.class); supportedTypes.put(Double.class, TermDoubleList.class); supportedTypes.put(Short.class, TermShortList.class); supportedTypes.put(Long.class, TermLongList.class); supportedTypes.put(Date.class, TermDateList.class); } private final Class<T> _cls; private final String _format; private final Class<? extends TermValueList<T>> _listClass; @SuppressWarnings("unchecked") public PredefinedTermListFactory(Class<T> cls, String format) { if (supportedTypes.get(cls) == null) { throw new IllegalArgumentException("Class " + cls + " not defined."); } _cls = cls; _format = format; _listClass = (Class<? extends TermValueList<T>>) supportedTypes.get(_cls); } public PredefinedTermListFactory(Class<T> cls) { this(cls, null); } @Override public TermValueList<T> createTermList(int capacity) { if (TermCharList.class.equals(_listClass)) // we treat char type separate as // it does not have a format // string { @SuppressWarnings("unchecked") TermValueList<T> retlist = (TermValueList<T>) (new TermCharList(capacity)); ; return retlist; } else { try { Constructor<? extends TermValueList<T>> constructor = _listClass.getConstructor(int.class, String.class); // the constructor also takes the format String as parameter return constructor.newInstance(capacity, _format); } catch (Exception e) { throw new RuntimeException(e.getMessage()); } } } @Override public TermValueList<T> createTermList() { return createTermList(-1); } @Override public Class<T> getType() { // TODO Auto-generated method stub return _cls; } }