package org.hivedb.serialization;
import org.hivedb.util.classgen.ReflectionTools;
import org.hivedb.util.functional.Maps;
import org.hivedb.util.functional.Transform;
import org.hivedb.util.functional.Unary;
import org.hivedb.versioning.XmlModernizationPaver;
import java.io.InputStream;
import java.util.*;
/**
* Uses XStream serializers to provide a repository of class-based serializers.
* @author bcrawford@cafepress.com
*
*/
public class XmlXStreamSerializationProvider implements SerializationProvider {
@SuppressWarnings("unchecked")
Map<Class, XmlXStreamSerializer> serializers = Maps.newHashMap();
private static XmlXStreamSerializationProvider instance = null;
private XmlXStreamSerializationProvider() {}
public static XmlXStreamSerializationProvider initialize(Class...classes){
return initialize(Arrays.asList(classes), new Hashtable<Class<?>, XmlModernizationPaver<?>>());
}
public static XmlXStreamSerializationProvider initialize(Collection<Class> classes) {
return initialize(classes, new Hashtable<Class<?>, XmlModernizationPaver<?>>());
}
public static XmlXStreamSerializationProvider initialize(Collection<Class> classes, final Map<Class<?>, XmlModernizationPaver<?>> xmlModernizationPaverMap) {
XmlXStreamSerializationProvider provider = new XmlXStreamSerializationProvider();
provider.serializers = Transform.toMap(
new Transform.IdentityFunction<Class>(),
new Unary<Class, XmlXStreamSerializer>(){
public XmlXStreamSerializer f(Class item) {
return new XmlXStreamSerializer(item, xmlModernizationPaverMap);
}},
classes);
synchronized (provider) {
XmlXStreamSerializationProvider.instance = provider;
}
return provider;
}
public static SerializationProvider instance() {
if(instance == null)
throw new RuntimeException("SerializationProvider must be initialized.");
return instance;
}
@SuppressWarnings("unchecked")
public Serializer<Object, InputStream> getSerializer(Class<?> clazz) {
return serializers.get(ReflectionTools.whichIsImplemented(clazz, serializers.keySet()));
}
public Map<Class, XmlXStreamSerializer> getSerializers() {
return serializers;
}
public void setSerializers(Map<Class, XmlXStreamSerializer> serializers) {
this.serializers = serializers;
}
public static XmlXStreamSerializationProvider getInstance() {
return instance;
}
public static void setInstance(XmlXStreamSerializationProvider instance) {
XmlXStreamSerializationProvider.instance = instance;
}
@SuppressWarnings("unchecked")
public Collection<Class> getSerializableInterfaces() {
return new ArrayList(serializers.keySet());
}
}