From e5587c910718075c10313c6bbec6e10f8c76d59c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=B6ren=20Henning?= <stu114708@informatik.uni-kiel.de>
Date: Mon, 16 May 2016 22:48:01 +0200
Subject: [PATCH] added software system creation

---
 .../analysis/TraceAnalysisConfiguration.java  | 13 +++++++
 .../analysis/dev/DependencyCreator.java       | 25 +++++++++---
 ...e.java => SoftwareSystemCreatorStage.java} |  2 +-
 .../domain/systemdependency/Component.java    |  2 +-
 .../domain/systemdependency/Container.java    |  2 +-
 .../domain/systemdependency/Dependency.java   |  1 -
 .../domain/systemdependency/Operation.java    | 11 ++++++
 .../systemdependency/SoftwareSystem.java      | 39 ++++++++++++-------
 .../systemdependency/SystemEntitySet.java     |  1 +
 9 files changed, 73 insertions(+), 23 deletions(-)
 rename src/main/java/kieker/analysis/dev/{DependencyCreatorStage.java => SoftwareSystemCreatorStage.java} (87%)

diff --git a/src/main/java/kieker/analysis/TraceAnalysisConfiguration.java b/src/main/java/kieker/analysis/TraceAnalysisConfiguration.java
index 946ef33f..926355a1 100644
--- a/src/main/java/kieker/analysis/TraceAnalysisConfiguration.java
+++ b/src/main/java/kieker/analysis/TraceAnalysisConfiguration.java
@@ -5,8 +5,10 @@ package kieker.analysis;
 
 import java.io.File;
 
+import kieker.analysis.dev.SoftwareSystemCreatorStage;
 import kieker.analysis.domain.AggregatedTrace;
 import kieker.analysis.domain.Trace;
+import kieker.analysis.domain.systemdependency.SoftwareSystem;
 import kieker.analysis.stage.tracediagnosis.AllowedRecordsFilter;
 import kieker.analysis.stage.tracediagnosis.BeginEndOfMonitoringDetector;
 import kieker.analysis.stage.tracediagnosis.ReadingComposite;
@@ -19,6 +21,7 @@ import kieker.analysis.util.graph.Graph;
 import kieker.analysis.util.graph.export.graphml.GraphMLFileWriterStage;
 import kieker.common.record.IMonitoringRecord;
 
+import teetime.framework.AbstractConsumerStage;
 import teetime.framework.Configuration;
 import teetime.stage.MultipleInstanceOfFilter;
 import teetime.stage.basic.distributor.Distributor;
@@ -85,6 +88,16 @@ public class TraceAnalysisConfiguration extends Configuration {
 		super.connectPorts(graphDistributor2.getNewOutputPort(), graphMLFileWriterComposite2.getInputPort());
 		super.connectPorts(graphDistributor2.getNewOutputPort(), dotTraceGraphFileWriterStage2.getInputPort());
 
+		SoftwareSystemCreatorStage softwareSystemCreator = new SoftwareSystemCreatorStage();
+
+		super.connectPorts(aggregatedTraceDistributor.getNewOutputPort(), softwareSystemCreator.getInputPort());
+		super.connectPorts(softwareSystemCreator.getOutputPort(), new AbstractConsumerStage<SoftwareSystem>() {
+			@Override
+			protected void execute(final SoftwareSystem softwareSystem) {
+				System.out.println(softwareSystem);
+			}
+		}.getInputPort());
+
 		// DependencyCreatorStage dependencyCreatorStage = new DependencyCreatorStage();
 		// DependencyStatisticsDecoratorStage dependencyStatisticsDecoratorStage = new DependencyStatisticsDecoratorStage();
 		// super.connectPorts(aggregatedTraceDistributor.getNewOutputPort(), dependencyCreatorStage.getInputPort());
diff --git a/src/main/java/kieker/analysis/dev/DependencyCreator.java b/src/main/java/kieker/analysis/dev/DependencyCreator.java
index d22e2a39..f6b53f28 100644
--- a/src/main/java/kieker/analysis/dev/DependencyCreator.java
+++ b/src/main/java/kieker/analysis/dev/DependencyCreator.java
@@ -16,13 +16,28 @@ public class DependencyCreator extends OperationCallVisitor<AggregatedOperationC
 	}
 
 	@Override
