From e29640a46f635b18c2584c6021e5e0814b86bf2b Mon Sep 17 00:00:00 2001
From: Nelson Tavares de Sousa <ntd@informatik.uni-kiel.de>
Date: Fri, 21 Nov 2014 14:43:40 +0100
Subject: [PATCH] changed merger to ignore multiple signals on one port changed
 corresponding test and added multiple signal testing

---
 .../teetime/stage/basic/merger/Merger.java     | 18 +++++++++++-------
 .../teetime/stage/basic/merger/MergerTest.java | 18 +++++++++++++++++-
 2 files changed, 28 insertions(+), 8 deletions(-)

diff --git a/src/main/java/teetime/stage/basic/merger/Merger.java b/src/main/java/teetime/stage/basic/merger/Merger.java
index 1ea6e2a1..a27d60b1 100644
--- a/src/main/java/teetime/stage/basic/merger/Merger.java
+++ b/src/main/java/teetime/stage/basic/merger/Merger.java
@@ -17,6 +17,7 @@
 package teetime.stage.basic.merger;
 
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
 
 import teetime.framework.AbstractStage;
@@ -41,7 +42,7 @@ public class Merger<T> extends AbstractStage {
 
 	private IMergerStrategy<T> strategy = new RoundRobinStrategy<T>();
 
-	private final Map<Class<?>, Integer> signalMap = new HashMap<Class<?>, Integer>();
+	private final Map<Class<?>, HashSet<InputPort<?>>> signalMap = new HashMap<Class<?>, HashSet<InputPort<?>>>();
 
 	@Override
 	public void executeWithPorts() {
@@ -58,17 +59,20 @@ public class Merger<T> extends AbstractStage {
 		this.logger.trace("Got signal: " + signal + " from input port: " + inputPort);
 
 		if (signalMap.containsKey(signal.getClass())) {
-			int value = signalMap.get(signal.getClass());
-			value++;
-			if (value == this.getInputPorts().length) {
+			HashSet<InputPort<?>> set = signalMap.get(signal.getClass());
+			if (!set.add(inputPort)) {
+				this.logger.trace("Got second signal " + signal + " from input port: " + inputPort);
+			}
+
+			if (set.size() == this.getInputPorts().length) {
 				this.outputPort.sendSignal(signal);
 				signalMap.remove(signal.getClass());
-			} else {
-				signalMap.put(signal.getClass(), value);
 			}
 		} else {
 			signal.trigger(this);
-			signalMap.put(signal.getClass(), 1);
+			HashSet<InputPort<?>> tempSet = new HashSet<InputPort<?>>();
+			tempSet.add(inputPort);
+			signalMap.put(signal.getClass(), tempSet);
 		}
 
 	}
diff --git a/src/test/java/teetime/stage/basic/merger/MergerTest.java b/src/test/java/teetime/stage/basic/merger/MergerTest.java
index a5d235ad..7afbb35d 100644
--- a/src/test/java/teetime/stage/basic/merger/MergerTest.java
+++ b/src/test/java/teetime/stage/basic/merger/MergerTest.java
@@ -63,8 +63,24 @@ public class MergerTest {
 		Assert.assertFalse(testPipe.startSent());
 		Assert.assertTrue(testPipe.terminateSent());
 
-		merger.onSignal(new StartingSignal(), firstPort);
+		merger.onSignal(new StartingSignal(), secondPort);
 		Assert.assertTrue(testPipe.startSent());
 		Assert.assertTrue(testPipe.terminateSent());
 	}
+
+	@Test
+	public void testMultipleSignals() {
+		this.beforeSignalTesting();
+		merger.onSignal(new StartingSignal(), firstPort);
+		Assert.assertFalse(testPipe.startSent());
+
+		merger.onSignal(new StartingSignal(), firstPort);
+		Assert.assertFalse(testPipe.startSent());
+
+		merger.onSignal(new StartingSignal(), firstPort);
+		Assert.assertFalse(testPipe.startSent());
+
+		merger.onSignal(new StartingSignal(), secondPort);
+		Assert.assertTrue(testPipe.startSent());
+	}
 }
-- 
GitLab