From b380df29d8c015ab3f800522c0cc0acc7a66ec6b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=B6ren=20Henning?= <stu114708@informatik.uni-kiel.de>
Date: Thu, 25 Feb 2016 11:01:30 +0100
Subject: [PATCH] add graph exporter

---
 .../analysis/graph/BlueprintsExporter.java    | 58 -------------------
 .../java/kieker/analysis/graph/Graph.java     |  4 ++
 .../kieker/analysis/graph/GraphTester.java    |  7 ++-
 .../graph/export/AbstractExporter.java        | 33 +++++++++++
 .../graph/export/BlueprintsExporter.java      | 53 +++++++++++++++++
 .../analysis/graph/export/DotExporter.java    | 38 ++++++++++++
 .../analysis/graph/export/Exporter.java       | 10 ++++
 .../kieker/analysis/graph/impl/GraphImpl.java | 12 ++++
 8 files changed, 156 insertions(+), 59 deletions(-)
 delete mode 100644 src/main/java/kieker/analysis/graph/BlueprintsExporter.java
 create mode 100644 src/main/java/kieker/analysis/graph/export/AbstractExporter.java
 create mode 100644 src/main/java/kieker/analysis/graph/export/BlueprintsExporter.java
 create mode 100644 src/main/java/kieker/analysis/graph/export/DotExporter.java
 create mode 100644 src/main/java/kieker/analysis/graph/export/Exporter.java

