Reverted the commit.

On 24 September 2014 14:30, Matt Sicker <boa...@gmail.com> wrote:

> I'll move it to a branch tonight, sorry about that. And I might be wrong
> about thread safety, but using AtomicReference<State> seems to make more
> sense.
>
> On 24 September 2014 11:47, Gary Gregory <garydgreg...@gmail.com> wrote:
>
>> On Wed, Sep 24, 2014 at 12:03 PM, Remko Popma <remko.po...@gmail.com>
>> wrote:
>>
>>>
>>>
>>> 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).
>>>>
>>>
>> I have to agree here, this would be good to see in a branch for
>> consideration in 2.2. Especially since this is unlikely to be a drop-in
>> replacement.
>>
>> Gary
>>
>>
>>>
>>> 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>
>>>>
>>>
>>>
>>
>>
>> --
>> 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>
>



-- 
Matt Sicker <boa...@gmail.com>

Reply via email to