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 0000000000000000000000000000000000000000..58a91e1cc7dabacbf9809e9e3e5c415773da8d56 --- /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 0000000000000000000000000000000000000000..6355b474dc9a601b633363734fbd7266a7495158 --- /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 7488f647a86da92844dbf12430a88e3bee018f86..0000000000000000000000000000000000000000 --- 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 0000000000000000000000000000000000000000..240eb9a27151fc8f6dacbd8e6a6e0aa830c52d05 --- /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 17de4122349ce83bab782e981baa4a34e369c0e5..0260e6f3c665ab9aa54bbecc6f1680e73d1dca34 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 40c0d4e1dc586be56b1db810d97b4117511cd0e8..0000000000000000000000000000000000000000 --- 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 2e08c20b899df5ee699686bf60248320f597cbe0..0000000000000000000000000000000000000000 --- 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 bd3ac7df7ddb433a6830eac34f6ef14bb8fbbf75..2e121c011cec9cc8ec0f35004085fc338845b782 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 22dd04b4ca32f91f976cf8c1dca60da0f114705b..0f6bcd3c1eaa990b6058b40afee016c1f0b4dbf8 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 *