This is an automated email from the ASF dual-hosted git repository. markt pushed a commit to branch 7.0.x in repository https://gitbox.apache.org/repos/asf/tomcat.git
commit d0685f927186da2e0be56c28371e5207ee09ed20 Author: Mark Thomas <ma...@apache.org> AuthorDate: Fri Oct 7 08:54:34 2016 +0000 Add throwOnFailure to LifecycleBase. Defaults to no change to current behaviour. --- java/org/apache/catalina/util/LifecycleBase.java | 64 ++++++++++++++++++------ 1 file changed, 50 insertions(+), 14 deletions(-) diff --git a/java/org/apache/catalina/util/LifecycleBase.java b/java/org/apache/catalina/util/LifecycleBase.java index 6195768..4b9bc2a 100644 --- a/java/org/apache/catalina/util/LifecycleBase.java +++ b/java/org/apache/catalina/util/LifecycleBase.java @@ -53,6 +53,37 @@ public abstract class LifecycleBase implements Lifecycle { private volatile LifecycleState state = LifecycleState.NEW; + private boolean throwOnFailure = true; + + + /** + * Will a {@link LifecycleException} thrown by a sub-class during + * {@link #initInternal()}, {@link #startInternal()}, + * {@link #stopInternal()} or {@link #destroyInternal()} be re-thrown for + * the caller to handle or will it be logged instead? + * + * @return {@code true} if the exception will be re-thrown, otherwise + * {@code false} + */ + public boolean getThrowOnFailure() { + return throwOnFailure; + } + + + /** + * Configure if a {@link LifecycleException} thrown by a sub-class during + * {@link #initInternal()}, {@link #startInternal()}, + * {@link #stopInternal()} or {@link #destroyInternal()} will be re-thrown + * for the caller to handle or if it will be logged instead. + * + * @param throwOnFailure {@code true} if the exception should be re-thrown, + * otherwise {@code false} + */ + public void setThrowOnFailure(boolean throwOnFailure) { + this.throwOnFailure = throwOnFailure; + } + + /** * {@inheritDoc} */ @@ -105,10 +136,7 @@ public abstract class LifecycleBase implements Lifecycle { initInternal(); setStateInternal(LifecycleState.INITIALIZED, null, false); } catch (Throwable t) { - ExceptionUtils.handleThrowable(t); - setStateInternal(LifecycleState.FAILED, null, false); - throw new LifecycleException( - sm.getString("lifecycleBase.initFail",toString()), t); + handleSubClassException(t, "lifecycleBase.initFail", toString()); } } @@ -167,9 +195,7 @@ public abstract class LifecycleBase implements Lifecycle { } catch (Throwable t) { // This is an 'uncontrolled' failure so put the component into the // FAILED state and throw an exception. - ExceptionUtils.handleThrowable(t); - setStateInternal(LifecycleState.FAILED, null, false); - throw new LifecycleException(sm.getString("lifecycleBase.startFail", toString()), t); + handleSubClassException(t, "lifecycleBase.startFail", toString()); } } @@ -238,9 +264,7 @@ public abstract class LifecycleBase implements Lifecycle { setStateInternal(LifecycleState.STOPPED, null, false); } catch (Throwable t) { - ExceptionUtils.handleThrowable(t); - setStateInternal(LifecycleState.FAILED, null, false); - throw new LifecycleException(sm.getString("lifecycleBase.stopFail",toString()), t); + handleSubClassException(t, "lifecycleBase.stopFail", toString()); } finally { if (this instanceof Lifecycle.SingleUse) { // Complete stop process first @@ -297,10 +321,7 @@ public abstract class LifecycleBase implements Lifecycle { destroyInternal(); setStateInternal(LifecycleState.DESTROYED, null, false); } catch (Throwable t) { - ExceptionUtils.handleThrowable(t); - setStateInternal(LifecycleState.FAILED, null, false); - throw new LifecycleException( - sm.getString("lifecycleBase.destroyFail",toString()), t); + handleSubClassException(t, "lifecycleBase.destroyFail", toString()); } } @@ -408,4 +429,19 @@ public abstract class LifecycleBase implements Lifecycle { String msg = sm.getString("lifecycleBase.invalidTransition", type, toString(), state); throw new LifecycleException(msg); } + + + private void handleSubClassException(Throwable t, String key, Object... args) throws LifecycleException { + ExceptionUtils.handleThrowable(t); + setStateInternal(LifecycleState.FAILED, null, false); + String msg = sm.getString(key, args); + if (getThrowOnFailure()) { + if (!(t instanceof LifecycleException)) { + t = new LifecycleException(msg, t); + } + throw (LifecycleException) t; + } else { + log.error(msg, t); + } + } } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org