From 416fb942088c2918e2f0ff16d0840bcf1ff92c4b Mon Sep 17 00:00:00 2001
From: Nelson Tavares de Sousa <stu103017@mail.uni-kiel.de>
Date: Thu, 18 Jun 2015 17:20:24 +0200
Subject: [PATCH] stages without InputPorts are now automatically added to the
 threadableStages list

---
 .../teetime/framework/AnalysisContext.java    |  3 ++
 .../java/teetime/framework/AnalysisTest.java  | 29 +++++++++++++++++++
 2 files changed, 32 insertions(+)

diff --git a/src/main/java/teetime/framework/AnalysisContext.java b/src/main/java/teetime/framework/AnalysisContext.java
index 67348213..5c763367 100644
--- a/src/main/java/teetime/framework/AnalysisContext.java
+++ b/src/main/java/teetime/framework/AnalysisContext.java
@@ -192,6 +192,9 @@ public abstract class AnalysisContext extends Network {
 	 */
 	@Override
 	protected final <T> void connectPorts(final OutputPort<? extends T> sourcePort, final InputPort<T> targetPort, final int capacity) {
+		if (sourcePort.getOwningStage().getInputPorts().length == 0) {
+			addThreadableStage(sourcePort.getOwningStage());
+		}
 		new InstantiationPipe(sourcePort, targetPort, capacity);
 	}
 
diff --git a/src/test/java/teetime/framework/AnalysisTest.java b/src/test/java/teetime/framework/AnalysisTest.java
index fd15835d..a77c101a 100644
--- a/src/test/java/teetime/framework/AnalysisTest.java
+++ b/src/test/java/teetime/framework/AnalysisTest.java
@@ -150,4 +150,33 @@ public class AnalysisTest {
 		}
 	}
 
+	@Test
+	public void automaticallyAddHeadStages() {
+		AutomaticallyConfig context = new AutomaticallyConfig();
+		new Analysis<AnalysisContext>(context).executeBlocking();
+		assertTrue(context.executed);
+	}
+
+	private class AutomaticallyConfig extends AnalysisContext {
+
+		public boolean executed;
+
+		public AutomaticallyConfig() {
+			AutomaticallyAddedStage aas = new AutomaticallyAddedStage();
+			Sink<Object> sink = new Sink<Object>();
+			connectPorts(aas.getOutputPort(), sink.getInputPort());
+		}
+
+		private class AutomaticallyAddedStage extends AbstractProducerStage<Object> {
+
+			@Override
+			protected void execute() {
+				executed = true;
+				terminate();
+			}
+
+		}
+
+	}
+
 }
-- 
GitLab