Hm... and why does start() behave differently in AALC from ALC? AALC is not used either... so... what is it in there for?
Gary On Wed, Sep 24, 2014 at 7:37 AM, Gary Gregory <garydgreg...@gmail.com> wrote: > Do we really want two LifeCycle abstract classes? > > Will this not be a case -- like plug in builders vs. factory methods -- > where we have two ways of doing the same thing? > > When do I use one vs. the other? You'd need to Javadoc that at least. > > Shouldn't we just have one way of doing this? > > Gary > ---------- Forwarded message ---------- > From: <mattsic...@apache.org> > Date: Wed, Sep 24, 2014 at 1:39 AM > Subject: [2/4] git commit: Add LifeCycle abstract class that uses > AtomicReference. > To: comm...@logging.apache.org > > > Add LifeCycle abstract class that uses AtomicReference. > > > Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo > Commit: > http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/1a332afa > Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/1a332afa > Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/1a332afa > > Branch: refs/heads/master > Commit: 1a332afa33c55a72ae8ab5ec83cd5964de3fdc67 > Parents: b701951 > Author: Matt Sicker <mattsic...@apache.org> > Authored: Sun Sep 21 20:30:50 2014 -0500 > Committer: Matt Sicker <mattsic...@apache.org> > Committed: Tue Sep 23 23:32:49 2014 -0500 > > ---------------------------------------------------------------------- > .../log4j/core/AbstractAtomicLifeCycle.java | 102 +++++++++++++++++++ > .../apache/logging/log4j/core/LifeCycle.java | 9 +- > 2 files changed, 108 insertions(+), 3 deletions(-) > ---------------------------------------------------------------------- > > > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/1a332afa/log4j-core/src/main/java/org/apache/logging/log4j/core/AbstractAtomicLifeCycle.java > ---------------------------------------------------------------------- > diff --git > a/log4j-core/src/main/java/org/apache/logging/log4j/core/AbstractAtomicLifeCycle.java > b/log4j-core/src/main/java/org/apache/logging/log4j/core/AbstractAtomicLifeCycle.java > new file mode 100644 > index 0000000..05a343a > --- /dev/null > +++ > b/log4j-core/src/main/java/org/apache/logging/log4j/core/AbstractAtomicLifeCycle.java > @@ -0,0 +1,102 @@ > +package org.apache.logging.log4j.core; > + > +import java.io.Serializable; > +import java.util.concurrent.atomic.AtomicReference; > + > +import org.apache.logging.log4j.core.util.Throwables; > +import org.apache.logging.log4j.status.StatusLogger; > + > +/** > + * An extensible {@link LifeCycle} using an {@link AtomicReference} to > wrap its {@link LifeCycle.State}. Thus, classes > + * which extend this class will follow the finite state machine as > follows: > + * <ol> > + * <li>When {@link #start()} is called, {@link #doStart()} is called if > and only if this is in the INITIALIZED state or > + * the STOPPED state.</li> > + * <li>Before {@link #doStart()} is called, this will be in the STARTING > state.</li> > + * <li>After {@link #doStart()} is called, this will be in the STARTED > state if no exception was thrown; otherwise, > + * this will be in the INITIALIZED state again, and the exception thrown > will be re-thrown (if unchecked) or wrapped > + * in an {@link java.lang.reflect.UndeclaredThrowableException} and then > rethrown (if checked).</li> > + * <li>When {@link #stop()} is called, {@link #doStop()} is called if and > only if this is in the STARTED state.</li> > + * <li>Before {@link #doStop()} is called, this will be in the STOPPING > state.</li> > + * <li>After {@link #doStop()} is called, this will be in the STOPPED > state. Any exceptions thrown will be re-thrown > + * as described above.</li> > + * </ol> > + * > + * @since 2.1 > + */ > +public abstract class AbstractAtomicLifeCycle implements LifeCycle, > Serializable { > + > + private static final long serialVersionUID = 1L; > + > + protected static final StatusLogger LOGGER = StatusLogger.getLogger(); > + > + private final AtomicReference<State> state = new > AtomicReference<State>(State.INITIALIZED); > + > + @Override > + public void start() { > + if (state.compareAndSet(State.INITIALIZED, State.STARTING) || > + state.compareAndSet(State.STOPPED, State.STARTING)) { > + try { > + doStart(); > + state.set(State.STARTED); > + } catch (final Exception e) { > + state.set(State.INITIALIZED); > + Throwables.rethrow(e); > + } > + } > + } > + > + /** > + * Performs the start-up logic. This method is called only if this is > in the INITIALIZED or STOPPED state. > + * > + * @throws Exception > + */ > + protected abstract void doStart() throws Exception; > + > + @Override > + public void stop() { > + if (state.compareAndSet(State.STARTED, State.STOPPING)) { > + try { > + doStop(); > + } catch (Exception e) { > + Throwables.rethrow(e); > + } finally { > + state.set(State.STOPPED); > + } > + } > + } > + > + /** > + * Performs the tear-down logic. This method is called only if this > is in the STARTED state. > + * > + * @throws Exception > + */ > + protected abstract void doStop() throws Exception; > + > + @Override > + public boolean isStarted() { > + return state.get() == State.STARTED; > + } > + > + @Override > + public boolean isStopped() { > + return state.get() == State.STOPPED; > + } > + > + @Override > + public boolean equals(final Object o) { > + if (this == o) { > + return true; > + } > + if (o == null || getClass() != o.getClass()) { > + return false; > + } > + final AbstractAtomicLifeCycle that = (AbstractAtomicLifeCycle) o; > + return state.equals(that.state); > + } > + > + @Override > + public int hashCode() { > + return state.hashCode(); > + } > +} > > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/1a332afa/log4j-core/src/main/java/org/apache/logging/log4j/core/LifeCycle.java > ---------------------------------------------------------------------- > diff --git > a/log4j-core/src/main/java/org/apache/logging/log4j/core/LifeCycle.java > b/log4j-core/src/main/java/org/apache/logging/log4j/core/LifeCycle.java > index e75ebd5..191edcd 100644 > --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/LifeCycle.java > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/LifeCycle.java > @@ -18,7 +18,7 @@ > package org.apache.logging.log4j.core; > > /** > - * All proper Java frameworks implement some sort of object life cycle. > In Log4j, the main interface for handling > + * Generic object life cycle support interface. In Log4j, the main > interface for handling > * the life cycle context of an object is this one. An object first > starts in the {@link State#INITIALIZED} state > * by default to indicate the class has been loaded. From here, calling > the {@link #start()} method will change this > * state to {@link State#STARTING}. After successfully being started, > this state is changed to {@link State#STARTED}. > @@ -26,9 +26,12 @@ package org.apache.logging.log4j.core; > * stopped, this goes into the {@link State#STOPPED} state. In most > circumstances, implementation classes should > * store their {@link State} in a {@code volatile} field or inside an > * {@link java.util.concurrent.atomic.AtomicReference} dependant on > synchronization and concurrency requirements. > + * > + * @see AbstractLifeCycle > + * @see AbstractAtomicLifeCycle > */ > public interface LifeCycle { > - > + > /** > * Status of a life cycle like a {@link LoggerContext}. > */ > @@ -44,7 +47,7 @@ public interface LifeCycle { > /** Has stopped. */ > STOPPED > } > - > + > void start(); > > void stop(); > > > > > -- > E-Mail: garydgreg...@gmail.com | ggreg...@apache.org > Java Persistence with Hibernate, Second Edition > <http://www.manning.com/bauer3/> > JUnit in Action, Second Edition <http://www.manning.com/tahchiev/> > Spring Batch in Action <http://www.manning.com/templier/> > Blog: http://garygregory.wordpress.com > Home: http://garygregory.com/ > Tweet! http://twitter.com/GaryGregory > -- E-Mail: garydgreg...@gmail.com | ggreg...@apache.org Java Persistence with Hibernate, Second Edition <http://www.manning.com/bauer3/> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/> Spring Batch in Action <http://www.manning.com/templier/> Blog: http://garygregory.wordpress.com Home: http://garygregory.com/ Tweet! http://twitter.com/GaryGregory