From dda260704cd6242c34bcd1ef24aada0026018c71 Mon Sep 17 00:00:00 2001 From: Christian Wulf <chw@informatik.uni-kiel.de> Date: Thu, 30 Jul 2015 14:17:48 +0200 Subject: [PATCH] prepared exception throw mechanism --- .../framework/ConfigurationContext.java | 1 - src/main/java/teetime/framework/Stage.java | 1 - .../java/teetime/framework/ThreadService.java | 36 +++++++++++-------- .../TerminatingExceptionListener.java | 14 +++++++- .../framework/signal/StartingSignal.java | 2 +- .../framework/signal/TerminatingSignal.java | 2 +- 6 files changed, 36 insertions(+), 20 deletions(-) diff --git a/src/main/java/teetime/framework/ConfigurationContext.java b/src/main/java/teetime/framework/ConfigurationContext.java index 9e0f7e1a..41fe620b 100644 --- a/src/main/java/teetime/framework/ConfigurationContext.java +++ b/src/main/java/teetime/framework/ConfigurationContext.java @@ -85,7 +85,6 @@ final class ConfigurationContext { } else { stage.owningContext = this; } - } final void initializeContext() { diff --git a/src/main/java/teetime/framework/Stage.java b/src/main/java/teetime/framework/Stage.java index 986593ea..8b51301e 100644 --- a/src/main/java/teetime/framework/Stage.java +++ b/src/main/java/teetime/framework/Stage.java @@ -134,7 +134,6 @@ public abstract class Stage { return owningThread; } - @SuppressWarnings("PMD.DefaultPackage") void setOwningThread(final Thread owningThread) { this.owningThread = owningThread; } diff --git a/src/main/java/teetime/framework/ThreadService.java b/src/main/java/teetime/framework/ThreadService.java index aca4c7b3..161e94cf 100644 --- a/src/main/java/teetime/framework/ThreadService.java +++ b/src/main/java/teetime/framework/ThreadService.java @@ -1,19 +1,17 @@ package teetime.framework; -import java.util.Collection; +import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.concurrent.ConcurrentLinkedQueue; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import teetime.framework.exceptionHandling.AbstractExceptionListener; import teetime.framework.exceptionHandling.IExceptionListenerFactory; -import teetime.util.ThreadThrowableContainer; import teetime.util.framework.concurrent.SignalingCounter; /** @@ -39,21 +37,15 @@ class ThreadService extends AbstractService<ThreadService> { public ThreadService(final AbstractCompositeStage compositeStage) { this.compositeStage = compositeStage; - } - private final Collection<ThreadThrowableContainer> exceptions = new ConcurrentLinkedQueue<ThreadThrowableContainer>(); - private final List<RunnableProducerStage> producerRunnables = new LinkedList<RunnableProducerStage>(); @Override void onInitialize() { - IExceptionListenerFactory factory; - try { - factory = ((Configuration) compositeStage).getFactory(); - } catch (ClassCastException e) { - throw new IllegalStateException("Something went wrong"); - } + // is invoked only by a Configuration + IExceptionListenerFactory factory = ((Configuration) compositeStage).getFactory(); + if (threadableStages.isEmpty()) { throw new IllegalStateException("No stage was added using the addThreadableStage(..) method. Add at least one stage."); } @@ -121,9 +113,23 @@ class ThreadService extends AbstractService<ThreadService> { thread.interrupt(); } - // if (!exceptions.isEmpty()) { - // throw new ExecutionException(exceptions); - // } + List<Exception> exceptions = collectExceptions(); + if (!exceptions.isEmpty()) { + // throw new ExecutionException(exceptions); + } + } + + // TODO impl throw exception + private List<Exception> collectExceptions() { + // Collection<ThreadThrowableContainer> exceptions = new ConcurrentLinkedQueue<ThreadThrowableContainer>(); + List<Exception> exceptions = new ArrayList<Exception>(); + + for (Stage stage : threadableStages.keySet()) { + // List<Exception> stageExceptions = stage.exceptionListener.getExceptions(); + // exceptions.addAll(stageExceptions); + } + + return exceptions; } private void initializeIntraStages(final Set<Stage> intraStages, final Thread thread, final AbstractExceptionListener newListener) { diff --git a/src/main/java/teetime/framework/exceptionHandling/TerminatingExceptionListener.java b/src/main/java/teetime/framework/exceptionHandling/TerminatingExceptionListener.java index fef3dff6..d0c7dec4 100644 --- a/src/main/java/teetime/framework/exceptionHandling/TerminatingExceptionListener.java +++ b/src/main/java/teetime/framework/exceptionHandling/TerminatingExceptionListener.java @@ -15,14 +15,26 @@ */ package teetime.framework.exceptionHandling; +import java.util.ArrayList; +import java.util.List; + import teetime.framework.Stage; class TerminatingExceptionListener extends AbstractExceptionListener { + private final List<Exception> exceptions = new ArrayList<Exception>(); + @Override public FurtherExecution onStageException(final Exception e, final Stage throwingStage) { - logger.warn("Exception occurred in " + throwingStage.getId(), e); + if (logger.isWarnEnabled()) { + logger.warn("Exception occurred in " + throwingStage.getId(), e); + } + exceptions.add(e); return FurtherExecution.TERMINATE; } + public List<Exception> getExceptions() { + return exceptions; + } + } diff --git a/src/main/java/teetime/framework/signal/StartingSignal.java b/src/main/java/teetime/framework/signal/StartingSignal.java index 375952f0..5b547dd5 100644 --- a/src/main/java/teetime/framework/signal/StartingSignal.java +++ b/src/main/java/teetime/framework/signal/StartingSignal.java @@ -27,7 +27,7 @@ public final class StartingSignal extends AbstractSignal { public void trigger(final Stage stage) { try { stage.onStarting(); - } catch (Exception e) { // NOCS (Stages can throw any arbitrary Exception) + } catch (final Exception e) { // NOCS NOPMD (Stages can throw any arbitrary Exception) this.catchedExceptions.add(e); LOGGER.error("Exception while sending the start signal", e); } diff --git a/src/main/java/teetime/framework/signal/TerminatingSignal.java b/src/main/java/teetime/framework/signal/TerminatingSignal.java index 5823902b..32ec5bf2 100644 --- a/src/main/java/teetime/framework/signal/TerminatingSignal.java +++ b/src/main/java/teetime/framework/signal/TerminatingSignal.java @@ -27,7 +27,7 @@ public final class TerminatingSignal extends AbstractSignal { public void trigger(final Stage stage) { try { stage.onTerminating(); - } catch (Exception e) { // NOCS (Stages can throw any arbitrary Exception) + } catch (final Exception e) { // NOCS NOPMD (Stages can throw any arbitrary Exception) this.catchedExceptions.add(e); LOGGER.error("Exception while sending the termination signal", e); } -- GitLab