From 1206afc259fa6238113314f0269d4a29cfe87b7e Mon Sep 17 00:00:00 2001 From: Christian Wulf <chw@informatik.uni-kiel.de> Date: Fri, 27 Mar 2015 14:38:11 +0100 Subject: [PATCH] added a draft for a traversor --- .../framework/AbstractCompositeStage.java | 17 ++++++++++- src/main/java/teetime/framework/Stage.java | 2 ++ .../java/teetime/framework/StageVisitor.java | 11 +++++++ .../java/teetime/framework/Traversor.java | 29 +++++++++++++++++++ src/site/markdown/wiki | 2 +- 5 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 src/main/java/teetime/framework/StageVisitor.java create mode 100644 src/main/java/teetime/framework/Traversor.java diff --git a/src/main/java/teetime/framework/AbstractCompositeStage.java b/src/main/java/teetime/framework/AbstractCompositeStage.java index d430d233..4eab1fb4 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 c87593b7..3e5df4db 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 00000000..d60b87bf --- /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 00000000..9432b1cc --- /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 162510ff..0e447457 160000 --- a/src/site/markdown/wiki +++ b/src/site/markdown/wiki @@ -1 +1 @@ -Subproject commit 162510ff4d2f04011498ba6920aae0c78347c6c8 +Subproject commit 0e4474577e1f49bc96e734c286b2d9e0363895e8 -- GitLab