From a654a607ecea85b6e928b87e0fcf7924b1c6f9f2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=B6ren=20Henning?= <stu114708@informatik.uni-kiel.de>
Date: Mon, 30 Nov 2015 17:16:21 +0100
Subject: [PATCH] Update graph labels

---
 .../AbstractTraceToGraphTransformer.java      | 27 ++++++
 .../AggrTraceToGraphTransformer.java          | 27 +++++-
 .../traversal/AggrTraceTraverserStage.java    |  2 +-
 .../traversal/TraceToGraphTransformer.java    | 27 +++++-
 .../trace/traversal/TraceTraverserStage.java  |  2 +-
 .../java/kieker/analysis/util/Mapper.java     | 83 +++++++++++++++++++
 .../kieker/analysis/util/NameConverter.java   | 60 ++++++++++++++
 7 files changed, 220 insertions(+), 8 deletions(-)
 create mode 100644 src/main/java/kieker/analysis/util/Mapper.java
 create mode 100644 src/main/java/kieker/analysis/util/NameConverter.java

diff --git a/src/main/java/kieker/analysis/trace/traversal/AbstractTraceToGraphTransformer.java b/src/main/java/kieker/analysis/trace/traversal/AbstractTraceToGraphTransformer.java
index c13ec790..d7cec93d 100644
--- a/src/main/java/kieker/analysis/trace/traversal/AbstractTraceToGraphTransformer.java
+++ b/src/main/java/kieker/analysis/trace/traversal/AbstractTraceToGraphTransformer.java
@@ -10,13 +10,22 @@ import kieker.analysis.traceanalysisdomain.AbstractOperationCall;
 public abstract class AbstractTraceToGraphTransformer<C extends AbstractOperationCall<C>> extends OperationCallVisitor<C> {
 
 	protected final Graph graph;
+	private final C rootOperationCall;
 
 	public AbstractTraceToGraphTransformer() {
+		this(null);
+	}
+
+	public AbstractTraceToGraphTransformer(final C rootOperartionCall) {
 		super();
 		this.graph = new TinkerGraph();
+		this.rootOperationCall = rootOperartionCall;
 	}
 
 	public Graph getGraph() {
+
+		addRootVertex();
+
 		return graph;
 	}
 
@@ -31,6 +40,24 @@ public abstract class AbstractTraceToGraphTransformer<C extends AbstractOperatio
 
 	}
 
+	private void addRootVertex() {
+
+		if (rootOperationCall == null) {
+			return;
+		}
+
+		final Vertex realRootVertex = graph.getVertex(rootOperationCall.hashCode());
+
+		if (realRootVertex == null) {
+			return;
+		}
+
+		final Vertex rootVertex = graph.addVertex("Entry");
+		rootVertex.setProperty("label", "'Entry'");
+		graph.addEdge(null, rootVertex, realRootVertex, "1.");
+
+	}
+
 	protected abstract Vertex addVertex(C operationCall);
 
 	protected abstract Edge addEdge(C operationCall, C parentOperationCall);
diff --git a/src/main/java/kieker/analysis/trace/traversal/AggrTraceToGraphTransformer.java b/src/main/java/kieker/analysis/trace/traversal/AggrTraceToGraphTransformer.java
index ccd3a8a7..2dab2aef 100644
--- a/src/main/java/kieker/analysis/trace/traversal/AggrTraceToGraphTransformer.java
+++ b/src/main/java/kieker/analysis/trace/traversal/AggrTraceToGraphTransformer.java
@@ -4,15 +4,37 @@ import com.tinkerpop.blueprints.Edge;
 import com.tinkerpop.blueprints.Vertex;
 
 import kieker.analysis.traceanalysisdomain.AggregatedOperationCall;
+import kieker.analysis.util.NameConverter;
 
 public class AggrTraceToGraphTransformer extends AbstractTraceToGraphTransformer<AggregatedOperationCall> {
 
+	public AggrTraceToGraphTransformer() {
+		super();
+	}
+
+	public AggrTraceToGraphTransformer(final AggregatedOperationCall rootOperartionCall) {
+		super(rootOperartionCall);
+	}
+
 	@Override
 	protected Vertex addVertex(final AggregatedOperationCall operationCall) {
 
 		Vertex vertex = graph.addVertex(operationCall.hashCode());
 
-		vertex.setProperty("label", operationCall.getOperation());
+		String name = operationCall.getOperation();
+		String stackDepth = String.valueOf(operationCall.getStackDepth() + 1);
+		String component = operationCall.getComponent();
+		String container = operationCall.getContainer();
+
+		Boolean shortNames = true; // TODO hard coded
+
+		if (shortNames) {
+			name = NameConverter.toShortOperationName(name);
+		}
+
+		String label = container + "::\\n" + "@" + stackDepth + ":" + component + "\\n" + name;
+
+		vertex.setProperty("label", label);
 
 		return vertex;
 	}
@@ -27,8 +49,7 @@ public class AggrTraceToGraphTransformer extends AbstractTraceToGraphTransformer
 			return null;
 		}
 
