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