diff --git a/src/main/java/teetime/framework/AbstractStage.java b/src/main/java/teetime/framework/AbstractStage.java index bddcb55121276eae8e928ca964319062ad5bc510..4aacc6e12f8d7703dcdf6e8a101ccc675e7787bf 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 0000000000000000000000000000000000000000..f9b40ee0c81dd42b684a8841765536cbc3ab8014 --- /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); + } + +}