package uk.co.acuminous.julez.runner;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import uk.co.acuminous.julez.event.handler.EventHandler;
import uk.co.acuminous.julez.util.ConcurrencyUtils;
public class MultiConcurrentScenarioRunner extends BaseScenarioRunner {
private final CountDownLatch latch;
private final List<ScenarioRunner> runners;
private ScenarioRunnerEventFactory eventFactory = new ScenarioRunnerEventFactory();
public MultiConcurrentScenarioRunner(ScenarioRunner... concurrentScenarioRunners) {
runners = Arrays.asList(concurrentScenarioRunners);
latch = new CountDownLatch(runners.size());
}
public void usingEventFactory(ScenarioRunnerEventFactory eventFactory) {
this.eventFactory = eventFactory;
}
public void go() {
handler.onEvent(eventFactory.begin());
for (final ScenarioRunner runner : runners) {
ConcurrencyUtils.start(new Runnable() {
@Override
public void run() {
try {
runner.go();
} finally {
latch.countDown();
}
}
});
}
ConcurrencyUtils.await(latch);
handler.onEvent(eventFactory.end());
}
@Override
public MultiConcurrentScenarioRunner register(EventHandler handler) {
super.register(handler);
return this;
}
}