diff --git a/src/main/java/kieker/analysis/graph/BlueprintsExporter.java b/src/main/java/kieker/analysis/graph/BlueprintsExporter.java
deleted file mode 100644
index 76298500..00000000
--- a/src/main/java/kieker/analysis/graph/BlueprintsExporter.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package kieker.analysis.graph;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import com.tinkerpop.blueprints.impls.tg.TinkerGraph;
-
-public class BlueprintsExporter {
-
-	private final Graph graph;
-	private final com.tinkerpop.blueprints.Graph exportGraph = new TinkerGraph();
-	private final Map<Vertex, com.tinkerpop.blueprints.Vertex> mappedVertices = new HashMap<>();
-
-	private static final String LABEL_PROPERTY = "label";
-
-	public BlueprintsExporter(final Graph graph) {
-		this.graph = graph;
-	}
-
-	public com.tinkerpop.blueprints.Graph exportGraph() {
-
-		mapVertices();
-		mapEdges();
-
-		return exportGraph;
-
-	}
-
-	private void mapVertices() {
-
-		for (final Vertex vertex : graph.getVertices()) {
-			com.tinkerpop.blueprints.Vertex mappedVertex = exportGraph.addVertex(vertex.getId());
-			mappedVertices.put(vertex, mappedVertex);
-			for (final String propertyKey : vertex.getPropertyKeys()) {
-				mappedVertex.setProperty(propertyKey, vertex.getProperty(propertyKey));
-			}
-		}
-
-	}
-
-	private void mapEdges() {
-
-		for (final Edge edge : graph.getEdges()) {
-			final com.tinkerpop.blueprints.Vertex mappedInVertex = mappedVertices.get(edge.getVertex(Direction.IN));
-			final com.tinkerpop.blueprints.Vertex mappedOutVertex = mappedVertices.get(edge.getVertex(Direction.OUT));
-			String label = edge.getProperty(LABEL_PROPERTY);
-			if (label == null) {
-				label = "";
-			}
-			com.tinkerpop.blueprints.Edge mappedEdge = exportGraph.addEdge(edge.getId(), mappedOutVertex, mappedInVertex, label);
-			for (final String propertyKey : edge.getPropertyKeys()) {
-				mappedEdge.setProperty(propertyKey, edge.getProperty(propertyKey));
-			}
-		}
-
-	}
-
-}
diff --git a/src/main/java/kieker/analysis/graph/Graph.java b/src/main/java/kieker/analysis/graph/Graph.java
index d2c9a59e..36593bf6 100644
--- a/src/main/java/kieker/analysis/graph/Graph.java
+++ b/src/main/java/kieker/analysis/graph/Graph.java
@@ -2,6 +2,10 @@ package kieker.analysis.graph;
 
 public interface Graph {
 
+	public String getName();
+
+	public void setName(String name);
+
 	public Vertex addVertex(Object id);
 
 	public Vertex getVertex(Object id);
diff --git a/src/main/java/kieker/analysis/graph/GraphTester.java b/src/main/java/kieker/analysis/graph/GraphTester.java
index b325c87b..6015525c 100644
--- a/src/main/java/kieker/analysis/graph/GraphTester.java
+++ b/src/main/java/kieker/analysis/graph/GraphTester.java
@@ -1,5 +1,7 @@
 package kieker.analysis.graph;
 
+import kieker.analysis.graph.export.BlueprintsExporter;
+import kieker.analysis.graph.export.DotExporter;
 import kieker.analysis.graph.impl.GraphImpl;
 
 public class GraphTester {
@@ -77,7 +79,10 @@ public class GraphTester {
 
 		// Export to Blueprints
 		BlueprintsExporter blueprintsExporter = new BlueprintsExporter(graph);
-		System.out.println(blueprintsExporter.exportGraph());
+		System.out.println(blueprintsExporter.export());
+
+		DotExporter dotExporter = new DotExporter(graph);
+		System.out.println(dotExporter.export());
 
 	}
 
diff --git a/src/main/java/kieker/analysis/graph/export/AbstractExporter.java b/src/main/java/kieker/analysis/graph/export/AbstractExporter.java
new file mode 100644
index 00000000..05cc3b13
--- /dev/null
+++ b/src/main/java/kieker/analysis/graph/export/AbstractExporter.java
@@ -0,0 +1,33 @@
+package kieker.analysis.graph.export;
+
+import kieker.analysis.graph.Edge;
+import kieker.analysis.graph.Graph;
+import kieker.analysis.graph.Vertex;
+
+public abstract class AbstractExporter<O> {
+
+	protected Graph graph;
+
+	public AbstractExporter(final Graph graph) {
+		this.graph = graph;
+	}
+
+	public final O export() {
+
+		for (final Vertex vertex : graph.getVertices()) {
+			mapVertex(vertex);
+		}
+
+		for (final Edge edge : graph.getEdges()) {
+			mapEdge(edge);
+		}
+
+		return getExport();
+	}
+
+	protected abstract void mapVertex(Vertex vertex);
+
+	protected abstract void mapEdge(Edge edge);
+
+	protected abstract O getExport();
+}
diff --git a/src/main/java/kieker/analysis/graph/export/BlueprintsExporter.java b/src/main/java/kieker/analysis/graph/export/BlueprintsExporter.java
new file mode 100644
index 00000000..710777f0
--- /dev/null
+++ b/src/main/java/kieker/analysis/graph/export/BlueprintsExporter.java
@@ -0,0 +1,53 @@
+package kieker.analysis.graph.export;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.tinkerpop.blueprints.impls.tg.TinkerGraph;
+
+import kieker.analysis.graph.Direction;
+import kieker.analysis.graph.Edge;
+import kieker.analysis.graph.Graph;
+import kieker.analysis.graph.Vertex;
+
+public class BlueprintsExporter extends AbstractExporter<com.tinkerpop.blueprints.Graph> {
+
+	private final com.tinkerpop.blueprints.Graph exportGraph = new TinkerGraph();
+	private final Map<Vertex, com.tinkerpop.blueprints.Vertex> mappedVertices = new HashMap<>();
+
+	private static final String LABEL_PROPERTY = "label";
+
+	public BlueprintsExporter(final Graph graph) {
+		super(graph);
+	}
+
+	@Override
+	protected void mapVertex(final Vertex vertex) {
+		com.tinkerpop.blueprints.Vertex mappedVertex = exportGraph.addVertex(vertex.getId());
+		mappedVertices.put(vertex, mappedVertex);
+		for (final String propertyKey : vertex.getPropertyKeys()) {
+			mappedVertex.setProperty(propertyKey, vertex.getProperty(propertyKey));
+		}
+
+	}
+
+	@Override
+	protected void mapEdge(final Edge edge) {
+		final com.tinkerpop.blueprints.Vertex mappedInVertex = mappedVertices.get(edge.getVertex(Direction.IN));
+		final com.tinkerpop.blueprints.Vertex mappedOutVertex = mappedVertices.get(edge.getVertex(Direction.OUT));
+		String label = edge.getProperty(LABEL_PROPERTY);
+		if (label == null) {
+			label = "";
+		}
+		com.tinkerpop.blueprints.Edge mappedEdge = exportGraph.addEdge(edge.getId(), mappedOutVertex, mappedInVertex, label);
+		for (final String propertyKey : edge.getPropertyKeys()) {
+			mappedEdge.setProperty(propertyKey, edge.getProperty(propertyKey));
+		}
+	}
+
+	@Override
+	protected com.tinkerpop.blueprints.Graph getExport() {
+		return exportGraph;
+	}
+
+}
diff --git a/src/main/java/kieker/analysis/graph/export/DotExporter.java b/src/main/java/kieker/analysis/graph/export/DotExporter.java
new file mode 100644
index 00000000..72eaee2a
--- /dev/null
+++ b/src/main/java/kieker/analysis/graph/export/DotExporter.java
@@ -0,0 +1,38 @@
+package kieker.analysis.graph.export;
+
+import kieker.analysis.graph.Direction;
+import kieker.analysis.graph.Edge;
+import kieker.analysis.graph.Graph;
+import kieker.analysis.graph.Vertex;
+import kieker.analysis.util.DotBuilder;
+
+public class DotExporter extends AbstractExporter<String> {
+
+	private final DotBuilder dotBuilder;
+
+	public DotExporter(final Graph graph) {
+		super(graph);
+		dotBuilder = new DotBuilder(graph.getName());
+	}
+
+	@Override
+	protected void mapVertex(final Vertex vertex) {
+		dotBuilder.addNode(vertex.getId().toString());
+		// TODO Add style, label, etc
+		// TODO Handle child graph
+	}
+
+	@Override
+	protected void mapEdge(final Edge edge) {
+		String sourceId = edge.getVertex(Direction.OUT).getId().toString();
+		String targetId = edge.getVertex(Direction.IN).getId().toString();
+		dotBuilder.addEdge(sourceId, targetId);
+		// TODO Add style, label, etc
+	}
+
+	@Override
+	protected String getExport() {
+		return dotBuilder.get();
+	}
+
+}
diff --git a/src/main/java/kieker/analysis/graph/export/Exporter.java b/src/main/java/kieker/analysis/graph/export/Exporter.java
new file mode 100644
index 00000000..7acabe6c
--- /dev/null
+++ b/src/main/java/kieker/analysis/graph/export/Exporter.java
@@ -0,0 +1,10 @@
+package kieker.analysis.graph.export;
+
+import kieker.analysis.graph.Graph;
+
+//TODO maybe no interface required
+public interface Exporter<O> {
+
+	public O export(Graph graph);
+
+}
diff --git a/src/main/java/kieker/analysis/graph/impl/GraphImpl.java b/src/main/java/kieker/analysis/graph/impl/GraphImpl.java
index 9848b4d4..2dc03d57 100644
--- a/src/main/java/kieker/analysis/graph/impl/GraphImpl.java
+++ b/src/main/java/kieker/analysis/graph/impl/GraphImpl.java
@@ -11,6 +11,8 @@ import kieker.analysis.graph.Vertex;
 
 public class GraphImpl implements Graph {
 
+	protected String name = "G";
+
 	protected Map<String, Vertex> vertices = new HashMap<String, Vertex>();
 	protected Map<String, Edge> edges = new HashMap<String, Edge>();
 
@@ -126,4 +128,14 @@ public class GraphImpl implements Graph {
 		return idString;
 	}
 
+	@Override
+	public String getName() {
+		return this.name;
+	}
+
+	@Override
+	public void setName(final String name) {
+		this.name = name;
+	}
+
 }
-- 
GitLab