package de.persosim.simulator.perso.xstream; import com.thoughtworks.xstream.XStreamException; 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 de.persosim.simulator.protocols.Protocol; /** * This class is a converter which is responsible for serializing/deserializing all kind of protocol objects. * * @author jgoeke * */ public class ProtocolConverter implements Converter { @Override public boolean canConvert(@SuppressWarnings("rawtypes") Class type) { return Protocol.class.isAssignableFrom(type); } @Override public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) { // nothing to do } @Override public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { String protocolName = reader.getNodeName(); try { Class<?> protocol = context.getRequiredType(); if (!Protocol.class.isAssignableFrom(protocol)){ throw new XStreamException("Class " + protocol + " is not assignable to " + Protocol.class); } return protocol.newInstance(); } catch (InstantiationException | IllegalAccessException e) { throw new XStreamException (protocolName + " is unknown, unmarshaling failed!"); } } }