From f48162f23aef692aea8d51e696bc06c3411374ee Mon Sep 17 00:00:00 2001
From: Nelson Tavares de Sousa <stu103017@mail.uni-kiel.de>
Date: Thu, 2 Jul 2015 13:24:14 +0200
Subject: [PATCH] avoids problems with nested stages

---
 .../framework/ConfigurationContext.java       | 22 +++++++++----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/src/main/java/teetime/framework/ConfigurationContext.java b/src/main/java/teetime/framework/ConfigurationContext.java
index 236f4c38..7d2edf22 100644
--- a/src/main/java/teetime/framework/ConfigurationContext.java
+++ b/src/main/java/teetime/framework/ConfigurationContext.java
@@ -33,7 +33,7 @@ public class ConfigurationContext {
 
 	private static final Logger LOGGER = LoggerFactory.getLogger(ConfigurationContext.class);
 
-	private final Map<Stage, String> threadableStages = new HashMap<Stage, String>();
+	private Map<Stage, String> threadableStages = new HashMap<Stage, String>();
 
 	ConfigurationContext() {}
 
@@ -63,21 +63,21 @@ public class ConfigurationContext {
 			LOGGER.warn("Overwriting existing pipe while connecting stages " +
 					sourcePort.getOwningStage().getId() + " and " + targetPort.getOwningStage().getId() + ".");
 		}
-		mergeContexts(sourcePort.getOwningStage(), targetPort.getOwningStage());
+		mergeContexts(sourcePort.getOwningStage());
+		mergeContexts(targetPort.getOwningStage());
 		new InstantiationPipe(sourcePort, targetPort, capacity);
 	}
 
-	final void mergeContexts(final Stage sourceStage, final Stage targetStage) {
-		if (!sourceStage.owningContext.equals(EmptyContext.getInstance())) {
-			this.threadableStages.putAll(sourceStage.owningContext.threadableStages);
-		} else {
-			sourceStage.owningContext = this;
-		}
-		if (!targetStage.owningContext.equals(EmptyContext.getInstance())) {
-			this.threadableStages.putAll(targetStage.owningContext.threadableStages);
+	final void mergeContexts(final Stage stage) {
+		if (!stage.owningContext.equals(EmptyContext.getInstance())) {
+			if (stage.owningContext != this) { // Performance
+				this.threadableStages.putAll(stage.owningContext.threadableStages);
+				stage.owningContext.threadableStages = this.threadableStages;
+			}
 		} else {
-			targetStage.owningContext = this;
+			stage.owningContext = this;
 		}
+
 	}
 
 }
-- 
GitLab