From b2c6b624ba5b02d7df9fdde20c96d6f355559827 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6ren=20Henning?= <stu114708@informatik.uni-kiel.de> Date: Mon, 4 Apr 2016 11:35:11 +0200 Subject: [PATCH] worked on graph exporting --- .../kieker/analysis/graph/GraphElement.java | 8 ++ .../graph/export/dot/DotElementExporter.java | 116 ++++++++++++++++++ .../graph/export/dot/DotElementWriter.java | 76 ------------ .../export/dot/DotExportPropertyTokens.java | 9 ++ .../graph/export/dot/DotExporter.java | 37 ++++-- .../analysis/graph/export/dot/DotWriter.java | 34 ----- .../graph/export/dot/GraphTransformer.java | 66 ---------- .../graph/export/graphml/GraphMLExporter.java | 1 + .../java/kieker/analysis/util/DotBuilder.java | 2 +- 9 files changed, 161 insertions(+), 188 deletions(-) create mode 100644 src/main/java/kieker/analysis/graph/GraphElement.java create mode 100644 src/main/java/kieker/analysis/graph/export/dot/DotElementExporter.java delete mode 100644 src/main/java/kieker/analysis/graph/export/dot/DotElementWriter.java create mode 100644 src/main/java/kieker/analysis/graph/export/dot/DotExportPropertyTokens.java delete mode 100644 src/main/java/kieker/analysis/graph/export/dot/DotWriter.java delete mode 100644 src/main/java/kieker/analysis/graph/export/dot/GraphTransformer.java diff --git a/src/main/java/kieker/analysis/graph/GraphElement.java b/src/main/java/kieker/analysis/graph/GraphElement.java new file mode 100644 index 00000000..58a91e1c --- /dev/null +++ b/src/main/java/kieker/analysis/graph/GraphElement.java @@ -0,0 +1,8 @@ +package kieker.analysis.graph; + +public abstract interface GraphElement extends Element { + + public void remove(); + + public Object getId(); +} diff --git a/src/main/java/kieker/analysis/graph/export/dot/DotElementExporter.java b/src/main/java/kieker/analysis/graph/export/dot/DotElementExporter.java new file mode 100644 index 00000000..6355b474 --- /dev/null +++ b/src/main/java/kieker/analysis/graph/export/dot/DotElementExporter.java @@ -0,0 +1,116 @@ +package kieker.analysis.graph.export.dot; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import kieker.analysis.graph.Direction; +import kieker.analysis.graph.Edge; +import kieker.analysis.graph.Element; +import kieker.analysis.graph.Graph; +import kieker.analysis.graph.Vertex; +import kieker.analysis.graph.export.AbstractTransformer; +import kieker.analysis.graph.util.dot.DotGraphWriter; + +class DotElementExporter extends AbstractTransformer<Void> { + + protected final DotGraphWriter dotGraphWriter; + + protected DotElementExporter(final Graph graph, final DotGraphWriter dotGraphWriter) { + super(graph); + this.dotGraphWriter = dotGraphWriter; + } + + @Override + protected void transformVertex(final Vertex vertex) { + try { + if (vertex.hasChildGraph()) { + Graph childGraph = vertex.getChildGraph(); + + dotGraphWriter.addClusterStart(childGraph.getName()); + + Map<String, String> attributes = transformProperties(vertex); + attributes.putAll(transformProperties(childGraph)); + for (Entry<String, String> attribute : attributes.entrySet()) { + dotGraphWriter.addGraphAttribute(attribute.getKey(), attribute.getValue()); + } + + transformDefaultElementProperties(childGraph); + + DotElementExporter childGraphWriter = new DotElementExporter(childGraph, dotGraphWriter); + childGraphWriter.transform(); + + dotGraphWriter.addClusterStop(); + } else { + dotGraphWriter.addNode(vertex.getId().toString(), transformProperties(vertex)); + } + } catch (IOException e) { + handleIOException(e); + } + } + + @Override + protected void transformEdge(final Edge edge) { + try { + final String sourceId = edge.getVertex(Direction.OUT).getId().toString(); + final String targetId = edge.getVertex(Direction.IN).getId().toString(); + dotGraphWriter.addEdge(sourceId, targetId, transformProperties(edge)); + } catch (IOException e) { + handleIOException(e); + } + + } + + protected void transformDefaultElementProperties(final Graph graph) throws IOException { + final Object defaultNodeProperties = graph.getProperty(DotExportPropertyTokens.DEFAULT_NODE_PROPERTIES); + if (defaultNodeProperties instanceof Map) { + @SuppressWarnings("unchecked") + Map<String, String> defaultNodeAttributes = (Map<String, String>) defaultNodeProperties; + dotGraphWriter.addDefaultNodeAttributes(defaultNodeAttributes); + } + final Object defaultEdgeProperties = graph.getProperty(DotExportPropertyTokens.DEFAULT_EDGE_PROPERTIES); + if (defaultEdgeProperties instanceof Map) { + @SuppressWarnings("unchecked") + Map<String, String> defaultEdgeAttributes = (Map<String, String>) defaultEdgeProperties; + dotGraphWriter.addDefaultEdgeAttributes(defaultEdgeAttributes); + } + } + + protected void handleIOException(final IOException ioException) { + throw new IllegalStateException(ioException); + } + + protected Map<String, String> transformProperties(final Element element) { + + final Set<String> propertyKeys = element.getPropertyKeys(); + final Map<String, String> properties = new HashMap<>(propertyKeys.size(), 1); + + for (final String propertyKey : propertyKeys) { + if (propertyKey.equals(DotExportPropertyTokens.DEFAULT_NODE_PROPERTIES) || propertyKey.equals(DotExportPropertyTokens.DEFAULT_EDGE_PROPERTIES)) { + break; + } + properties.put(propertyKey, element.getProperty(propertyKey).toString()); + } + + return properties; + } + + @Override + protected void beforeTransformation() { + // Do nothing + + } + + @Override + protected void afterTransformation() { + // Do nothing + } + + @Override + protected Void getTransformation() { + return null; + } + +} diff --git a/src/main/java/kieker/analysis/graph/export/dot/DotElementWriter.java b/src/main/java/kieker/analysis/graph/export/dot/DotElementWriter.java deleted file mode 100644 index 7488f647..00000000 --- a/src/main/java/kieker/analysis/graph/export/dot/DotElementWriter.java +++ /dev/null @@ -1,76 +0,0 @@ -package kieker.analysis.graph.export.dot; - -import java.io.IOException; - -import kieker.analysis.graph.Direction; -import kieker.analysis.graph.Edge; -import kieker.analysis.graph.Graph; -import kieker.analysis.graph.Vertex; -import kieker.analysis.graph.export.AbstractTransformer; -import kieker.analysis.graph.util.dot.DotGraphWriter; - -class DotElementWriter extends AbstractTransformer<Void> { - - protected final DotGraphWriter dotWriter; - - protected DotElementWriter(final Graph graph, final DotGraphWriter dotWriter) { - super(graph); - this.dotWriter = dotWriter; - } - - @Override - protected void transformVertex(final Vertex vertex) { - try { - if (vertex.hasChildGraph()) { - Graph childGraph = vertex.getChildGraph(); - - dotWriter.addClusterStart(childGraph.getName()); - // TODO more stuff - - DotElementWriter dotWriter2 = new DotElementWriter(childGraph, dotWriter); - dotWriter2.transform(); - - dotWriter.addClusterStop(); - } else { - - dotWriter.addNode(vertex.getId().toString(), null); // TODO - - } - } catch (IOException e) { - handleIOException(e); - } - } - - @Override - protected void transformEdge(final Edge edge) { - try { - String sourceId = edge.getVertex(Direction.OUT).getId().toString(); - String targetId = edge.getVertex(Direction.IN).getId().toString(); - dotWriter.addEdge(sourceId, targetId); // TODO - } catch (IOException e) { - handleIOException(e); - } - - } - - protected void handleIOException(final IOException ioException) { - // TODO Handle IO Exception - } - - @Override - protected void beforeTransformation() { - // Do nothing - - } - - @Override - protected void afterTransformation() { - // Do nothing - } - - @Override - protected Void getTransformation() { - return null; - } - -} diff --git a/src/main/java/kieker/analysis/graph/export/dot/DotExportPropertyTokens.java b/src/main/java/kieker/analysis/graph/export/dot/DotExportPropertyTokens.java new file mode 100644 index 00000000..240eb9a2 --- /dev/null +++ b/src/main/java/kieker/analysis/graph/export/dot/DotExportPropertyTokens.java @@ -0,0 +1,9 @@ +package kieker.analysis.graph.export.dot; + +public final class DotExportPropertyTokens { + + public static final String DEFAULT_NODE_PROPERTIES = "__DEFAULT_NODE_PROPERTIES"; + + public static final String DEFAULT_EDGE_PROPERTIES = "__DEFAULT_EDGE_PROPERTIES"; + +} diff --git a/src/main/java/kieker/analysis/graph/export/dot/DotExporter.java b/src/main/java/kieker/analysis/graph/export/dot/DotExporter.java index 17de4122..0260e6f3 100644 --- a/src/main/java/kieker/analysis/graph/export/dot/DotExporter.java +++ b/src/main/java/kieker/analysis/graph/export/dot/DotExporter.java @@ -1,22 +1,37 @@ package kieker.analysis.graph.export.dot; -import java.io.OutputStream; -import java.io.PrintWriter; +import java.io.IOException; +import java.io.Writer; import kieker.analysis.graph.Graph; +import kieker.analysis.graph.util.dot.DotGraphWriter; -public class DotExporter { +public class DotExporter extends DotElementExporter { - public void export(final Graph graph, final OutputStream outputStream) { - - GraphTransformer graphTransformer = new GraphTransformer(graph); - // TODO Receiving a dot object would be (maybe) better - String dotString = graphTransformer.transform(); + public DotExporter(final Graph graph, final Writer writer) { + super(graph, new DotGraphWriter(writer)); + } - PrintWriter printWriter = new PrintWriter(outputStream); - printWriter.write(dotString); - printWriter.close(); + @Override + protected void beforeTransformation() { + try { + dotGraphWriter.start(graph.getName()); + for (String attributeKey : graph.getPropertyKeys()) { + dotGraphWriter.addGraphAttribute(attributeKey, graph.getProperty(attributeKey)); + } + transformDefaultElementProperties(graph); + } catch (IOException e) { + handleIOException(e); + } + } + @Override + protected void afterTransformation() { + try { + dotGraphWriter.finish(); + } catch (IOException e) { + handleIOException(e); + } } } diff --git a/src/main/java/kieker/analysis/graph/export/dot/DotWriter.java b/src/main/java/kieker/analysis/graph/export/dot/DotWriter.java deleted file mode 100644 index 40c0d4e1..00000000 --- a/src/main/java/kieker/analysis/graph/export/dot/DotWriter.java +++ /dev/null @@ -1,34 +0,0 @@ -package kieker.analysis.graph.export.dot; - -import java.io.IOException; -import java.io.Writer; - -import kieker.analysis.graph.Graph; -import kieker.analysis.graph.util.dot.DotGraphWriter; - -public class DotWriter extends DotElementWriter { - - public DotWriter(final Graph graph, final Writer writer) { - super(graph, new DotGraphWriter(writer)); - } - - @Override - protected void beforeTransformation() { - try { - dotWriter.start(graph.getName()); - // TODO more stuff - } catch (IOException e) { - handleIOException(e); - } - } - - @Override - protected void afterTransformation() { - try { - dotWriter.finish(); - } catch (IOException e) { - handleIOException(e); - } - } - -} diff --git a/src/main/java/kieker/analysis/graph/export/dot/GraphTransformer.java b/src/main/java/kieker/analysis/graph/export/dot/GraphTransformer.java deleted file mode 100644 index 2e08c20b..00000000 --- a/src/main/java/kieker/analysis/graph/export/dot/GraphTransformer.java +++ /dev/null @@ -1,66 +0,0 @@ -package kieker.analysis.graph.export.dot; - -import kieker.analysis.graph.Direction; -import kieker.analysis.graph.Edge; -import kieker.analysis.graph.Graph; -import kieker.analysis.graph.Vertex; -import kieker.analysis.graph.export.AbstractTransformer; -import kieker.analysis.util.DotBuilder; - -//TODO remove -public class GraphTransformer extends AbstractTransformer<String> { - - private final DotBuilder dotBuilder; - - public GraphTransformer(final Graph graph) { - super(graph); - dotBuilder = new DotBuilder(graph.getName()); - } - - public GraphTransformer(final Graph graph, final boolean isCluster) { - super(graph); - dotBuilder = new DotBuilder("cluster_" + graph.getName(), "subgraph"); - } - - @Override - protected void transformVertex(final Vertex vertex) { - if (vertex.hasChildGraph()) { - Graph childGraph = vertex.getChildGraph(); - GraphTransformer graphTransformer = new GraphTransformer(childGraph, false); - String childGraphString = graphTransformer.transform(); - dotBuilder.addSubgraph(childGraphString); - // TODO Add style, label, etc - } else { - dotBuilder.addNode(vertex.getId().toString()); - // TODO Add style, label, etc - } - - } - - @Override - protected void transformEdge(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 getTransformation() { - return dotBuilder.get(); - } - - @Override - protected void beforeTransformation() { - // TODO Auto-generated method stub - - } - - @Override - protected void afterTransformation() { - // TODO Auto-generated method stub - - } - -} diff --git a/src/main/java/kieker/analysis/graph/export/graphml/GraphMLExporter.java b/src/main/java/kieker/analysis/graph/export/graphml/GraphMLExporter.java index bd3ac7df..2e121c01 100644 --- a/src/main/java/kieker/analysis/graph/export/graphml/GraphMLExporter.java +++ b/src/main/java/kieker/analysis/graph/export/graphml/GraphMLExporter.java @@ -13,6 +13,7 @@ import org.graphdrawing.graphml.ObjectFactory; import kieker.analysis.graph.Graph; +//TODO remove public class GraphMLExporter { private static final Boolean FORMATTED_OUTPUT = Boolean.TRUE; diff --git a/src/main/java/kieker/analysis/util/DotBuilder.java b/src/main/java/kieker/analysis/util/DotBuilder.java index 22dd04b4..0f6bcd3c 100644 --- a/src/main/java/kieker/analysis/util/DotBuilder.java +++ b/src/main/java/kieker/analysis/util/DotBuilder.java @@ -9,7 +9,7 @@ import com.google.common.base.Joiner; /** * Simple class for building and representing dot graph files. * - * @deprecated use {@link DotGraphWriter.DotWriter} instead. + * @deprecated use {@link DotExporter.DotWriter} instead. * * @author Sören Henning * -- GitLab