diff --git a/src/main/java/teetime/framework/AbstractCompositeStage.java b/src/main/java/teetime/framework/AbstractCompositeStage.java index d430d233f9933104c9e62bd9fd22a85e569755ed..4eab1fb453bfc9beb3be3bb0a6f4d5bb13da8482 100644 --- a/src/main/java/teetime/framework/AbstractCompositeStage.java +++ b/src/main/java/teetime/framework/AbstractCompositeStage.java @@ -15,6 +15,8 @@ */ package teetime.framework; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.List; @@ -32,16 +34,24 @@ import teetime.framework.validation.InvalidPortConnection; * @author Christian Wulf, Nelson Tavares de Sousa * */ -@SuppressWarnings("PMD.AbstractNaming") public abstract class AbstractCompositeStage extends Stage { private static final IPipeFactory INTRA_PIPE_FACTORY = PipeFactoryRegistry.INSTANCE .getPipeFactory(ThreadCommunication.INTRA, PipeOrdering.ARBITRARY, false); + private final List<OutputPort<?>> outputPorts; + protected abstract Stage getFirstStage(); protected abstract Collection<? extends Stage> getLastStages(); + public AbstractCompositeStage() { + outputPorts = new ArrayList<OutputPort<?>>(); + for (final Stage s : getLastStages()) { + outputPorts.addAll(Arrays.asList(s.getOutputPorts())); + } + } + @Override protected final void executeStage() { getFirstStage().executeStage(); @@ -72,6 +82,11 @@ public abstract class AbstractCompositeStage extends Stage { return getFirstStage().getInputPorts(); } + @Override + protected OutputPort<?>[] getOutputPorts() { + return outputPorts.toArray(new OutputPort[0]); + } + @Override public final StageState getCurrentState() { return getFirstStage().getCurrentState(); diff --git a/src/main/java/teetime/framework/Stage.java b/src/main/java/teetime/framework/Stage.java index c87593b7eac23b14790ce9f2939fb3d1a4484ed0..3e5df4db62909327019f19144c246bf1d3aa9fc6 100644 --- a/src/main/java/teetime/framework/Stage.java +++ b/src/main/java/teetime/framework/Stage.java @@ -119,6 +119,8 @@ public abstract class Stage { protected abstract InputPort<?>[] getInputPorts(); + protected abstract OutputPort<?>[] getOutputPorts(); + // events public abstract void onValidating(List<InvalidPortConnection> invalidPortConnections); diff --git a/src/main/java/teetime/framework/StageVisitor.java b/src/main/java/teetime/framework/StageVisitor.java new file mode 100644 index 0000000000000000000000000000000000000000..d60b87bfbcd3f809173aad92e4ad1a0f49bbfad5 --- /dev/null +++ b/src/main/java/teetime/framework/StageVisitor.java @@ -0,0 +1,11 @@ +package teetime.framework; + +public interface StageVisitor { + + public enum VisitorBehavior { + CONTINUE, STOP + } + + VisitorBehavior visit(Stage stage); + +} diff --git a/src/main/java/teetime/framework/Traversor.java b/src/main/java/teetime/framework/Traversor.java new file mode 100644 index 0000000000000000000000000000000000000000..9432b1cc42a7cb22f9d1e09ec8df7f62091a32eb --- /dev/null +++ b/src/main/java/teetime/framework/Traversor.java @@ -0,0 +1,29 @@ +package teetime.framework; + +import teetime.framework.StageVisitor.VisitorBehavior; +import teetime.framework.pipe.IPipe; + +public class Traversor { + + private final StageVisitor stageVisitor; + + public Traversor(final StageVisitor stageVisitor) { + this.stageVisitor = stageVisitor; + } + + public void traverse(final Stage stage) { + VisitorBehavior visitorBehavior = stageVisitor.visit(stage); + if (visitorBehavior == VisitorBehavior.STOP) { + return; + } + + OutputPort<?>[] outputPorts = stage.getOutputPorts(); + for (OutputPort<?> outputPort : outputPorts) { + IPipe pipe = outputPort.getPipe(); + if (null != pipe) { + Stage owningStage = pipe.getTargetPort().getOwningStage(); + traverse(owningStage); // recursive call + } + } + } +} diff --git a/src/site/markdown/wiki b/src/site/markdown/wiki index 162510ff4d2f04011498ba6920aae0c78347c6c8..0e4474577e1f49bc96e734c286b2d9e0363895e8 160000 --- a/src/site/markdown/wiki +++ b/src/site/markdown/wiki @@ -1 +1 @@ -Subproject commit 162510ff4d2f04011498ba6920aae0c78347c6c8 +Subproject commit 0e4474577e1f49bc96e734c286b2d9e0363895e8