-		// TODO Add label
-		return graph.addEdge(null, parentVertex, thisVertex, String.valueOf(operationCall.getOrderIndex()) + '.');
+		return graph.addEdge(null, parentVertex, thisVertex, String.valueOf(operationCall.getOrderIndex() + 1) + '.');
 	}
 
 }
diff --git a/src/main/java/kieker/analysis/trace/traversal/AggrTraceTraverserStage.java b/src/main/java/kieker/analysis/trace/traversal/AggrTraceTraverserStage.java
index f81a1910..067290d9 100644
--- a/src/main/java/kieker/analysis/trace/traversal/AggrTraceTraverserStage.java
+++ b/src/main/java/kieker/analysis/trace/traversal/AggrTraceTraverserStage.java
@@ -10,7 +10,7 @@ public class AggrTraceTraverserStage extends AbstractTransformation<AggregatedTr
 	@Override
 	protected void execute(final AggregatedTrace trace) {
 
-		AggrTraceToGraphTransformer aggrTrace2Blueprint = new AggrTraceToGraphTransformer();
+		AggrTraceToGraphTransformer aggrTrace2Blueprint = new AggrTraceToGraphTransformer(trace.getRootOperationCall());
 
 		TraceTraverser<AggregatedTrace, AggregatedOperationCall> traverser = new TraceTraverser<>(aggrTrace2Blueprint);
 
diff --git a/src/main/java/kieker/analysis/trace/traversal/TraceToGraphTransformer.java b/src/main/java/kieker/analysis/trace/traversal/TraceToGraphTransformer.java
index 279728c3..cde5155b 100644
--- a/src/main/java/kieker/analysis/trace/traversal/TraceToGraphTransformer.java
+++ b/src/main/java/kieker/analysis/trace/traversal/TraceToGraphTransformer.java
@@ -4,14 +4,36 @@ import com.tinkerpop.blueprints.Edge;
 import com.tinkerpop.blueprints.Vertex;
 
 import kieker.analysis.traceanalysisdomain.OperationCall;
+import kieker.analysis.util.NameConverter;
 
 public class TraceToGraphTransformer extends AbstractTraceToGraphTransformer<OperationCall> {
 
+	public TraceToGraphTransformer() {
+		super();
+	}
+
+	public TraceToGraphTransformer(final OperationCall rootOperartionCall) {
+		super(rootOperartionCall);
+	}
+
 	@Override
 	protected Vertex addVertex(final OperationCall operationCall) {
 		Vertex vertex = graph.addVertex(operationCall.hashCode());
 
-		vertex.setProperty("label", operationCall.getOperation());
+		String name = operationCall.getOperation();
+		String stackDepth = String.valueOf(operationCall.getStackDepth() + 1);
+		String component = operationCall.getComponent();
+		String container = operationCall.getContainer();
+
+		Boolean shortNames = true; // TODO hard coded
+
+		if (shortNames) {
+			name = NameConverter.toShortOperationName(name);
+		}
+
+		String label = container + "::\\n" + "@" + stackDepth + ":" + component + "\\n" + name;
+
+		vertex.setProperty("label", label);
 
 		return vertex;
 	}
@@ -26,8 +48,7 @@ public class TraceToGraphTransformer extends AbstractTraceToGraphTransformer<Ope
 			return null;
 		}
 
-		// TODO Add label
-		return graph.addEdge(null, parentVertex, thisVertex, String.valueOf(operationCall.getOrderIndex()) + '.');
+		return graph.addEdge(null, parentVertex, thisVertex, String.valueOf(operationCall.getOrderIndex() + 1) + '.');
 	}
 
 }