-	public void visit(final AggregatedOperationCall operationCall) {
+	public void visit(final AggregatedOperationCall call) {
 
-		Container calleeContainer = softwareSystem.addContainer(operationCall.getContainer());
-		Component calleeComponent = calleeContainer.addComponent(operationCall.getComponent());
-		Operation calleeOperation = calleeComponent.addOperation(operationCall.getOperation());
+		Container calleeContainer = softwareSystem.addContainer(call.getContainer());
+		Component calleeComponent = calleeContainer.addComponent(call.getComponent());
+		Operation calleeOperation = calleeComponent.addOperation(call.getOperation());
 
-		// Jetzt die Dependencies eintragen
+		calleeOperation.getOperationCalls().addAll(call.getBaseOperationCalls());
+
+		final AggregatedOperationCall parentCall = call.getParent();
+		if (parentCall != null) {
+			Container callerContainer = softwareSystem.addContainer(call.getContainer());
+			Component callerComponent = callerContainer.addComponent(call.getComponent());
+			Operation callerOperation = callerComponent.addOperation(call.getOperation());
+
+			final int numberOfCalls = call.getCalls();
+
+			softwareSystem.addOperationDependency(callerOperation, calleeOperation).setCalls(numberOfCalls);
+			softwareSystem.addComponentDependency(callerComponent, calleeComponent).setCalls(numberOfCalls);
+			softwareSystem.addContainerDependency(callerContainer, calleeContainer).setCalls(numberOfCalls);
+
+			// TODO set failure calls
+		}
 	}
 
 	public SoftwareSystem getSoftwareSystem() {
diff --git a/src/main/java/kieker/analysis/dev/DependencyCreatorStage.java b/src/main/java/kieker/analysis/dev/SoftwareSystemCreatorStage.java
similarity index 87%
rename from src/main/java/kieker/analysis/dev/DependencyCreatorStage.java
rename to src/main/java/kieker/analysis/dev/SoftwareSystemCreatorStage.java
index 9e825d5d..f4ea474c 100644
--- a/src/main/java/kieker/analysis/dev/DependencyCreatorStage.java
+++ b/src/main/java/kieker/analysis/dev/SoftwareSystemCreatorStage.java
@@ -6,7 +6,7 @@ import kieker.analysis.trace.traversal.TraceTraverser;
 
 import teetime.stage.basic.AbstractTransformation;
 
-public class DependencyCreatorStage extends AbstractTransformation<AggregatedTrace, SoftwareSystem> {
+public class SoftwareSystemCreatorStage extends AbstractTransformation<AggregatedTrace, SoftwareSystem> {
 
 	private final SoftwareSystem softwareSystem = new SoftwareSystem();
 	private final DependencyCreator dependencyCreator = new DependencyCreator(softwareSystem);
diff --git a/src/main/java/kieker/analysis/domain/systemdependency/Component.java b/src/main/java/kieker/analysis/domain/systemdependency/Component.java
index f40c39a4..aa5b545a 100644
--- a/src/main/java/kieker/analysis/domain/systemdependency/Component.java
+++ b/src/main/java/kieker/analysis/domain/systemdependency/Component.java
@@ -23,7 +23,7 @@ public class Component extends SystemEntity {
 	}
 
 	public Operation addOperation(final String name) {
-		if (this.operations.containsKey(name)) {
+		if (!this.operations.containsKey(name)) {
 			this.operations.put(name, new Operation(name, this));
 		}
 		return this.operations.get(name);
diff --git a/src/main/java/kieker/analysis/domain/systemdependency/Container.java b/src/main/java/kieker/analysis/domain/systemdependency/Container.java
index e4607505..a41a678f 100644
--- a/src/main/java/kieker/analysis/domain/systemdependency/Container.java
+++ b/src/main/java/kieker/analysis/domain/systemdependency/Container.java
@@ -17,7 +17,7 @@ public class Container extends SystemEntity {
 	}
 
 	public Component addComponent(final String name) {
-		if (this.components.containsKey(name)) {
+		if (!this.components.containsKey(name)) {
 			this.components.put(name, new Component(name, this));
 		}
 		return this.components.get(name);
diff --git a/src/main/java/kieker/analysis/domain/systemdependency/Dependency.java b/src/main/java/kieker/analysis/domain/systemdependency/Dependency.java
index a3c7a9f6..4a3e43e0 100644
--- a/src/main/java/kieker/analysis/domain/systemdependency/Dependency.java
+++ b/src/main/java/kieker/analysis/domain/systemdependency/Dependency.java
@@ -9,7 +9,6 @@ public class Dependency<E extends SystemEntity> {
 	private int failuredCalls;
 
 	public Dependency(final E caller, final E callee) {
-		super();
 		this.caller = caller;
 		this.callee = callee;
 	}
diff --git a/src/main/java/kieker/analysis/domain/systemdependency/Operation.java b/src/main/java/kieker/analysis/domain/systemdependency/Operation.java
index af8c07eb..e1b4379f 100644
--- a/src/main/java/kieker/analysis/domain/systemdependency/Operation.java
+++ b/src/main/java/kieker/analysis/domain/systemdependency/Operation.java
@@ -1,9 +1,16 @@
 package kieker.analysis.domain.systemdependency;
 
+import java.util.ArrayList;
+import java.util.Collection;
+
+import kieker.analysis.domain.OperationCall;
+
 public class Operation extends SystemEntity {
 
 	private final Component component;
 
+	private final Collection<OperationCall> operationCalls = new ArrayList<>();
+
 	protected Operation(final String name, final Component component) {
 		super(name, component.getIdentifier() + ',' + name);
 		this.component = component;
@@ -13,4 +20,8 @@ public class Operation extends SystemEntity {
 		return component;
 	}
 
+	public Collection<OperationCall> getOperationCalls() {
+		return operationCalls;
+	}
+
 }
diff --git a/src/main/java/kieker/analysis/domain/systemdependency/SoftwareSystem.java b/src/main/java/kieker/analysis/domain/systemdependency/SoftwareSystem.java
index d647aab0..1c0ba9d6 100644
--- a/src/main/java/kieker/analysis/domain/systemdependency/SoftwareSystem.java
+++ b/src/main/java/kieker/analysis/domain/systemdependency/SoftwareSystem.java
@@ -1,6 +1,5 @@
 package kieker.analysis.domain.systemdependency;
 
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
@@ -9,9 +8,9 @@ public class SoftwareSystem {
 
 	private final Map<String, Container> containers = new HashMap<>();
 
-	private Collection<Dependency<Container>> containerDependencies = new ArrayList<>();
-	private Collection<Dependency<Component>> componentDependencies = new ArrayList<>();
-	private Collection<Dependency<Operation>> operationDependencies = new ArrayList<>();
+	private final Map<String, Dependency<Container>> containerDependencies = new HashMap<>();
+	private final Map<String, Dependency<Component>> componentDependencies = new HashMap<>();
+	private final Map<String, Dependency<Operation>> operationDependencies = new HashMap<>();
 
 	public SoftwareSystem() {}
 
@@ -20,34 +19,46 @@ public class SoftwareSystem {
 	}
 
 	public Container addContainer(final String name) {
-		if (this.containers.containsKey(name)) {
+		if (!this.containers.containsKey(name)) {
 			this.containers.put(name, new Container(name));
 		}
 		return this.containers.get(name);
 	}
 
 	public Collection<Dependency<Container>> getContainerDependencies() {
-		return containerDependencies;
+		return containerDependencies.values();
 	}
 
-	public void setContainerDependencies(final Collection<Dependency<Container>> containerDependencies) {
-		this.containerDependencies = containerDependencies;
+	public Dependency<Container> addContainerDependency(final Container caller, final Container callee) {
+		final String identifier = caller.getIdentifier() + "-" + callee.getIdentifier();
+		if (!this.containerDependencies.containsKey(identifier)) {
+			this.containerDependencies.put(identifier, new Dependency<Container>(caller, callee));
+		}
+		return this.containerDependencies.get(identifier);
 	}
 
 	public Collection<Dependency<Component>> getComponentDependencies() {
-		return componentDependencies;
+		return componentDependencies.values();
 	}
 
-	public void setComponentDependencies(final Collection<Dependency<Component>> componentDependencies) {
-		this.componentDependencies = componentDependencies;
+	public Dependency<Component> addComponentDependency(final Component caller, final Component callee) {
+		final String identifier = caller.getIdentifier() + "-" + callee.getIdentifier();
+		if (!this.componentDependencies.containsKey(identifier)) {
+			this.componentDependencies.put(identifier, new Dependency<Component>(caller, callee));
+		}
+		return this.componentDependencies.get(identifier);
 	}
 
 	public Collection<Dependency<Operation>> getOperationDependencies() {
-		return operationDependencies;
+		return operationDependencies.values();
 	}
 
-	public void setOperationDependencies(final Collection<Dependency<Operation>> operationDependencies) {
-		this.operationDependencies = operationDependencies;
+	public Dependency<Operation> addOperationDependency(final Operation caller, final Operation callee) {
+		final String identifier = caller.getIdentifier() + "-" + callee.getIdentifier();
+		if (!this.operationDependencies.containsKey(identifier)) {
+			this.operationDependencies.put(identifier, new Dependency<Operation>(caller, callee));
+		}
+		return this.operationDependencies.get(identifier);
 	}
 
 }
diff --git a/src/main/java/kieker/analysis/domain/systemdependency/SystemEntitySet.java b/src/main/java/kieker/analysis/domain/systemdependency/SystemEntitySet.java
index 1ffbcdcb..0d392c77 100644
--- a/src/main/java/kieker/analysis/domain/systemdependency/SystemEntitySet.java
+++ b/src/main/java/kieker/analysis/domain/systemdependency/SystemEntitySet.java
@@ -6,6 +6,7 @@ import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
 
+@Deprecated
 public class SystemEntitySet<E extends SystemEntity> implements Set<E> {
 
 	private final Map<String, E> entries;
-- 
GitLab