package org.jboss.windup.reporting.renderer.gexf;
import java.io.IOException;
import java.io.OutputStream;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.jboss.windup.reporting.renderer.GraphDataSerializer;
import com.tinkerpop.blueprints.Direction;
import com.tinkerpop.blueprints.Edge;
import com.tinkerpop.blueprints.Graph;
import com.tinkerpop.blueprints.Vertex;
public class GexfWriter implements GraphDataSerializer
{
protected final Graph graph;
protected String defaultEdgeType = "directed";
protected String mode = "static";
protected String vertexLabelProperty = "label";
protected String edgeLabel = null;
public GexfWriter(Graph graph)
{
this.graph = graph;
}
public GexfWriter(Graph graph, String mode, String defaultEdgeType, String vertexLabelProperty, String edgeLabel)
{
this.graph = graph;
this.mode = mode;
this.defaultEdgeType = defaultEdgeType;
this.vertexLabelProperty = vertexLabelProperty;
this.edgeLabel = edgeLabel;
}
public void writeGraph(OutputStream os) throws IOException
{
writeGexf(os);
}
private void writeGexf(OutputStream os) throws IOException
{
IOUtils.write(GexfConstants.OPENING_TAG, os);
writeGraphTag(mode, defaultEdgeType, os);
IOUtils.write(GexfConstants.CLOSING_TAG, os);
}
private void writeGraphTag(String mode, String edgeType, OutputStream os) throws IOException
{
final String tag = StringUtils.replaceEach(GexfConstants.GRAPH_NODE_OPEN, new String[] { "%1", "%2" },
new String[] { mode, edgeType });
IOUtils.write(tag, os);
writeGraphNodes(os);
writeGraphEdges(os);
IOUtils.write(GexfConstants.GRAPH_NODE_CLOSE, os);
}
private void writeGraphEdges(OutputStream os) throws IOException
{
IOUtils.write(GexfConstants.EDGES_OPEN, os);
for (Edge edge : graph.getEdges())
{
String id = "" + edge.getId().hashCode();
String source = "" + edge.getVertex(Direction.OUT).getId().toString();
String target = "" + edge.getVertex(Direction.IN).getId().toString();
writeGraphEdge(id, source, target, os);
}
IOUtils.write(GexfConstants.EDGES_CLOSE, os);
}
private void writeGraphEdge(String id, String source, String target, OutputStream os) throws IOException
{
final String tag = StringUtils.replaceEach(GexfConstants.EDGE_TAG, new String[] { "%1", "%2", "%3" },
new String[] { id, source, target });
IOUtils.write(tag, os);
}
private void writeGraphNode(String id, String label, OutputStream os) throws IOException
{
final String tag = StringUtils.replaceEach(GexfConstants.NODE_TAG,
new String[] { "%1", "%2" },
new String[] { id, label });
IOUtils.write(tag, os);
}
private void writeGraphNodes(OutputStream os) throws IOException
{
IOUtils.write(GexfConstants.NODES_OPEN, os);
// iterate the nodes.
for (Vertex vertex : graph.getVertices())
{
String id = "" + vertex.getId().toString();
String label = vertex.getProperty(vertexLabelProperty);
if (StringUtils.isBlank(label))
{
label = vertex.toString();
}
writeGraphNode(id, label, os);
}
IOUtils.write(GexfConstants.NODES_CLOSE, os);
}
}