On Wed, Sep 24, 2014 at 10:07 PM, Matt Sicker <boa...@gmail.com> wrote:
> Looks like I meant to add this to a different branch. This is how I think > LifeCycle classes should work, though, so feedback would be good. If > possible, I'd like to replace the current ALC with the proposed AALC (which > would just be renamed to AbstractLifeCycle). > Matt, if the intention was for this to go into a different branch, then perhaps it is best to move these changes to a different branch. I haven't had a chance to look at this in detail but it looks like quite a big change to be making a few days before the release... For me I don't think this week I'll be able to give it the time to review that it deserves... > > On 24 September 2014 06:43, Gary Gregory <garydgreg...@gmail.com> wrote: > >> 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 >> > > > > -- > Matt Sicker <boa...@gmail.com> >