/* * codjo.net * * Common Apache License 2.0 */ package net.codjo.dataprocess.common.codec; import net.codjo.dataprocess.common.model.ArgList; import net.codjo.dataprocess.common.model.ArgModel; import net.codjo.dataprocess.common.model.ResultTable; import net.codjo.dataprocess.common.model.TreatmentModel; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.converters.Converter; import com.thoughtworks.xstream.converters.MarshallingContext; import com.thoughtworks.xstream.converters.UnmarshallingContext; import com.thoughtworks.xstream.io.HierarchicalStreamReader; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; import com.thoughtworks.xstream.io.xml.DomDriver; /** * */ public class TreatmentModelCodec { private TreatmentModelCodec() { } public static synchronized String encode(TreatmentModel treatmentModel) { return createTreatmentModelXstream().toXML(treatmentModel); } public static synchronized TreatmentModel decode(String xmlContent) { return (TreatmentModel)createTreatmentModelXstream().fromXML(xmlContent); } public static synchronized TreatmentModel decodeFromResources(String uri) { return (TreatmentModel)createTreatmentModelXstream() .fromXML(TreatmentModelCodec.class.getResourceAsStream(uri)); } static XStream createTreatmentModelXstream() { XStream xstream = new XStream(new DomDriver("ISO-8859-1")); xstream.addImplicitCollection(ArgList.class, "args"); xstream.alias("treatment", TreatmentModel.class); xstream.useAttributeFor("id", String.class); xstream.useAttributeFor("type", String.class); xstream.aliasField("gui-target", TreatmentModel.class, "guiTarget"); xstream.aliasField("result-table", TreatmentModel.class, "resultTable"); xstream.alias("arg", ArgModel.class); xstream.registerConverter(new ArgModelConverter()); xstream.registerConverter(new ResultTableConverter()); return xstream; } private static class ArgModelConverter implements Converter { public boolean canConvert(Class type) { return type == ArgModel.class; } public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) { ArgModel argument = (ArgModel)source; write("name", argument.getName(), writer); write("position", argument.getPosition(), writer); write("type", argument.getType(), writer); write("value", argument.getValue(), writer); } public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { return new ArgModel(reader.getAttribute("name"), reader.getAttribute("value"), getIntValue(reader, "position"), getIntValue(reader, "type")); } private static int getIntValue(HierarchicalStreamReader reader, String name) { return Integer.parseInt(reader.getAttribute(name)); } private static void write(String fieldName, Object value, HierarchicalStreamWriter writer) { if (value == null) { return; } writer.addAttribute(fieldName, String.valueOf(value)); } } private static class ResultTableConverter implements Converter { public boolean canConvert(Class type) { return type == ResultTable.class; } public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) { ResultTable resultTable = (ResultTable)source; write("selectAllHandler", resultTable.getSelectAllHandler(), writer); writer.setValue(resultTable.getTable()); } public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { return new ResultTable(reader.getValue(), reader.getAttribute("selectAllHandler")); } private static void write(String fieldName, Object value, HierarchicalStreamWriter writer) { if (value == null) { return; } writer.addAttribute(fieldName, String.valueOf(value)); } } }