package nl.thanod.cassandra.alpha.bytes; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import javax.imageio.spi.ServiceRegistry; public abstract class ByteObjectTranslator<T> { public static final Map<Class<?>, ByteObjectTranslator<?>> translatormap = new HashMap<Class<?>, ByteObjectTranslator<?>>(); protected final Class<T> type; public ByteObjectTranslator(Class<T> type) { this.type = type; } public final Class<T> getType() { return type; } public abstract byte[] get(T o); public abstract T get(byte[] b); @SuppressWarnings("unchecked") public static <T> ByteObjectTranslator<T> getTranslatorFor(Class<T> type) throws NoTranslatorException { ByteObjectTranslator<?> t = translatormap.get(type); if (t == null){ populateTranslatorMap(); t = translatormap.get(type); } if (t == null) throw new NoTranslatorException(type); return (ByteObjectTranslator<T>)t; } @SuppressWarnings("unchecked") private static void populateTranslatorMap() { Iterator<ByteObjectTranslator> list = ServiceRegistry.lookupProviders(ByteObjectTranslator.class); while (list.hasNext()) { ByteObjectTranslator<?> t = list.next(); translatormap.put(t.getClass(), t); } } }