diff --git a/src/main/java/kieker/analysis/trace/traversal/AbstractTraceToGraphTransformer.java b/src/main/java/kieker/analysis/trace/traversal/AbstractTraceToGraphTransformer.java index c13ec79044435907082df76e7204e09d974a3dc2..d7cec93df3339caa1ab9d9a86624745d0425c2c2 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 ccd3a8a76ed8c79d854d8a3d29f97386b8b665c8..2dab2aefd67e53311d9848d71c985599c1414b46 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 f81a19104c4105b954118e12ddb2acc609359efa..067290d9beda5c466eb93c1f3a7198012bc7047b 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 279728c3dda16cdadd9dddc5fe6bcd8e0339c247..cde5155ba3ca256d33fcf897cd6488a409a8abe1 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 c8915f2fd524f2e5bd9cac428c091f3992a3e948..67129df73bc77682494550cce69dff2819e2dddd 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 0000000000000000000000000000000000000000..989c1b89441a87723cd53607799d0019046cec83 --- /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 0000000000000000000000000000000000000000..7036075e87acfbe5e3253c9ff919235a826ce9ad --- /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); + } + +}