From 035cf2e01e6ba12fc0b5cae1d4b170de295e7777 Mon Sep 17 00:00:00 2001
From: Christian Wulf <chw@informatik.uni-kiel.de>
Date: Fri, 27 Mar 2015 14:49:41 +0100
Subject: [PATCH] worked on draft for Traversor

---
 .../java/teetime/framework/StageVisitor.java     |  4 +++-
 src/main/java/teetime/framework/Traversor.java   | 16 +++++++++++++---
 2 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/src/main/java/teetime/framework/StageVisitor.java b/src/main/java/teetime/framework/StageVisitor.java
index d60b87bf..c24e5238 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 9432b1cc..09e82ebc 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
 			}
 		}
 	}
-- 
GitLab