Skip to content
Snippets Groups Projects
Commit 57eb0d3f authored by Christian Wulf's avatar Christian Wulf
Browse files

Merge branch 'merger-second-version' into 'master'

Merger second version

changed merger's behavior corresponding to the last idea in #65

See merge request !18
parents 6a869ff9 ea939900
No related branches found
No related tags found
No related merge requests found
#FindBugs User Preferences
#Tue Nov 18 10:57:28 CET 2014
#Tue Nov 25 12:10:00 CET 2014
detector_threshold=3
effort=max
excludefilter0=.fbExcludeFilterFile|true
......
......@@ -17,7 +17,9 @@
package teetime.stage.basic.merger;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import teetime.framework.AbstractStage;
import teetime.framework.InputPort;
......@@ -27,6 +29,7 @@ import teetime.framework.signal.ISignal;
/**
*
* This stage merges data from the input ports, by taking elements according to the chosen merge strategy and by putting them to the output port.
* For its signal handling behavior see {@link #onSignal(ISignal, InputPort)}
*
* @author Christian Wulf
*
......@@ -41,7 +44,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<?>, Set<InputPort<?>>> signalMap = new HashMap<Class<?>, Set<InputPort<?>>>();
@Override
public void executeWithPorts() {
......@@ -53,22 +56,36 @@ public class Merger<T> extends AbstractStage {
this.send(this.outputPort, token);
}
/**
* This method is executed, if a signal is sent to a instance of this class.
* Multiple signals of one certain type are ignored, if they are sent to same port.
* Hence a signal is only passed on, when it arrived on all input ports, regardless how often.
*
* @param signal
* Signal which is sent
*
* @param inputPort
* The port which the signal was sent to
*/
@Override
public void onSignal(final ISignal signal, final InputPort<?> inputPort) {
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) {
Set<InputPort<?>> set = signalMap.get(signal.getClass());
if (!set.add(inputPort)) {
this.logger.warn("Received more than one 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);
Set<InputPort<?>> tempSet = new HashSet<InputPort<?>>();
tempSet.add(inputPort);
signalMap.put(signal.getClass(), tempSet);
}
}
......
......@@ -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());
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment