diff --git a/src/main/java/kieker/analysis/util/DotBuilder.java b/src/main/java/kieker/analysis/util/DotBuilder.java new file mode 100644 index 0000000000000000000000000000000000000000..c4c50f1ee2c03fdff18efab9d2d72fd969c8ae37 --- /dev/null +++ b/src/main/java/kieker/analysis/util/DotBuilder.java @@ -0,0 +1,96 @@ +package kieker.analysis.util; + +import java.util.HashMap; +import java.util.Map; + +import com.google.common.base.Joiner; + +public class DotBuilder { + + private final String start; + private final String end = "}"; + private final StringBuilder body = new StringBuilder(); + + private Map<String, String> defaultNodeProperties; + private Map<String, String> defaultEdgeProperties; + private Map<String, String> defaultProperties; + + /* + * TODO: Use default properties + */ + + public DotBuilder() { + this("G"); + } + + public DotBuilder(final String name) { + start = "digraph " + name + " {"; + } + + public DotBuilder(final String name, final Map<String, String> defaultNodeProperties, final Map<String, String> defaultEdgeProperties) { + this(name); + this.defaultNodeProperties = defaultNodeProperties; + this.defaultEdgeProperties = defaultEdgeProperties; + } + + public DotBuilder(final String name, final Map<String, String> defaultNodeProperties, final Map<String, String> defaultEdgeProperties, + final Map<String, String> defaultProperties) { + this(name, defaultNodeProperties, defaultEdgeProperties); + this.defaultProperties = defaultProperties; + } + + public void setDefaultNodeProperties(final Map<String, String> defaultNodeProperties) { + this.defaultNodeProperties = defaultNodeProperties; + } + + public void setDefaultEdgeProperties(final Map<String, String> defaultEdgeProperties) { + this.defaultEdgeProperties = defaultEdgeProperties; + } + + public void setDefaultProperties(final Map<String, String> defaultProperties) { + this.defaultProperties = defaultProperties; + } + + public String get() { + return start + body.toString() + end; + } + + public void addNode(final String id) { + addNode(id, new HashMap<>()); + } + + public void addNode(final String id, final String label) { + Map<String, String> properties = new HashMap<String, String>(); + properties.put("label", label); + addNode(id, properties); + } + + public void addNode(final String id, final Map<String, String> properties) { + addElement('"' + id + '"', properties); + } + + public void addEdge(final String from, final String to) { + addEdge(from, to, new HashMap<>()); + } + + public void addEdge(final String from, final String to, final String label) { + Map<String, String> properties = new HashMap<String, String>(); + properties.put("label", label); + addEdge(from, to, properties); + } + + public void addEdge(final String from, final String to, final Map<String, String> properties) { + addElement('"' + from + '"' + " -> " + '"' + to + '"', properties); + } + + private void addElement(final String element, final Map<String, String> properties) { + body.append(element); + if (properties != null && !properties.isEmpty()) { + body.append('['); + Joiner.on(", ").withKeyValueSeparator("=").appendTo(body, properties); + body.append(']'); + } + body.append('\n'); + } + +}