diff --git a/src/main/java/kieker/analysis/util/DotBuilder.java b/src/main/java/kieker/analysis/util/DotBuilder.java index c4c50f1ee2c03fdff18efab9d2d72fd969c8ae37..e277d2a8046e3a0055790bd599eddd6cca70eda4 100644 --- a/src/main/java/kieker/analysis/util/DotBuilder.java +++ b/src/main/java/kieker/analysis/util/DotBuilder.java @@ -2,9 +2,16 @@ package kieker.analysis.util; import java.util.HashMap; import java.util.Map; +import java.util.Map.Entry; import com.google.common.base.Joiner; +/** + * Simple class for building and representing dot graph files. + * + * @author Sören Henning + * + */ public class DotBuilder { private final String start; @@ -15,16 +22,12 @@ public class DotBuilder { 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 + " {"; + start = "digraph " + name + " {\n"; } public DotBuilder(final String name, final Map<String, String> defaultNodeProperties, final Map<String, String> defaultEdgeProperties) { @@ -55,6 +58,11 @@ public class DotBuilder { return start + body.toString() + end; } + @Override + public String toString() { + return get(); + } + public void addNode(final String id) { addNode(id, new HashMap<>()); } @@ -66,7 +74,7 @@ public class DotBuilder { } public void addNode(final String id, final Map<String, String> properties) { - addElement('"' + id + '"', properties); + addElement('"' + id + '"', extendNodeProperties(properties)); } public void addEdge(final String from, final String to) { @@ -80,17 +88,42 @@ public class DotBuilder { } public void addEdge(final String from, final String to, final Map<String, String> properties) { - addElement('"' + from + '"' + " -> " + '"' + to + '"', properties); + addElement('"' + from + '"' + " -> " + '"' + to + '"', extendEdgeProperties(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(" ["); + Joiner.on("\", ").withKeyValueSeparator("=\"").appendTo(body, properties); + body.append("\"]"); } body.append('\n'); } + private Map<String, String> extendNodeProperties(final Map<String, String> properties) { + return extendElementProperties(properties, defaultNodeProperties); + } + + private Map<String, String> extendEdgeProperties(final Map<String, String> properties) { + return extendElementProperties(properties, defaultEdgeProperties); + } + + private Map<String, String> extendElementProperties(final Map<String, String> properties, final Map<String, String> defaultElementProperties) { + + if (defaultElementProperties != null) { + for (Entry<String, String> property : defaultElementProperties.entrySet()) { + properties.putIfAbsent(property.getKey(), property.getValue()); + } + } + + if (defaultProperties != null) { + for (Entry<String, String> property : defaultProperties.entrySet()) { + properties.putIfAbsent(property.getKey(), property.getValue()); + } + } + + return properties; + } + }