From dc86a0b13b46dc7d12892db75c17c353165708f2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=B6ren=20Henning?= <stu114708@informatik.uni-kiel.de>
Date: Wed, 25 Nov 2015 14:55:42 +0100
Subject: [PATCH] Finish work on DotBuilder

---
 .../java/kieker/analysis/util/DotBuilder.java | 53 +++++++++++++++----
 1 file changed, 43 insertions(+), 10 deletions(-)

diff --git a/src/main/java/kieker/analysis/util/DotBuilder.java b/src/main/java/kieker/analysis/util/DotBuilder.java
index c4c50f1e..e277d2a8 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;
+	}
+
 }
-- 
GitLab