From d12c6d81f3580b9f00a01151f5335755948280dd Mon Sep 17 00:00:00 2001
From: Nelson Tavares de Sousa <stu103017@mail.uni-kiel.de>
Date: Mon, 28 Sep 2015 13:05:51 +0200
Subject: [PATCH] not calling the super methods results in an exception

---
 .../java/teetime/framework/AbstractStage.java | 20 ++++++++++++++++++-
 .../framework/SuperNotCalledException.java    | 14 +++++++++++++
 2 files changed, 33 insertions(+), 1 deletion(-)
 create mode 100644 src/main/java/teetime/framework/SuperNotCalledException.java

diff --git a/src/main/java/teetime/framework/AbstractStage.java b/src/main/java/teetime/framework/AbstractStage.java
index bddcb551..4aacc6e1 100644
--- a/src/main/java/teetime/framework/AbstractStage.java
+++ b/src/main/java/teetime/framework/AbstractStage.java
@@ -31,6 +31,8 @@ import teetime.framework.exceptionHandling.AbstractExceptionListener.FurtherExec
 import teetime.framework.exceptionHandling.TerminateException;
 import teetime.framework.pipe.IPipe;
 import teetime.framework.signal.ISignal;
+import teetime.framework.signal.StartingSignal;
+import teetime.framework.signal.TerminatingSignal;
 import teetime.framework.validation.InvalidPortConnection;
 import teetime.util.framework.port.PortList;
 import teetime.util.framework.port.PortRemovedListener;
@@ -180,6 +182,10 @@ public abstract class AbstractStage {
 
 	private final PortList<InputPort<?>> inputPorts = new PortList<InputPort<?>>();
 	private final PortList<OutputPort<?>> outputPorts = new PortList<OutputPort<?>>();
+
+	private boolean calledOnTerminating = false;
+	private boolean calledOnStarting = false;
+
 	private volatile StageState currentState = StageState.CREATED;
 
 	protected List<InputPort<?>> getInputPorts() {
@@ -216,6 +222,16 @@ public abstract class AbstractStage {
 		if (signal.mayBeTriggered(signalReceivedInputPorts, getInputPorts())) {
 			try {
 				signal.trigger(this);
+				if (signal instanceof StartingSignal) {
+					if (!calledOnStarting) {
+						throw new SuperNotCalledException("The super method onStarting was not called in " + this.getId());
+					}
+				}
+				if (signal instanceof TerminatingSignal) {
+					if (!calledOnTerminating) {
+						throw new SuperNotCalledException("The super method onTerminating was not called in " + this.getId());
+					}
+				}
 			} catch (Exception e) {
 				this.getOwningContext().abortConfigurationRun();
 			}
@@ -248,7 +264,7 @@ public abstract class AbstractStage {
 		return signalAlreadyReceived;
 	}
 
-	private void changeState(final StageState newState) {
+	void changeState(final StageState newState) {
 		currentState = newState;
 		if (logger.isTraceEnabled()) {
 			logger.trace(newState.toString());
@@ -270,11 +286,13 @@ public abstract class AbstractStage {
 	@SuppressWarnings("PMD.SignatureDeclareThrowsException")
 	public void onStarting() throws Exception {
 		changeState(StageState.STARTED);
+		calledOnStarting = true;
 	}
 
 	@SuppressWarnings("PMD.SignatureDeclareThrowsException")
 	public void onTerminating() throws Exception {
 		changeState(StageState.TERMINATED);
+		calledOnTerminating = true;
 	}
 
 	/**
diff --git a/src/main/java/teetime/framework/SuperNotCalledException.java b/src/main/java/teetime/framework/SuperNotCalledException.java
new file mode 100644
index 00000000..f9b40ee0
--- /dev/null
+++ b/src/main/java/teetime/framework/SuperNotCalledException.java
@@ -0,0 +1,14 @@
+package teetime.framework;
+
+public class SuperNotCalledException extends RuntimeException {
+
+	/**
+	 *
+	 */
+	private static final long serialVersionUID = 1328934037128066070L;
+
+	SuperNotCalledException(final String string) {
+		super(string);
+	}
+
+}
-- 
GitLab