package i5.las2peer.services.ocd.adapters.graphOutput;
import i5.las2peer.services.ocd.adapters.AdapterException;
import i5.las2peer.services.ocd.graphs.CustomGraph;
import i5.las2peer.services.ocd.graphs.GraphType;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
/**
* A graph output adapter for the meta XML format.
* The output contains meta information about the graph in XML format, but not the actual graph structure or other node or edge related meta data.
* @author Sebastian
*
*/
public class MetaXmlGraphOutputAdapter extends AbstractGraphOutputAdapter {
@Override
public void writeGraph(CustomGraph graph) throws AdapterException {
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder builder = builderFactory.newDocumentBuilder();
Document doc = builder.newDocument();
Element graphElt = doc.createElement("Graph");
doc.appendChild(graphElt);
/*
* Basic Attributes
*/
Element graphIdElt = doc.createElement("Id");
graphIdElt.appendChild(doc.createTextNode(Long.toString(graph.getId())));
graphElt.appendChild(graphIdElt);
Element graphNameElt = doc.createElement("Name");
graphNameElt.appendChild(doc.createTextNode(graph.getName()));
graphElt.appendChild(graphNameElt);
// Element graphDescrElt = doc.createElement("Description");
// graphDescrElt.appendChild(doc.createTextNode(graph.getDescription()));
// graphElt.appendChild(graphDescrElt);
Element graphNodeCountElt = doc.createElement("NodeCount");
graphNodeCountElt.appendChild(doc.createTextNode(Integer.toString(graph.nodeCount())));
graphElt.appendChild(graphNodeCountElt);
Element graphEdgeCountElt = doc.createElement("EdgeCount");
graphEdgeCountElt.appendChild(doc.createTextNode(Integer.toString(graph.edgeCount())));
graphElt.appendChild(graphEdgeCountElt);
// Element lastUpdateElt = doc.createElement("LastUpdate");
// if(graph.getLastUpdate() != null) {
// SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd hh:mm:ss");
// lastUpdateElt.appendChild(doc.createTextNode(dateFormat.format(graph.getLastUpdate())));
// graphElt.appendChild(lastUpdateElt);
// }
/*
* Graph Types
*/
Element typesElt = doc.createElement("Types");
for(GraphType type : graph.getTypes()) {
Element typeElt = doc.createElement("Type");
typeElt.appendChild(doc.createTextNode(type.name()));
typesElt.appendChild(typeElt);
}
graphElt.appendChild(typesElt);
/*
* Creation Method
*/
Element creationMethodElt = doc.createElement("CreationMethod");
Element creationMethodTypeElt = doc.createElement("Type");
creationMethodTypeElt.appendChild(doc.createTextNode(graph.getCreationMethod().getType().name()));
creationMethodElt.appendChild(creationMethodTypeElt);
Element creationMethodStatus = doc.createElement("Status");
creationMethodStatus.appendChild(doc.createTextNode(graph.getCreationMethod().getStatus().name()));
creationMethodElt.appendChild(creationMethodStatus);
graphElt.appendChild(creationMethodElt);
/*
* XML output
*/
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
DOMSource domSource = new DOMSource(doc);
StreamResult streamResult = new StreamResult(this.writer);
transformer.transform(domSource, streamResult);
}
catch(Exception e) {
throw new AdapterException(e);
}
}
}