diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 6ed7a57dd69949696e17dd850c36b61a52c536c3..5f4f395322c11f1d0ac2e3ef8a24a60d30254dad 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -21,8 +21,7 @@ </action> <action dev="ntd" type="add" issue="171"> Configurations are now - built within the Configuration class which is passed on to nested - CompositeStages. + built within the Configuration class. This removes any constraints on CompositeStages and enables therefore multiple connections and multithreading. </action> diff --git a/src/main/java/teetime/framework/Stage.java b/src/main/java/teetime/framework/Stage.java index 7b9398ca6c254c464f4c28c77e80c55d9325f86a..4625f610869d10e0240778e26ddba87c39ec5151 100644 --- a/src/main/java/teetime/framework/Stage.java +++ b/src/main/java/teetime/framework/Stage.java @@ -48,7 +48,7 @@ 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(); + public ConfigurationContext owningContext = EmptyContext.getInstance(); protected Stage() { this.id = this.createId(); diff --git a/src/test/java/teetime/framework/AbstractCompositeStageTest.java b/src/test/java/teetime/framework/AbstractCompositeStageTest.java index 3ca971fb3f31ea250e8ebcc718693f526e8df1f5..2d8848e254988267fb20e473af0655f793d2895a 100644 --- a/src/test/java/teetime/framework/AbstractCompositeStageTest.java +++ b/src/test/java/teetime/framework/AbstractCompositeStageTest.java @@ -15,7 +15,62 @@ */ package teetime.framework; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; + +import org.junit.Test; + +import teetime.stage.Counter; +import teetime.stage.InitialElementProducer; +import teetime.stage.basic.Sink; public class AbstractCompositeStageTest { + @Test + public void testNestedStages() { + Execution<NestesConfig> exec = new Execution<NestesConfig>(new NestesConfig()); + assertThat(exec.getConfiguration().getContext().getThreadableStages().size(), is(3)); + } + + private class NestesConfig extends Configuration { + + private final InitialElementProducer<Object> init; + private final Sink sink; + private final TestNestingCompositeStage compositeStage; + + public NestesConfig() { + init = new InitialElementProducer<Object>(new Object()); + sink = new Sink(); + compositeStage = new TestNestingCompositeStage(); + connectPorts(init.getOutputPort(), compositeStage.firstCompositeStage.firstCounter.getInputPort()); + connectPorts(compositeStage.secondCompositeStage.secondCounter.getOutputPort(), sink.getInputPort()); + + } + } + + private class TestCompositeStage extends AbstractCompositeStage { + + private final Counter firstCounter = new Counter(); + private final Counter secondCounter = new Counter(); + + public TestCompositeStage() { + addThreadableStage(firstCounter); + connectPorts(firstCounter.getOutputPort(), secondCounter.getInputPort()); + } + + } + + private class TestNestingCompositeStage extends AbstractCompositeStage { + + public TestCompositeStage firstCompositeStage; + public TestCompositeStage secondCompositeStage; + + public TestNestingCompositeStage() { + firstCompositeStage = new TestCompositeStage(); + secondCompositeStage = new TestCompositeStage(); + connectPorts(firstCompositeStage.secondCounter.getOutputPort(), secondCompositeStage.firstCounter.getInputPort()); + } + + } + }