package i5.las2peer.services.ocd.adapters.graphOutput;
import i5.las2peer.services.ocd.adapters.AdapterException;
import i5.las2peer.services.ocd.graphs.CustomGraph;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import y.base.Edge;
import y.base.EdgeCursor;
import y.base.EdgeMap;
import y.base.Node;
import y.base.NodeCursor;
import y.base.NodeMap;
import y.io.GraphMLIOHandler;
import y.io.graphml.GraphMLHandler;
import y.io.graphml.KeyScope;
import y.io.graphml.KeyType;
/**
* A graph output adapter for GraphML format, based on the GraphMLIOHandler of the yFiles library..
* Node names will be written into a CDATA Section in a "name" element.
* Edge weights will be written into a "weight" element.
* @author Sebastian
*
*/
public class GraphMlGraphOutputAdapter extends AbstractGraphOutputAdapter {
@Override
public void writeGraph(CustomGraph graph) throws AdapterException {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
NodeMap nodeNames = graph.createNodeMap();
NodeCursor nodes = graph.nodes();
Node node;
while(nodes.ok()) {
node = nodes.node();
nodeNames.set(node, graph.getNodeName(node));
nodes.next();
}
EdgeMap edgeWeights = graph.createEdgeMap();
EdgeCursor edges = graph.edges();
Edge edge;
while(edges.ok()) {
edge = edges.edge();
edgeWeights.set(edge, graph.getEdgeWeight(edge));
edges.next();
}
GraphMLIOHandler ioh = new GraphMLIOHandler();
GraphMLHandler core = ioh.getGraphMLHandler();
core.addOutputDataProvider("name", nodeNames, KeyScope.NODE, KeyType.STRING);
core.addOutputDataProvider("weight", edgeWeights, KeyScope.EDGE, KeyType.DOUBLE);
try {
ioh.write(graph, outStream);
String outString = outStream.toString();
writer.write(outString);
}
catch(IOException e) {
throw new AdapterException(e);
} finally {
try {
outStream.close();
}
catch(IOException e) {
}
try {
writer.close();
}
catch(IOException e) {
}
graph.disposeNodeMap(nodeNames);
graph.disposeEdgeMap(edgeWeights);
}
}
}