package org.jboss.windup.reporting.renderer.graphlib;
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 org.jboss.windup.reporting.renderer.graphlib.GraphvizConstants.GraphvizDirection;
import org.jboss.windup.reporting.renderer.graphlib.GraphvizConstants.GraphvizType;
import com.tinkerpop.blueprints.Direction;
import com.tinkerpop.blueprints.Edge;
import com.tinkerpop.blueprints.Graph;
import com.tinkerpop.blueprints.Vertex;
public class GraphlibWriter implements GraphDataSerializer
{
protected final Graph graph;
protected final GraphvizType type;
protected final GraphvizDirection direction;
protected final String graphVariableName;
protected final String vertexLabelProperty;
protected final String edgeLabel;
public GraphlibWriter(Graph graph)
{
// default config
this(graph, GraphvizType.DIGRAPH, GraphvizDirection.TOP_TO_BOTTOM, "g", "label", "label");
}
public GraphlibWriter(Graph graph, GraphvizType type, GraphvizDirection direction, String graphVariableName,
String vertexLabelProperty, String edgeLabelProperty)
{
this.graph = graph;
this.graphVariableName = graphVariableName;
this.vertexLabelProperty = vertexLabelProperty;
this.edgeLabel = edgeLabelProperty;
this.type = type;
this.direction = direction;
}
@Override
public void writeGraph(OutputStream os) throws IOException
{
IOUtils.write(GraphvizConstants.METHOD_OPEN, os);
final String tag = StringUtils.replaceEach(GraphvizConstants.CONSTRUCTOR_STATEMENT, new String[] { "%NAME",
"%TYPE" }, new String[] { graphVariableName, type.getName() });
IOUtils.write(tag, os);
writeGraphNodes(os);
writeGraphEdges(os);
IOUtils.write(GraphvizConstants.GRAPH_RENDERER, os);
IOUtils.write(StringUtils.replace(GraphvizConstants.GRAPH_LAYOUT, "%DIRECTION", direction.getDirection()), os);
IOUtils.write(StringUtils.replace(GraphvizConstants.GRAPH_RENDERER_RUN, "%NAME", graphVariableName), os);
IOUtils.write(GraphvizConstants.METHOD_CLOSE, os);
}
private void writeGraphEdges(OutputStream os) throws IOException
{
int i = 0;
for (Edge edge : graph.getEdges())
{
String id = "" + i;
String source = "" + edge.getVertex(Direction.OUT).getId().toString();
String target = "" + edge.getVertex(Direction.IN).getId().toString();
String label = "" + edge.getProperty(edgeLabel);
if (edgeLabel != null)
{
label = edgeLabel;
}
writeGraphEdge(id, source, target, label, os);
i++;
}
}
private void writeGraphEdge(String id, String source, String target, String label, OutputStream os)
throws IOException
{
final String tag = StringUtils.replaceEach(GraphvizConstants.EDGE_STATEMENT,
new String[] { "%NAME", "%ID", "%SOURCE", "%TARGET", "%LABEL" },
new String[] { graphVariableName, id, source, target, label });
IOUtils.write(tag, os);
}
private void writeGraphNode(String id, String label, OutputStream os) throws IOException
{
final String tag = StringUtils.replaceEach(GraphvizConstants.NODE_STATEMENT,
new String[] { "%NAME", "%ID", "%LABEL", "%CLZLIST" },
new String[] { graphVariableName, id, label, "" });
IOUtils.write(tag, os);
}
private void writeGraphNodes(OutputStream os) throws IOException
{
// iterate the nodes.
for (Vertex vertex : graph.getVertices())
{
String id = vertex.getId().toString();
String label = vertex.getProperty(vertexLabelProperty);
writeGraphNode(id, label, os);
}
}
}