diff --git a/src/main/java/teetime/stage/basic/merger/Merger.java b/src/main/java/teetime/stage/basic/merger/Merger.java index 1ea6e2a1987d9ef99c19c0f4b68a0d6a84810519..a27d60b19c824b4290ba9d1f29b481a75c70e545 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 a5d235ad159f3710c847139ccf3b936e1b685c77..7afbb35d67f3af495dde66bd87f0a91ee219fa0f 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()); + } }