package de.persosim.simulator.perso.xstream; import static org.globaltester.logging.BasicLogger.ERROR; import static org.globaltester.logging.BasicLogger.log; import java.math.BigInteger; import java.security.spec.ECPoint; 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; /** * This class is a converter which is responsible for serializing/deserializing * point objects. * * @author jgoeke * */ public class PointConverter implements Converter { BigInteger x = null; BigInteger y = null; @Override public boolean canConvert(@SuppressWarnings("rawtypes") Class clazz) { return clazz.equals(ECPoint.class); } @Override public void marshal(Object object, HierarchicalStreamWriter writer, MarshallingContext context) { ECPoint point = (ECPoint) object; BigInteger x = point.getAffineX(); BigInteger y = point.getAffineY(); // open point element writer.startNode("point"); // x element writer.startNode("x"); writer.setValue(x.toString()); writer.endNode(); // y element writer.startNode("y"); writer.setValue(y.toString()); writer.endNode(); // close point element writer.endNode(); } public void getValuesFromXML(HierarchicalStreamReader reader, UnmarshallingContext context) { while (reader.hasMoreChildren()) { reader.moveDown(); String nodeName = reader.getNodeName(); switch(nodeName) { case "x": x = new BigInteger(reader.getValue()); break; case "y": y = new BigInteger(reader.getValue()); break; } if(reader.hasMoreChildren()) { getValuesFromXML(reader, context); } reader.moveUp(); } } @Override public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { if (reader.getNodeName().equals("point")) { getValuesFromXML (reader, context); } if (x == null || y == null || x.equals("") || y.equals("")) { String message = "can not create point object, unmarshal failed!"; log(getClass(), message, ERROR); throw new XStreamException (message); } ECPoint point = new ECPoint(x, y); return point; } }