diff --git a/src/main/java/kieker/analysis/trace/traversal/TraceTraverserStage.java b/src/main/java/kieker/analysis/trace/traversal/TraceTraverserStage.java
index c8915f2f..67129df7 100644
--- a/src/main/java/kieker/analysis/trace/traversal/TraceTraverserStage.java
+++ b/src/main/java/kieker/analysis/trace/traversal/TraceTraverserStage.java
@@ -10,7 +10,7 @@ public class TraceTraverserStage extends AbstractTransformation<Trace, NamedGrap
 	@Override
 	protected void execute(final Trace trace) {
 
-		TraceToGraphTransformer traceToGraph = new TraceToGraphTransformer();
+		TraceToGraphTransformer traceToGraph = new TraceToGraphTransformer(trace.getRootOperationCall());
 
 		TraceTraverser<Trace, OperationCall> traverser = new TraceTraverser<>(traceToGraph);
 
diff --git a/src/main/java/kieker/analysis/util/Mapper.java b/src/main/java/kieker/analysis/util/Mapper.java
new file mode 100644
index 00000000..989c1b89
--- /dev/null
+++ b/src/main/java/kieker/analysis/util/Mapper.java
@@ -0,0 +1,83 @@
+/***************************************************************************
+ * Copyright 2015 Kieker Project (http://kieker-monitoring.net)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ***************************************************************************/
+
+package kieker.analysis.util;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author Nils Christian Ehmke
+ *
+ * @param <I>
+ *            The type of the keys.
+ * @param <O>
+ *            The type of the values.
+ */
+public final class Mapper<I, O> extends HashMap<I, O> {
+
+	private static final long serialVersionUID = 1L;
+	private O defaultValue;
+
+	public To map(final I key) {
+		return new To(key);
+	}
+
+	public To mapPerDefault() {
+		return new To();
+	}
+
+	public O resolve(final I key) {
+		if (super.containsKey(key)) {
+			return super.get(key);
+		} else {
+			return this.defaultValue;
+		}
+	}
+
+	public I invertedResolve(final O value) {
+		return super.entrySet().parallelStream().filter(entry -> value.equals(entry.getValue())).map(Map.Entry::getKey).findFirst().orElse(null);
+	}
+
+	/**
+	 * @author Nils Christian Ehmke
+	 */
+	public final class To {
+
+		private final I key;
+		private final boolean keyAvailable;
+
+		protected To(final I key) {
+			this.key = key;
+			this.keyAvailable = true;
+		}
+
+		protected To() {
+			this.key = null;
+			this.keyAvailable = false;
+		}
+
+		public void to(final O value) {
+			if (this.keyAvailable) {
+				Mapper.super.put(this.key, value);
+			} else {
+				Mapper.this.defaultValue = value;
+			}
+		}
+
+	}
+
+}
diff --git a/src/main/java/kieker/analysis/util/NameConverter.java b/src/main/java/kieker/analysis/util/NameConverter.java
new file mode 100644
index 00000000..7036075e
--- /dev/null
+++ b/src/main/java/kieker/analysis/util/NameConverter.java
@@ -0,0 +1,60 @@
+/***************************************************************************
+ * Copyright 2015 Kieker Project (http://kieker-monitoring.net)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ***************************************************************************/
+
+package kieker.analysis.util;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author Nils Christian Ehmke
+ */
+public final class NameConverter {
+
+	private static Mapper<TimeUnit, String> shortTimeUnitMapper = new Mapper<>();
+
+	private NameConverter() {}
+
+	static {
+		initializeMapper();
+	}
+
+	private static void initializeMapper() {
+		NameConverter.shortTimeUnitMapper.map(TimeUnit.NANOSECONDS).to("ns");
+		NameConverter.shortTimeUnitMapper.map(TimeUnit.MICROSECONDS).to("us");
+		NameConverter.shortTimeUnitMapper.map(TimeUnit.MILLISECONDS).to("ms");
+		NameConverter.shortTimeUnitMapper.map(TimeUnit.SECONDS).to("s");
+		NameConverter.shortTimeUnitMapper.map(TimeUnit.MINUTES).to("m");
+		NameConverter.shortTimeUnitMapper.map(TimeUnit.HOURS).to("h");
+		NameConverter.shortTimeUnitMapper.map(TimeUnit.DAYS).to("d");
+		NameConverter.shortTimeUnitMapper.mapPerDefault().to("");
+	}
+
+	public static String toShortTimeUnit(final TimeUnit timeUnit) {
+		return NameConverter.shortTimeUnitMapper.resolve(timeUnit);
+	}
+
+	public static String toShortComponentName(final String componentName) {
+		final int lastPointPos = componentName.lastIndexOf('.');
+		return componentName.substring(lastPointPos + 1);
+	}
+
+	public static String toShortOperationName(final String operationName) {
+		final String result = operationName.replaceAll("\\(.*\\)", "(...)");
+		final int lastPointPos = result.lastIndexOf('.', result.length() - 5);
+		return result.substring(lastPointPos + 1);
+	}
+
+}
-- 
GitLab