package net.codjo.segmentation.server.blackboard.message; import net.codjo.agent.AclMessage; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.xml.DomDriver; /** * */ public class MessageCodec { XStream xstream = new XStream(new DomDriver()); public MessageCodec() { xstream.alias("read", Read.class); xstream.alias("erase", Erase.class); xstream.alias("getTodo", GetTodo.class); xstream.alias("write", Write.class); xstream.alias("nextLevel", NextLevel.class); xstream.alias("actions", BlackboardActionBuilder.class); xstream.addImplicitCollection(BlackboardActionBuilder.class, "actions"); xstream.useAttributeFor("id", long.class); xstream.useAttributeFor("name", String.class); } String toXml(BlackboardAction action) { if (action.hasBlackBoardActionBuilder()) { return xstream.toXML(action.then()); } return xstream.toXML(action); } BlackboardAction fromXml(String xml) { Object result = xstream.fromXML(xml); if (result instanceof BlackboardActionBuilder) { return wrapp((BlackboardActionBuilder)result); } return (BlackboardAction)result; } private BlackboardAction wrapp(final BlackboardActionBuilder builder) { return new BlackboardAction() { @Override public void acceptVisitor(BlackboardActionVisitor visitor) { builder.visit(visitor); } }; } public void encode(AclMessage aclMessage, BlackboardAction action) { aclMessage.setLanguage("xml"); aclMessage.setContent(toXml(action)); } public BlackboardAction decode(AclMessage aclMessage) { return fromXml(aclMessage.getContent()); } public void encodeRead(AclMessage inform, Read read) { inform.setLanguage("xml"); inform.setContent(xstream.toXML(read)); } public Read decodeRead(AclMessage inform) { return (Read)xstream.fromXML(inform.getContent()); } }