package i5.las2peer.services.ocd.adapters.coverOutput; import i5.las2peer.services.ocd.adapters.AdapterException; import i5.las2peer.services.ocd.graphs.Cover; import i5.las2peer.services.ocd.graphs.CustomGraph; import i5.las2peer.services.ocd.metrics.OcdMetricLog; import java.util.Map; 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; import y.base.Node; import y.base.NodeCursor; /** * A cover output adapter for the default XML format. * The output contains all cover information in XML format. * @author Sebastian * */ public class DefaultXmlCoverOutputAdapter extends AbstractCoverOutputAdapter { @Override public void writeCover(Cover cover) throws AdapterException { DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); try { DocumentBuilder builder = builderFactory.newDocumentBuilder(); Document doc = builder.newDocument(); Element coverElt = doc.createElement("Cover"); doc.appendChild(coverElt); /* * Basic Attributes */ Element coverNameElt = doc.createElement("Name"); coverNameElt.appendChild(doc.createTextNode(cover.getName())); coverElt.appendChild(coverNameElt); // Element coverDescrElt = doc.createElement("Description"); // coverDescrElt.appendChild(doc.createTextNode(cover.getDescription())); // coverElt.appendChild(coverDescrElt); CustomGraph graph = cover.getGraph(); Element graphElt = doc.createElement("Graph"); Element graphNameElt = doc.createElement("Name"); graphNameElt.appendChild(doc.createTextNode(graph.getName())); graphElt.appendChild(graphNameElt); coverElt.appendChild(graphElt); // Element lastUpdateElt = doc.createElement("LastUpdate"); // if(cover.getLastUpdate() != null) { // SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd hh:mm:ss"); // lastUpdateElt.appendChild(doc.createTextNode(dateFormat.format(cover.getLastUpdate()))); // coverElt.appendChild(lastUpdateElt); // } /* * Creation Method */ Element creationMethodElt = doc.createElement("CreationMethod"); Element creationMethodTypeElt = doc.createElement("Type"); creationMethodTypeElt.appendChild(doc.createTextNode(cover.getCreationMethod().getType().name())); creationMethodElt.appendChild(creationMethodTypeElt); Element creationMethodStatusElt = doc.createElement("Status"); creationMethodStatusElt.appendChild(doc.createTextNode(cover.getCreationMethod().getStatus().name())); creationMethodElt.appendChild(creationMethodStatusElt); /* * Creation Method Parameters */ Element creationMethodParamsElt = doc.createElement("Parameters"); for(Map.Entry<String, String> entry: cover.getCreationMethod().getParameters().entrySet()) { Element creationMethodParamElt = doc.createElement("Parameter"); Element creationMethodNameElt = doc.createElement("Name"); creationMethodNameElt.appendChild(doc.createTextNode(entry.getKey())); creationMethodParamElt.appendChild(creationMethodNameElt); Element creationMethodParamValueElt = doc.createElement("Value"); creationMethodParamValueElt.appendChild(doc.createTextNode(entry.getValue())); creationMethodParamElt.appendChild(creationMethodParamValueElt); creationMethodParamsElt.appendChild(creationMethodParamElt); } creationMethodElt.appendChild(creationMethodParamsElt); coverElt.appendChild(creationMethodElt); /* * Metrics */ Element metricsElt = doc.createElement("Metrics"); for(int i=0; i<cover.getMetrics().size(); i++) { OcdMetricLog metric = cover.getMetrics().get(i); Element metricElt = doc.createElement("Metric"); Element metricIdElt = doc.createElement("Id"); metricIdElt.appendChild(doc.createTextNode(Long.toString(metric.getId()))); metricElt.appendChild(metricIdElt); Element metricTypeElt = doc.createElement("Type"); metricTypeElt.appendChild(doc.createTextNode(metric.getType().name())); metricElt.appendChild(metricTypeElt); Element metricStatusElt = doc.createElement("Status"); metricStatusElt.appendChild(doc.createTextNode(metric.getStatus().name())); metricElt.appendChild(metricStatusElt); Element metricValueElt = doc.createElement("Value"); metricValueElt.appendChild(doc.createTextNode(Double.toString(metric.getValue()))); metricElt.appendChild(metricValueElt); /* * Metric Parameters */ Element metricParamsElt = doc.createElement("Parameters"); for(Map.Entry<String, String> entry: metric.getParameters().entrySet()) { Element metricParamElt = doc.createElement("Parameter"); Element metricParamNameElt = doc.createElement("Name"); metricParamNameElt.appendChild(doc.createTextNode(entry.getKey())); metricParamElt.appendChild(metricParamNameElt); Element metricParamValueElt = doc.createElement("Value"); metricParamValueElt.appendChild(doc.createTextNode(entry.getValue())); metricParamElt.appendChild(metricParamValueElt); metricParamsElt.appendChild(metricParamElt); } metricElt.appendChild(metricParamsElt); metricsElt.appendChild(metricElt); } coverElt.appendChild(metricsElt); /* * Communities */ Element communityCountElement = doc.createElement("CommunityCount"); communityCountElement.appendChild(doc.createTextNode(Integer.toString(cover.communityCount()))); coverElt.appendChild(communityCountElement); Element communitiesElt = doc.createElement("Communities"); for(int i=0; i<cover.communityCount(); i++) { Element communityElt = doc.createElement("Community"); Element communityIdElt = doc.createElement("Index"); communityIdElt.appendChild(doc.createTextNode(Integer.toString(i))); communityElt.appendChild(communityIdElt); Element communityNameElt = doc.createElement("Name"); communityNameElt.appendChild(doc.createTextNode(cover.getCommunityName(i))); communityElt.appendChild(communityNameElt); /* * Community Color */ Element communityColorElt = doc.createElement("Color"); Element communityColorRedElt = doc.createElement("Red"); communityColorRedElt.appendChild(doc.createTextNode(Integer.toString(cover.getCommunityColor(i).getRed()))); communityColorElt.appendChild(communityColorRedElt); Element communityColorGreenElt = doc.createElement("Green"); communityColorGreenElt.appendChild(doc.createTextNode(Integer.toString(cover.getCommunityColor(i).getGreen()))); communityColorElt.appendChild(communityColorGreenElt); Element communityColorBlueElt = doc.createElement("Blue"); communityColorBlueElt.appendChild(doc.createTextNode(Integer.toString(cover.getCommunityColor(i).getBlue()))); communityColorElt.appendChild(communityColorBlueElt); communityElt.appendChild(communityColorElt); /* * Community Memberships */ Element membershipsElt = doc.createElement("Memberships"); NodeCursor nodes = cover.getGraph().nodes(); Node node; while(nodes.ok()) { node = nodes.node(); Element membershipElt = doc.createElement("Membership"); Element memberIdElt = doc.createElement("Name"); memberIdElt.appendChild(doc.createTextNode(graph.getNodeName(node))); membershipElt.appendChild(memberIdElt); Element belongingFactorElt = doc.createElement("BelongingFactor"); belongingFactorElt.appendChild(doc.createTextNode(String.format("%.5f\n", cover.getBelongingFactor(node, i)))); membershipElt.appendChild(belongingFactorElt); membershipsElt.appendChild(membershipElt); nodes.next(); } communityElt.appendChild(membershipsElt); communitiesElt.appendChild(communityElt); } coverElt.appendChild(communitiesElt); /* * 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); } } }