diff --git a/src/main/java/teetime/framework/AbstractCompositeStage.java b/src/main/java/teetime/framework/AbstractCompositeStage.java index f02e0bc8dde9d2eb6fde1697801de23b88edc284..61df743f38c534896e005e900e7de76fb4aa0713 100644 --- a/src/main/java/teetime/framework/AbstractCompositeStage.java +++ b/src/main/java/teetime/framework/AbstractCompositeStage.java @@ -33,7 +33,7 @@ public abstract class AbstractCompositeStage { private final ConfigurationContext context; public AbstractCompositeStage() { - this.context = new ConfigurationContext(); + this.context = new ConfigurationContext(this); } ConfigurationContext getContext() { diff --git a/src/main/java/teetime/framework/ConfigurationContext.java b/src/main/java/teetime/framework/ConfigurationContext.java index ff410c9d9162220e67277e676ff14580422b8f61..26c731426eece5ed203c8ed89267aa9bd8aa7249 100644 --- a/src/main/java/teetime/framework/ConfigurationContext.java +++ b/src/main/java/teetime/framework/ConfigurationContext.java @@ -32,14 +32,19 @@ import teetime.framework.pipe.InstantiationPipe; */ final class ConfigurationContext { - public static final ConfigurationContext EMPTY_CONTEXT = new ConfigurationContext(); + public static final ConfigurationContext EMPTY_CONTEXT = new ConfigurationContext(null); private static final Logger LOGGER = LoggerFactory.getLogger(ConfigurationContext.class); - private ThreadService runtimeService = new ThreadService(); private final List<ConfigurationContext> childs = new ArrayList<ConfigurationContext>(); // parent-child-tree + private final AbstractCompositeStage compositeStage; - ConfigurationContext() {} + private ThreadService runtimeService; + + ConfigurationContext(final AbstractCompositeStage compositeStage) { + this.compositeStage = compositeStage; + this.runtimeService = new ThreadService(compositeStage); + } Map<Stage, String> getThreadableStages() { return runtimeService.getThreadableStages(); diff --git a/src/main/java/teetime/framework/Execution.java b/src/main/java/teetime/framework/Execution.java index 84396bd18ec1bcae7886a5e5b17acdad87aef6c0..f77dc3375e8a02354ca22bce1f1330bfa1c4d312 100644 --- a/src/main/java/teetime/framework/Execution.java +++ b/src/main/java/teetime/framework/Execution.java @@ -20,8 +20,6 @@ import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import teetime.framework.exceptionHandling.IExceptionListenerFactory; -import teetime.framework.exceptionHandling.TerminatingExceptionListenerFactory; import teetime.framework.signal.ValidatingSignal; import teetime.framework.validation.AnalysisNotValidException; @@ -45,8 +43,6 @@ public final class Execution<T extends Configuration> { private final T configuration; - private final IExceptionListenerFactory factory; - private final boolean executionInterrupted = false; /** @@ -59,30 +55,6 @@ public final class Execution<T extends Configuration> { this(configuration, false); } - /** - * Creates a new {@link Execution} that uses the default listener. - * - * @param configuration - * to be used for the analysis - * @param validationEnabled - * whether or not the validation should be executed - */ - public Execution(final T configuration, final boolean validationEnabled) { - this(configuration, validationEnabled, new TerminatingExceptionListenerFactory()); - } - - /** - * Creates a new {@link Execution} that skips validating the port connections and uses a specific listener. - * - * @param configuration - * to be used for the analysis - * @param factory - * specific listener for the exception handling - */ - public Execution(final T configuration, final IExceptionListenerFactory factory) { - this(configuration, false, factory); - } - /** * Creates a new {@link Execution} that uses a specific listener. * @@ -93,9 +65,8 @@ public final class Execution<T extends Configuration> { * @param factory * specific listener for the exception handling */ - public Execution(final T configuration, final boolean validationEnabled, final IExceptionListenerFactory factory) { + public Execution(final T configuration, final boolean validationEnabled) { this.configuration = configuration; - this.factory = factory; if (configuration.isExecuted()) { throw new IllegalStateException("Configuration was already executed"); } @@ -185,13 +156,4 @@ public final class Execution<T extends Configuration> { return this.configuration; } - /** - * @return - * the given ExceptionListenerFactory instance - * - * @since 2.0 - */ - public IExceptionListenerFactory getExceptionListenerFactory() { - return factory; - } } diff --git a/src/main/java/teetime/framework/ThreadService.java b/src/main/java/teetime/framework/ThreadService.java index aefe24a22e1bb68796859c907b5a30b8ac0dbe27..7f37828203a659408636d8fb9350bb3c81fdd53b 100644 --- a/src/main/java/teetime/framework/ThreadService.java +++ b/src/main/java/teetime/framework/ThreadService.java @@ -12,7 +12,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import teetime.framework.exceptionHandling.AbstractExceptionListener; -import teetime.framework.exceptionHandling.TerminatingExceptionListenerFactory; import teetime.framework.signal.InitializingSignal; import teetime.util.ThreadThrowableContainer; import teetime.util.framework.concurrent.SignalingCounter; @@ -36,6 +35,13 @@ class ThreadService extends AbstractService<ThreadService> { private final SignalingCounter runnableCounter = new SignalingCounter(); + private final AbstractCompositeStage compositeStage; + + public ThreadService(final AbstractCompositeStage compositeStage) { + this.compositeStage = compositeStage; + + } + SignalingCounter getRunnableCounter() { return runnableCounter; } @@ -46,6 +52,7 @@ class ThreadService extends AbstractService<ThreadService> { @Override void initialize() { + Configuration config = (Configuration) compositeStage; if (threadableStages.isEmpty()) { throw new IllegalStateException("No stage was added using the addThreadableStage(..) method. Add at least one stage."); } @@ -56,7 +63,7 @@ class ThreadService extends AbstractService<ThreadService> { final Set<Stage> intraStages = traverseIntraStages(stage); // FIXME: receive factory from config! - final AbstractExceptionListener newListener = new TerminatingExceptionListenerFactory().createInstance(); + final AbstractExceptionListener newListener = config.getFactory().createInstance(); initializeIntraStages(intraStages, thread, newListener); } diff --git a/src/test/java/teetime/framework/exceptionHandling/ExceptionHandlingTest.java b/src/test/java/teetime/framework/exceptionHandling/ExceptionHandlingTest.java index 98a2a5f03c65c128fcc949feb1ec4fec1a715013..1388df7075ba18bc22e86ca640da196888ecd35c 100644 --- a/src/test/java/teetime/framework/exceptionHandling/ExceptionHandlingTest.java +++ b/src/test/java/teetime/framework/exceptionHandling/ExceptionHandlingTest.java @@ -30,7 +30,7 @@ public class ExceptionHandlingTest { public ExceptionTestConfiguration newInstances() { ExceptionTestConfiguration configuration = new ExceptionTestConfiguration(); - execution = new Execution<ExceptionTestConfiguration>(configuration, new TestListenerFactory()); + execution = new Execution<ExceptionTestConfiguration>(configuration); return configuration; } diff --git a/src/test/java/teetime/framework/exceptionHandling/ExceptionTestConfiguration.java b/src/test/java/teetime/framework/exceptionHandling/ExceptionTestConfiguration.java index ca231db95d28eb22dd3e9df80b62733efc65d2a8..9229eb758a8a5cb16a7ed0618e84e6e62ea10841 100644 --- a/src/test/java/teetime/framework/exceptionHandling/ExceptionTestConfiguration.java +++ b/src/test/java/teetime/framework/exceptionHandling/ExceptionTestConfiguration.java @@ -24,6 +24,8 @@ public class ExceptionTestConfiguration extends Configuration { ExceptionTestProducerStage third; public ExceptionTestConfiguration() { + super(new TestListenerFactory()); + first = new ExceptionTestProducerStage(); second = new ExceptionTestConsumerStage(); third = new ExceptionTestProducerStage(); diff --git a/src/test/java/teetime/stage/basic/merger/dynamic/DynamicMergerTest.java b/src/test/java/teetime/stage/basic/merger/dynamic/DynamicMergerTest.java index 356d27c289905e5930b5384f8ddae223e4365f4a..64b7d4f80fd101c942734144088fe22a1c1e560a 100644 --- a/src/test/java/teetime/stage/basic/merger/dynamic/DynamicMergerTest.java +++ b/src/test/java/teetime/stage/basic/merger/dynamic/DynamicMergerTest.java @@ -49,8 +49,7 @@ public class DynamicMergerTest { } DynamicMergerTestConfig<Integer> config = new DynamicMergerTestConfig<Integer>(inputNumbers, Arrays.asList(inputActions)); - Execution<DynamicMergerTestConfig<Integer>> analysis = new Execution<DynamicMergerTestConfig<Integer>>(config, - new TerminatingExceptionListenerFactory()); + Execution<DynamicMergerTestConfig<Integer>> analysis = new Execution<DynamicMergerTestConfig<Integer>>(config); analysis.executeBlocking(); @@ -68,8 +67,7 @@ public class DynamicMergerTest { } DynamicMergerTestConfig<Integer> config = new DynamicMergerTestConfig<Integer>(inputNumbers, Arrays.asList(inputActions)); - Execution<DynamicMergerTestConfig<Integer>> analysis = new Execution<DynamicMergerTestConfig<Integer>>(config, - new TerminatingExceptionListenerFactory()); + Execution<DynamicMergerTestConfig<Integer>> analysis = new Execution<DynamicMergerTestConfig<Integer>>(config); analysis.executeBlocking(); @@ -90,8 +88,7 @@ public class DynamicMergerTest { inputActions[5] = new RemovePortAction<Integer>(null); DynamicMergerTestConfig<Integer> config = new DynamicMergerTestConfig<Integer>(inputNumbers, Arrays.asList(inputActions)); - Execution<DynamicMergerTestConfig<Integer>> analysis = new Execution<DynamicMergerTestConfig<Integer>>(config, - new TerminatingExceptionListenerFactory()); + Execution<DynamicMergerTestConfig<Integer>> analysis = new Execution<DynamicMergerTestConfig<Integer>>(config); analysis.executeBlocking(); @@ -119,6 +116,7 @@ public class DynamicMergerTest { private final CollectorSink<T> collectorSink; public DynamicMergerTestConfig(final List<T> elements, final List<PortAction<DynamicMerger<T>>> inputActions) { + super(new TerminatingExceptionListenerFactory()); InitialElementProducer<T> initialElementProducer = new InitialElementProducer<T>(elements); DynamicMerger<T> merger = new DynamicMerger<T>(new BusyWaitingRoundRobinStrategy()); collectorSink = new CollectorSink<T>();