From 625f26fdf0edbc002c3b33ac1588fb82905bd26f Mon Sep 17 00:00:00 2001
From: Nelson Tavares de Sousa <stu103017@mail.uni-kiel.de>
Date: Thu, 2 Jul 2015 12:58:24 +0200
Subject: [PATCH] #192 working prototype

---
 .../framework/AbstractCompositeStage.java        |  7 ++-----
 .../java/teetime/framework/Configuration.java    |  4 ----
 .../teetime/framework/ConfigurationContext.java  | 16 +++++++++++++++-
 .../java/teetime/framework/EmptyContext.java     | 15 +++++++++++++++
 src/main/java/teetime/framework/Stage.java       |  2 ++
 .../java/teetime/stage/io/EveryXthPrinter.java   |  1 -
 .../java/teetime/stage/string/WordCounter.java   |  1 -
 src/site/markdown/wiki                           |  1 +
 8 files changed, 35 insertions(+), 12 deletions(-)
 create mode 100644 src/main/java/teetime/framework/EmptyContext.java
 create mode 160000 src/site/markdown/wiki

diff --git a/src/main/java/teetime/framework/AbstractCompositeStage.java b/src/main/java/teetime/framework/AbstractCompositeStage.java
index 26e8685e..07aa5c98 100644
--- a/src/main/java/teetime/framework/AbstractCompositeStage.java
+++ b/src/main/java/teetime/framework/AbstractCompositeStage.java
@@ -32,11 +32,8 @@ public abstract class AbstractCompositeStage {
 
 	private final ConfigurationContext context;
 
-	public AbstractCompositeStage(final ConfigurationContext context) {
-		if (null == context) {
-			throw new IllegalArgumentException("Context may not be null.");
-		}
-		this.context = context;
+	public AbstractCompositeStage() {
+		this.context = new ConfigurationContext();
 	}
 
 	protected ConfigurationContext getContext() {
diff --git a/src/main/java/teetime/framework/Configuration.java b/src/main/java/teetime/framework/Configuration.java
index bfaf9215..f9722644 100644
--- a/src/main/java/teetime/framework/Configuration.java
+++ b/src/main/java/teetime/framework/Configuration.java
@@ -25,8 +25,4 @@ package teetime.framework;
  */
 public abstract class Configuration extends AbstractCompositeStage {
 
-	public Configuration() {
-		super(new ConfigurationContext());
-	}
-
 }
diff --git a/src/main/java/teetime/framework/ConfigurationContext.java b/src/main/java/teetime/framework/ConfigurationContext.java
index 483b1ecb..236f4c38 100644
--- a/src/main/java/teetime/framework/ConfigurationContext.java
+++ b/src/main/java/teetime/framework/ConfigurationContext.java
@@ -29,7 +29,7 @@ import teetime.framework.pipe.InstantiationPipe;
  *
  * @since 2.0
  */
-public final class ConfigurationContext {
+public class ConfigurationContext {
 
 	private static final Logger LOGGER = LoggerFactory.getLogger(ConfigurationContext.class);
 
@@ -63,7 +63,21 @@ public final class ConfigurationContext {
 			LOGGER.warn("Overwriting existing pipe while connecting stages " +
 					sourcePort.getOwningStage().getId() + " and " + targetPort.getOwningStage().getId() + ".");
 		}
+		mergeContexts(sourcePort.getOwningStage(), 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);
+		} else {
+			targetStage.owningContext = this;
+		}
+	}
+
 }
diff --git a/src/main/java/teetime/framework/EmptyContext.java b/src/main/java/teetime/framework/EmptyContext.java
new file mode 100644
index 00000000..3a676ebc
--- /dev/null
+++ b/src/main/java/teetime/framework/EmptyContext.java
@@ -0,0 +1,15 @@
+package teetime.framework;
+
+class EmptyContext extends ConfigurationContext {
+
+	private static final EmptyContext INSTANCE = new EmptyContext();
+
+	private EmptyContext() {
+
+	}
+
+	static EmptyContext getInstance() {
+		return EmptyContext.INSTANCE;
+	}
+
+}
diff --git a/src/main/java/teetime/framework/Stage.java b/src/main/java/teetime/framework/Stage.java
index 1c9ce2e2..7b9398ca 100644
--- a/src/main/java/teetime/framework/Stage.java
+++ b/src/main/java/teetime/framework/Stage.java
@@ -48,6 +48,8 @@ public abstract class Stage {
 	/** The owning thread of this stage if this stage is directly executed by a {@link AbstractRunnableStage}, <code>null</code> otherwise. */
 	protected Thread owningThread;
 
+	protected ConfigurationContext owningContext = EmptyContext.getInstance();
+
 	protected Stage() {
 		this.id = this.createId();
 		this.logger = LoggerFactory.getLogger(this.getClass().getCanonicalName() + ":" + id);
diff --git a/src/main/java/teetime/stage/io/EveryXthPrinter.java b/src/main/java/teetime/stage/io/EveryXthPrinter.java
index 6f38fbab..4b62916d 100644
--- a/src/main/java/teetime/stage/io/EveryXthPrinter.java
+++ b/src/main/java/teetime/stage/io/EveryXthPrinter.java
@@ -33,7 +33,6 @@ public final class EveryXthPrinter<T> extends AbstractCompositeStage {
 	private final List<Stage> lastStages = new ArrayList<Stage>();
 
 	public EveryXthPrinter(final int threshold, final ConfigurationContext context) {
-		super(context);
 		distributor = new Distributor<T>(new CopyByReferenceStrategy());
 		EveryXthStage<T> everyXthStage = new EveryXthStage<T>(threshold);
 		Printer<Integer> printer = new Printer<Integer>();
diff --git a/src/main/java/teetime/stage/string/WordCounter.java b/src/main/java/teetime/stage/string/WordCounter.java
index 1508c15e..6d15a3f2 100644
--- a/src/main/java/teetime/stage/string/WordCounter.java
+++ b/src/main/java/teetime/stage/string/WordCounter.java
@@ -37,7 +37,6 @@ public final class WordCounter extends AbstractCompositeStage {
 	private final MappingCounter<String> mapCounter;
 
 	public WordCounter(final ConfigurationContext context) {
-		super(context);
 
 		this.tokenizer = new Tokenizer(" ");
 		final ToLowerCase toLowerCase = new ToLowerCase();
diff --git a/src/site/markdown/wiki b/src/site/markdown/wiki
new file mode 160000
index 00000000..709c839c
--- /dev/null
+++ b/src/site/markdown/wiki
@@ -0,0 +1 @@
+Subproject commit 709c839c447a50c93b37fcc633a01297115d4823
-- 
GitLab