package com.clearlyspam23.GLE.template.serializer;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import com.clearlyspam23.GLE.Nameable;
import com.clearlyspam23.GLE.PluginManager;
import com.clearlyspam23.GLE.Template;
import com.clearlyspam23.GLE.level.LayerDefinition;
import com.clearlyspam23.GLE.template.CompressionFormat;
import com.clearlyspam23.GLE.template.CoordinateSystem;
import com.clearlyspam23.GLE.template.LevelSerializer;
import com.thoughtworks.xstream.XStream;
public class TemplateSerializer {
private XStream xstream;
@SuppressWarnings("rawtypes")
public TemplateSerializer(PluginManager manager){
xstream = new XStream();
xstream.alias("Template", Template.class);
xstream.registerConverter(new NameableConverter<CoordinateSystem>(CoordinateSystem.class, generateMap(manager.getRecognizedCoordinateSystems())));
xstream.registerConverter(new NameableConverter<LevelSerializer>(LevelSerializer.class, generateMap(manager.getRecognizedSerializers())));
xstream.registerConverter(new NameableConverter<CompressionFormat>(CompressionFormat.class, generateMap(manager.getRecognizedCompressions())));
xstream.registerConverter(new NameableConverter<LayerDefinition>(LayerDefinition.class, generateMap(manager.getRecognizedLayerDefs())));
}
private <T extends Nameable> Map<String, T> generateMap(Iterable<T> iterable){
HashMap<String, T> ansMap = new HashMap<String, T>();
for(T t : iterable){
ansMap.put(t.getName(), t);
}
return ansMap;
}
public String serialize(Template t){
return xstream.toXML(t);
}
public Template deserialize(String data, File path){
Template output = (Template) xstream.fromXML(data);
output.setTemplateFile(path);
return output;
}
static final String COORD_TAG = "!coord";
static final String SERIALIZER_TAG = "!serialize";
static final String COMPRESSION_TAG = "!compress";
static final String DEF_TAG = "!definition";
static final String PROP_TAG = "!prop";
//
// private Yaml yaml;
// private CustomConstructor construct;
// private CustomRepresenter represent;
//
// public TemplateSerializer(PluginManager manager){
// construct = new CustomConstructor();
// represent = new CustomRepresenter();
// for(CoordinateSystem s : manager.getRecognizedCoordinateSystems()){
// construct.registerCoord(s);
// represent.registerCoord(s);
// }
// for(LevelSerializer s : manager.getRecognizedSerializers()){
// construct.registerSerializer(s);
// represent.registerSerializer(s);
// }
// for(CompressionFormat s : manager.getRecognizedCompressions()){
// construct.registerCompression(s);
// represent.registerCompression(s);
// }
// for(LayerDefinition d : manager.getRecognizedLayerDefs()){
// construct.registerLayerDef(d);
// represent.registerLayerDef(d);
// }
// for(PropertyDefinition d : manager.getRecognizedProperties()){
// construct.registerPropDef(d);
// represent.registerPropDef(d);
// }
// yaml = new Yaml(construct, represent);
// }
//
// public String serialize(Template t){
// return yaml.dump(t);
// }
//
// public Template deserialize(String data, File path){
// Template template = (Template) yaml.load(data);
// template.setTemplateFile(path);
// return template;
// }
}