package org.jboss.windup.graph;
import java.util.HashSet;
import java.util.Set;
import org.apache.commons.lang3.StringUtils;
import com.tinkerpop.blueprints.Direction;
import com.tinkerpop.blueprints.Edge;
import com.tinkerpop.blueprints.Vertex;
/**
* @author <a href="mailto:zizka@seznam.cz">Ondrej Zizka</a>
*/
public class GraphUtil
{
/**
* Formats a vertex using it's properties. Debugging purposes.
*/
public static final String vertexAsString(Vertex vertex, int depth, String withEdgesOfLabel)
{
StringBuilder sb = new StringBuilder();
vertexAsString(vertex, depth, withEdgesOfLabel, sb, 0, new HashSet<>());
return sb.toString();
}
private static final void vertexAsString(Vertex vertex, int depth, String withEdgesOfLabel, StringBuilder sb, int atLevel, Set<Object> visitedIDs)
{
String indent = StringUtils.repeat(" ", atLevel);
if (vertex == null)
{
sb.append("\n").append(indent).append("(vertex == null)");
return;
}
if (visitedIDs.contains(vertex.getId()))
{
sb.append("\n").append(indent).append("" + vertex.getId());
return;
}
visitedIDs.add(vertex.getId());
sb.append("\n").append(indent).append("v #").append("" + vertex.getId()).append(" {");
boolean hasProps = !vertex.getPropertyKeys().isEmpty();
boolean hasEdges = vertex.getEdges(Direction.IN).iterator().hasNext()
|| vertex.getEdges(Direction.OUT).iterator().hasNext();
for (String propKey : vertex.getPropertyKeys())
{
sb.append("\n ").append(indent).append(propKey).append(": ").append("" + vertex.getProperty(propKey));
}
if (withEdgesOfLabel == null || depth == 0)
{
if (hasProps)
sb.append("\n ").append(indent);
if (hasEdges)
sb.append("... + some edges...");
}
else
{
boolean allEdges = "*".equals(withEdgesOfLabel);
sb.append("\n ").append(indent).append(withEdgesOfLabel).append(" OUT -> ");
for (Edge edge : allEdges ? vertex.getEdges(Direction.OUT) : vertex.getEdges(Direction.OUT, withEdgesOfLabel))
{
if (allEdges)
sb.append("\n ").append(indent).append(edge.getLabel()).append(" --> ");
vertexAsString(edge.getVertex(Direction.IN), depth - 1, withEdgesOfLabel, sb, atLevel + 1, visitedIDs);
}
sb.append("\n ").append(indent).append(withEdgesOfLabel).append(" <- IN");
for (Edge edge : allEdges ? vertex.getEdges(Direction.IN) : vertex.getEdges(Direction.IN, withEdgesOfLabel))
{
if (allEdges)
sb.append("\n ").append(indent).append(" <-- ").append(edge.getLabel()).append(" --> ");
vertexAsString(edge.getVertex(Direction.OUT), depth - 1, withEdgesOfLabel, sb, atLevel + 1, visitedIDs);
}
}
if (hasProps || hasEdges)
sb.append('\n').append(indent);
sb.append("}\n");
}
}