package context.arch.enactor.server; import java.io.IOException; import java.io.StringWriter; import org.jdom.Document; import org.jdom.Element; import org.jdom.output.XMLOutputter; import context.arch.comm.DataObject; import context.arch.comm.DataObjects; /** * Class used by the EnactorXMLServer to translate DataObjects into an XML format. * * @author newbergr */ public class XMLDataObjectTranslator { private XMLDataObjectTranslator() {} public static String toXML(DataObject d) { return toXML(toJDOMDocument(d)); } public static String toXML(Document d) { StringWriter sw = new StringWriter(); try { XMLOutputter xmlOutputter = new XMLOutputter(); xmlOutputter.setOmitDeclaration(true); xmlOutputter.setNewlines(true); xmlOutputter.setIndent(true); xmlOutputter.output(d,sw); } catch (IOException ioe) {} return sw.toString(); } public static Document toJDOMDocument(DataObject data) { Element topElement = new Element("DataObject"); topElement.setAttribute("name",data.getName()); processChildrenToXML(data,topElement); return new Document(topElement); } public static DataObject fromXML(Document d) { Element rootElement = d.getRootElement(); if ("DataObject".equals(rootElement.getName())) { return processChildrenFromXML(rootElement); } else { return null; } } private static void processChildrenToXML(DataObject d, Element element) { String value = d.getValue(); DataObjects children = d.getChildren(); // Vector v = d.getValue(); // Iterator i = v.iterator(); // process value; assuming only one if (value != null) { Element newElement = new Element("Data"); newElement.setAttribute("value", value); element.addContent(newElement); } // process children for (DataObject childDataObject : children) { Element newElement = new Element("DataObject"); newElement.setAttribute("name",childDataObject.getName()); element.addContent(newElement); processChildrenToXML(childDataObject,newElement); } // deprecated // while (i.hasNext()) { // Object o = i.next(); // // if (o instanceof DataObject) { // DataObject childDataObject = (DataObject) o; // Element newElement = new Element("DataObject"); // newElement.setAttribute("name",childDataObject.getName()); // element.addContent(newElement); // processChildrenToXML(childDataObject,newElement); // } else { // Element newElement = new Element("Data"); // newElement.setAttribute("value", String.valueOf(o)); // element.addContent(newElement); // } // } } private static DataObject processChildrenFromXML(Element e) { DataObjects v = new DataObjects(); String value = null; // if assuming only one value for (Object o : e.getChildren()) { Element child = (Element)o; String childName = child.getName(); if ("DataObject".equals(childName)) { v.add(processChildrenFromXML(child)); } else if ("Data".equals(childName)) { value = child.getAttributeValue("value"); } } return new DataObject(e.getAttributeValue("name"), value, v); } }