diff --git a/src/main/java/teetime/framework/StageVisitor.java b/src/main/java/teetime/framework/StageVisitor.java index d60b87bfbcd3f809173aad92e4ad1a0f49bbfad5..c24e52383305442b5dbf557bf966f740dd6f04fe 100644 --- a/src/main/java/teetime/framework/StageVisitor.java +++ b/src/main/java/teetime/framework/StageVisitor.java @@ -1,11 +1,13 @@ package teetime.framework; +import teetime.framework.pipe.IPipe; + public interface StageVisitor { public enum VisitorBehavior { CONTINUE, STOP } - VisitorBehavior visit(Stage stage); + VisitorBehavior visit(Stage stage, IPipe inputPipe); } diff --git a/src/main/java/teetime/framework/Traversor.java b/src/main/java/teetime/framework/Traversor.java index 9432b1cc42a7cb22f9d1e09ec8df7f62091a32eb..09e82ebcd07f35ff194b310b4a6008c69d5ffea0 100644 --- a/src/main/java/teetime/framework/Traversor.java +++ b/src/main/java/teetime/framework/Traversor.java @@ -1,18 +1,28 @@ package teetime.framework; +import java.util.HashSet; +import java.util.Set; + import teetime.framework.StageVisitor.VisitorBehavior; import teetime.framework.pipe.IPipe; public class Traversor { private final StageVisitor stageVisitor; + private final Set<Stage> visitedStage = new HashSet<Stage>(); public Traversor(final StageVisitor stageVisitor) { this.stageVisitor = stageVisitor; } - public void traverse(final Stage stage) { - VisitorBehavior visitorBehavior = stageVisitor.visit(stage); + public void traverse(final Stage stage, final IPipe inputPipe) { + if (!visitedStage.contains(stage)) { + visitedStage.add(stage); + } else { + return; + } + + VisitorBehavior visitorBehavior = stageVisitor.visit(stage, inputPipe); if (visitorBehavior == VisitorBehavior.STOP) { return; } @@ -22,7 +32,7 @@ public class Traversor { IPipe pipe = outputPort.getPipe(); if (null != pipe) { Stage owningStage = pipe.getTargetPort().getOwningStage(); - traverse(owningStage); // recursive call + traverse(owningStage, pipe); // recursive call } } }