From b1d8f7bfbbd9055bd7caccca2cbfa2abdcb14bc0 Mon Sep 17 00:00:00 2001 From: Nelson Tavares de Sousa <stu103017@mail.uni-kiel.de> Date: Thu, 23 Jul 2015 12:29:35 +0200 Subject: [PATCH] moved executeStage to Stage renamed exceptionHandler to exceptionListener --- .../framework/AbstractConsumerStage.java | 14 ++------- .../framework/AbstractProducerStage.java | 17 ----------- .../framework/AbstractRunnableStage.java | 4 +-- .../java/teetime/framework/Execution.java | 14 ++------- src/main/java/teetime/framework/Stage.java | 23 +++++++++++++-- .../teetime/framework/TerminateException.java | 28 ------------------ ...Exception.java => TerminateException.java} | 29 +++++-------------- src/main/java/teetime/stage/basic/Delay.java | 6 ++++ .../teetime/stage/basic/merger/Merger.java | 6 ++++ .../java/teetime/util/StacklessException.java | 4 +++ .../java/teetime/framework/StageTest.java | 4 +-- .../teetime/stage/string/TokenizerTest.java | 8 +++++ 12 files changed, 60 insertions(+), 97 deletions(-) delete mode 100644 src/main/java/teetime/framework/TerminateException.java rename src/main/java/teetime/framework/exceptionHandling/{StageException.java => TerminateException.java} (67%) diff --git a/src/main/java/teetime/framework/AbstractConsumerStage.java b/src/main/java/teetime/framework/AbstractConsumerStage.java index 878686d0..ee9ced94 100644 --- a/src/main/java/teetime/framework/AbstractConsumerStage.java +++ b/src/main/java/teetime/framework/AbstractConsumerStage.java @@ -15,9 +15,6 @@ */ package teetime.framework; -import teetime.framework.exceptionHandling.AbstractExceptionListener.FurtherExecution; -import teetime.framework.exceptionHandling.StageException; - public abstract class AbstractConsumerStage<I> extends AbstractStage { protected final InputPort<I> inputPort = this.createInputPort(); @@ -27,20 +24,13 @@ public abstract class AbstractConsumerStage<I> extends AbstractStage { } @Override - protected final void executeStage() { + protected final void execute() { final I element = this.getInputPort().receive(); if (null == element) { returnNoElement(); } - try { - this.execute(element); - } catch (Exception e) { - final FurtherExecution furtherExecution = exceptionHandler.onStageException(e, this); - if (furtherExecution == FurtherExecution.TERMINATE) { - throw new StageException(e, this); - } - } + this.execute(element); } protected abstract void execute(I element); diff --git a/src/main/java/teetime/framework/AbstractProducerStage.java b/src/main/java/teetime/framework/AbstractProducerStage.java index 04a14b46..6cef7717 100644 --- a/src/main/java/teetime/framework/AbstractProducerStage.java +++ b/src/main/java/teetime/framework/AbstractProducerStage.java @@ -15,9 +15,6 @@ */ package teetime.framework; -import teetime.framework.exceptionHandling.AbstractExceptionListener.FurtherExecution; -import teetime.framework.exceptionHandling.StageException; - /** * The <code>ProducerStage</code> produces at least one element at each execution.<br> * @@ -35,23 +32,9 @@ public abstract class AbstractProducerStage<O> extends AbstractStage { return this.outputPort; } - @Override - protected void executeStage() { - try { - this.execute(); - } catch (Exception e) { - final FurtherExecution furtherExecution = this.exceptionHandler.onStageException(e, this); - if (furtherExecution == FurtherExecution.TERMINATE) { - throw new StageException(e, this); - } - } - } - @Override public TerminationStrategy getTerminationStrategy() { return TerminationStrategy.BY_SELF_DECISION; } - protected abstract void execute(); - } diff --git a/src/main/java/teetime/framework/AbstractRunnableStage.java b/src/main/java/teetime/framework/AbstractRunnableStage.java index 70890e3b..04d2c800 100644 --- a/src/main/java/teetime/framework/AbstractRunnableStage.java +++ b/src/main/java/teetime/framework/AbstractRunnableStage.java @@ -18,7 +18,7 @@ package teetime.framework; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import teetime.framework.exceptionHandling.StageException; +import teetime.framework.exceptionHandling.TerminateException; abstract class AbstractRunnableStage implements Runnable { @@ -48,7 +48,7 @@ abstract class AbstractRunnableStage implements Runnable { do { executeStage(); } while (!stage.shouldBeTerminated()); - } catch (StageException e) { + } catch (TerminateException e) { this.stage.terminate(); throw e; } finally { diff --git a/src/main/java/teetime/framework/Execution.java b/src/main/java/teetime/framework/Execution.java index 3ef421c5..dec7dc2c 100644 --- a/src/main/java/teetime/framework/Execution.java +++ b/src/main/java/teetime/framework/Execution.java @@ -260,16 +260,8 @@ public final class Execution<T extends Configuration> implements UncaughtExcepti // TODO: implement private void abortEventually() { - for (Thread thread : this.finiteProducerThreads) { - thread.interrupt(); - } - - for (Thread thread : this.consumerThreads) { - thread.interrupt(); - } - - for (Thread thread : this.infiniteProducerThreads) { - thread.interrupt(); + for (Stage stage : configuration.getContext().getThreadableStages().keySet()) { + stage.terminate(); } } @@ -347,7 +339,7 @@ public final class Execution<T extends Configuration> implements UncaughtExcepti /** * @return - * the given ExceptionListenerFactory instance + * the given ExceptionListenerFactory instance * * @since 2.0 */ diff --git a/src/main/java/teetime/framework/Stage.java b/src/main/java/teetime/framework/Stage.java index 5979b9eb..986593ea 100644 --- a/src/main/java/teetime/framework/Stage.java +++ b/src/main/java/teetime/framework/Stage.java @@ -23,6 +23,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import teetime.framework.exceptionHandling.AbstractExceptionListener; +import teetime.framework.exceptionHandling.AbstractExceptionListener.FurtherExecution; +import teetime.framework.exceptionHandling.TerminateException; import teetime.framework.signal.ISignal; import teetime.framework.validation.InvalidPortConnection; @@ -43,7 +45,7 @@ public abstract class Stage { @SuppressWarnings("PMD.LoggerIsNotStaticFinal") protected final Logger logger; - protected AbstractExceptionListener exceptionHandler; + protected AbstractExceptionListener exceptionListener; /** The owning thread of this stage if this stage is directly executed by a {@link AbstractRunnableStage}, <code>null</code> otherwise. */ protected Thread owningThread; @@ -101,7 +103,22 @@ public abstract class Stage { */ public abstract void validateOutputPorts(List<InvalidPortConnection> invalidPortConnections); - protected abstract void executeStage(); + protected void executeStage() { + try { + this.execute(); + } catch (NotEnoughInputException e) { + throw e; + } catch (TerminateException e) { + throw e; + } catch (Exception e) { + final FurtherExecution furtherExecution = this.exceptionListener.onStageException(e, this); + if (furtherExecution == FurtherExecution.TERMINATE) { + throw TerminateException.INSTANCE; + } + } + } + + protected abstract void execute(); protected abstract void onSignal(ISignal signal, InputPort<?> inputPort); @@ -147,7 +164,7 @@ public abstract class Stage { public abstract void onTerminating() throws Exception; protected final void setExceptionHandler(final AbstractExceptionListener exceptionHandler) { - this.exceptionHandler = exceptionHandler; + this.exceptionListener = exceptionHandler; } protected abstract void removeDynamicPort(OutputPort<?> outputPort); diff --git a/src/main/java/teetime/framework/TerminateException.java b/src/main/java/teetime/framework/TerminateException.java deleted file mode 100644 index 43e370bd..00000000 --- a/src/main/java/teetime/framework/TerminateException.java +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Copyright (C) 2015 Christian Wulf, Nelson Tavares de Sousa (http://christianwulf.github.io/teetime) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package teetime.framework; - -public final class TerminateException extends RuntimeException { - - private static final long serialVersionUID = 6841651916837487909L; - - @SuppressWarnings("PMD.AvoidSynchronizedAtMethodLevel") - @Override - public synchronized Throwable fillInStackTrace() { - return this; - } - -} diff --git a/src/main/java/teetime/framework/exceptionHandling/StageException.java b/src/main/java/teetime/framework/exceptionHandling/TerminateException.java similarity index 67% rename from src/main/java/teetime/framework/exceptionHandling/StageException.java rename to src/main/java/teetime/framework/exceptionHandling/TerminateException.java index 7468e439..62b050d2 100644 --- a/src/main/java/teetime/framework/exceptionHandling/StageException.java +++ b/src/main/java/teetime/framework/exceptionHandling/TerminateException.java @@ -15,7 +15,7 @@ */ package teetime.framework.exceptionHandling; -import teetime.framework.Stage; +import teetime.util.StacklessException; /** * Represents an Exception, which is thrown by stages in case of they import teetime.framework.Stage; @@ -23,32 +23,17 @@ import teetime.framework.Stage; * * @since 1.1 */ -public class StageException extends RuntimeException { +public class TerminateException extends StacklessException { + + public static final TerminateException INSTANCE = new TerminateException("Framework Exception"); /** * Generated UID */ private static final long serialVersionUID = 6724637605943897808L; - private final Stage throwingStage; - - public StageException(final Exception e, final Stage throwingStage) { - super(e); - this.throwingStage = throwingStage; - } - - /** - * Returns the stage, which failed with an uncatched exception - * - * @return stage instance, which throws the exception - */ - public Stage getThrowingStage() { - return throwingStage; - } - - @Override - public String toString() { - return getCause() + " in " + throwingStage.getId(); - } + private TerminateException(final String string) { + super(string); + }; } diff --git a/src/main/java/teetime/stage/basic/Delay.java b/src/main/java/teetime/stage/basic/Delay.java index 9ae21027..6cf85e0d 100644 --- a/src/main/java/teetime/stage/basic/Delay.java +++ b/src/main/java/teetime/stage/basic/Delay.java @@ -82,4 +82,10 @@ public final class Delay<T> extends AbstractStage { return this.outputPort; } + @Override + protected void execute() { + // TODO Auto-generated method stub + + } + } diff --git a/src/main/java/teetime/stage/basic/merger/Merger.java b/src/main/java/teetime/stage/basic/merger/Merger.java index 7043b542..a1c427e1 100644 --- a/src/main/java/teetime/stage/basic/merger/Merger.java +++ b/src/main/java/teetime/stage/basic/merger/Merger.java @@ -119,4 +119,10 @@ public class Merger<T> extends AbstractStage { return this.outputPort; } + @Override + protected void execute() { + // TODO Auto-generated method stub + + } + } diff --git a/src/main/java/teetime/util/StacklessException.java b/src/main/java/teetime/util/StacklessException.java index 2d91e7f0..24c9fbbb 100644 --- a/src/main/java/teetime/util/StacklessException.java +++ b/src/main/java/teetime/util/StacklessException.java @@ -19,6 +19,10 @@ public class StacklessException extends RuntimeException { private static final long serialVersionUID = -9040980547278981254L; + public StacklessException(final String string) { + super(string); + } + @Override public synchronized Throwable fillInStackTrace() { // greatly improves performance when constructing return this; diff --git a/src/test/java/teetime/framework/StageTest.java b/src/test/java/teetime/framework/StageTest.java index 1cb4afa0..2cf31d61 100644 --- a/src/test/java/teetime/framework/StageTest.java +++ b/src/test/java/teetime/framework/StageTest.java @@ -49,8 +49,8 @@ public class StageTest { TestConfig tc = new TestConfig(); new Execution<TestConfig>(tc); assertEquals(tc.init.owningThread, tc.delay.owningThread); - assertThat(tc.delay.exceptionHandler, is(notNullValue())); - assertEquals(tc.init.exceptionHandler, tc.delay.exceptionHandler); + assertThat(tc.delay.exceptionListener, is(notNullValue())); + assertEquals(tc.init.exceptionListener, tc.delay.exceptionListener); } private static class TestConfig extends Configuration { diff --git a/src/test/java/teetime/stage/string/TokenizerTest.java b/src/test/java/teetime/stage/string/TokenizerTest.java index cd880320..388a13ce 100644 --- a/src/test/java/teetime/stage/string/TokenizerTest.java +++ b/src/test/java/teetime/stage/string/TokenizerTest.java @@ -55,4 +55,12 @@ public class TokenizerTest { assertThat(results, contains("Hello", "World")); } + public static void main(final String[] args) { + TokenizerTest toker = new TokenizerTest(); + for (int i = 0; i < 1000; i++) { + toker.initializeTokenizer(); + toker.tokenizerShouldSplitMultipleToken(); + } + } + } -- GitLab