Then the method name would be terminate?  I could live with that.  I also like 
the fact that when something goes wrong with it then it would be interminable 
;-)

Ralph

> On Jan 25, 2016, at 5:18 PM, Matt Sicker <[email protected]> wrote:
> 
> How about Terminable? It's even a real word to boot.
> 
> On 25 January 2016 at 18:15, Ralph Goers <[email protected] 
> <mailto:[email protected]>> wrote:
> Yes, well - Serializable actually sounds like it should be a real word. 
> Shutdownable doesn’t - in fact, my mail editor just split it into two words 
> to “help” me. I take a different view. A class that declares it implements an 
> interface isn’t “capable” of anything - it just implements the interface. The 
> interface name is what tells you that the implementing class is able to do 
> something, which is why you have Comparable instead of just Compare, 
> Cloneable instead of just Clone,  or Closeable instead of just Close. Would 
> you want Stop instead of Stoppable?  I view “able” as just a shorthand way of 
> saying “Capable”, but unfortunately that just doesn’t sound right with 
> Shutdown (at least to me).
> 
> Here are some “able” alternatives - presumably each would have a 
> corresponding method name instead of shutdown:
> Terminateable.
> Completeable.
> Concludeable.
> Haltable.
> Dismissable.
> Expireable.
> 
> I suppose we could also use Stoppable but that seems odd since stop is part 
> of Lifecycle.
> 
> Got a preference?
> 
> Ralph
> 
> 
> 
>> On Jan 25, 2016, at 4:35 PM, Gary Gregory <[email protected] 
>> <mailto:[email protected]>> wrote:
>> 
>> I see some interfaces with "*Capable*" in the name here and there in the 
>> FOSS world (but not in the JRE) so I am a little more comfortable with it. 
>> 
>> I still see plain old "Shutdown" as simpler. 
>> 
>> I think I've boiled down my feel for this name to the fact that the Capable 
>> postfix is redundant since a class implementing any interface is "capable" 
>> of that functionality. IOW we have Serializable vs. SerializationCabable, 
>> which means the same thing.
>> 
>> Gary
>> 
>> On Mon, Jan 25, 2016 at 7:27 AM, Ralph Goers <[email protected] 
>> <mailto:[email protected]>> wrote:
>> What does it feel weird to you?  To be honest, I originally named the 
>> interface ‘Shutdown” and then changed it since it really is about 
>> implementing a behavior and “Shutdown” alone doesn’t really describe that.
>> 
>> Ralph
>> 
>>> On Jan 24, 2016, at 11:09 PM, Gary Gregory <[email protected] 
>>> <mailto:[email protected]>> wrote:
>>> 
>>> On Sun, Jan 24, 2016 at 10:07 PM, Gary Gregory <[email protected] 
>>> <mailto:[email protected]>> wrote:
>>> On Sun, Jan 24, 2016 at 1:54 PM, Ralph Goers <[email protected] 
>>> <mailto:[email protected]>> wrote:
>>> Yes, Shutdownable is too weird. 
>>> 
>>> How about calling it simply "Shutdown" then? FooCapable feels weird to me.
>>> 
>>> Can anyone think of other (one-method or not) optional feature-like 
>>> interfaces in the JRE or other code base?
>>> 
>>> hm... ShutdownService?
>>> 
>>> Gary
>>>  
>>> 
>>> Gary
>>> 
>>> Closeable would imply there is a close method, not a shutdown method.  I 
>>> have my doubts about the try-with-resources use case here.  Virtually all 
>>> usages are probably going to be to disable automatic shutdown and then the 
>>> user placing the shutdown call somewhere they can control, which probably 
>>> will have nothing to do with initialization of logging. 
>>> 
>>> Ralph
>>> 
>>>> On Jan 24, 2016, at 2:43 PM, Gary Gregory <[email protected] 
>>>> <mailto:[email protected]>> wrote:
>>>> 
>>>> Resending, got a error from my phone...
>>>> 
>>>> ---------- Forwarded message ----------
>>>> From: "Gary Gregory" <[email protected] 
>>>> <mailto:[email protected]>>
>>>> Date: Jan 24, 2016 1:41 PM
>>>> Subject: Re: logging-log4j2 git commit: LOG4J2-124 - Add shutdown methods 
>>>> to LogManager
>>>> To: <[email protected] <mailto:[email protected]>>
>>>> Cc: 
>>>> 
>>>> Hi all,
>>>> 
>>>> Any reason not use the usual -able postfix instead of ShutdownCapable: 
>>>> Shutdownable sounds too weird? What about reusing plain old Closeable? 
>>>> That means you could use the context in a try-with-resources block, a 
>>>> bonus.
>>>> 
>>>> Gary 
>>>> 
>>>> On Jan 24, 2016 10:18 AM, <[email protected] <mailto:[email protected]>> 
>>>> wrote:
>>>> Repository: logging-log4j2
>>>> Updated Branches:
>>>>   refs/heads/master 7d3aac4b9 -> 2df3f0e72
>>>> 
>>>> 
>>>> LOG4J2-124 - Add shutdown methods to LogManager
>>>> 
>>>> 
>>>> Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo 
>>>> <http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo>
>>>> Commit: 
>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/2df3f0e7 
>>>> <http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/2df3f0e7>
>>>> Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/2df3f0e7 
>>>> <http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/2df3f0e7>
>>>> Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/2df3f0e7 
>>>> <http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/2df3f0e7>
>>>> 
>>>> Branch: refs/heads/master
>>>> Commit: 2df3f0e7262c90e3fe1700f053eebf18491650d9
>>>> Parents: 7d3aac4
>>>> Author: Ralph Goers <[email protected] <mailto:[email protected]>>
>>>> Authored: Sun Jan 24 11:18:41 2016 -0700
>>>> Committer: Ralph Goers <[email protected] <mailto:[email protected]>>
>>>> Committed: Sun Jan 24 11:18:41 2016 -0700
>>>> 
>>>> ----------------------------------------------------------------------
>>>>  .../org/apache/logging/log4j/LogManager.java    | 62 ++++++++++++++++++++
>>>>  .../logging/log4j/spi/ShutdownCapable.java      | 17 ++++++
>>>>  .../apache/logging/log4j/LogManagerTest.java    |  7 +++
>>>>  .../logging/log4j/core/LoggerContext.java       |  8 ++-
>>>>  4 files changed, 93 insertions(+), 1 deletion(-)
>>>> ----------------------------------------------------------------------
>>>> 
>>>> 
>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2df3f0e7/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java
>>>>  
>>>> <http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2df3f0e7/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java>
>>>> ----------------------------------------------------------------------
>>>> diff --git 
>>>> a/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java 
>>>> b/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java
>>>> index f10e5a8..64c6ee5 100644
>>>> --- a/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java
>>>> +++ b/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java
>>>> @@ -27,6 +27,7 @@ import 
>>>> org.apache.logging.log4j.simple.SimpleLoggerContextFactory;
>>>>  import org.apache.logging.log4j.spi.LoggerContext;
>>>>  import org.apache.logging.log4j.spi.LoggerContextFactory;
>>>>  import org.apache.logging.log4j.spi.Provider;
>>>> +import org.apache.logging.log4j.spi.ShutdownCapable;
>>>>  import org.apache.logging.log4j.status.StatusLogger;
>>>>  import org.apache.logging.log4j.util.LoaderUtil;
>>>>  import org.apache.logging.log4j.util.PropertiesUtil;
>>>> @@ -285,6 +286,67 @@ public class LogManager {
>>>>      }
>>>> 
>>>>      /**
>>>> +     * Shutdown using the default LoggerContext.
>>>> +     * @since 2.6
>>>> +     */
>>>> +    public static void shutdown() {
>>>> +        shutdown(getContext());
>>>> +    }
>>>> +
>>>> +    /**
>>>> +     * Shutdown the logging system if the logging system supports it.
>>>> +     * @param currentContext if true the LoggerContext for the caller of 
>>>> this method will be used.
>>>> +     * @since 2.6
>>>> +     */
>>>> +    public static void shutdown(boolean currentContext) {
>>>> +        shutdown(getContext(currentContext));
>>>> +    }
>>>> +
>>>> +    /**
>>>> +     * Shutdown the logging system if the logging system supports it.
>>>> +     * @param loader The ClassLoader for the context. If null the context 
>>>> will attempt to determine the appropriate
>>>> +     *            ClassLoader.
>>>> +     * @param currentContext if false the LoggerContext appropriate for 
>>>> the caller of this method will be used.
>>>> +     * @since 2.6
>>>> +     */
>>>> +    public static void shutdown(final ClassLoader loader, final boolean 
>>>> currentContext) {
>>>> +        shutdown(getContext(loader, currentContext));
>>>> +    }
>>>> +
>>>> +    /**
>>>> +     * Shutdown the logging system if the logging system supports it.
>>>> +     * @param context the LoggerContext.
>>>> +     * @since 2.6
>>>> +     */
>>>> +    public static void shutdown(LoggerContext context) {
>>>> +        if (context != null && context instanceof ShutdownCapable) {
>>>> +            ((ShutdownCapable) context).shutdown();
>>>> +        }
>>>> +    }
>>>> +
>>>> +    /**
>>>> +     * Shutdown the logging system if the logging system supports it.
>>>> +     * @param fqcn The fully qualified class name of the Class that this 
>>>> method is a member of.
>>>> +     * @param currentContext if false the LoggerContext appropriate for 
>>>> the caller of this method will be used.
>>>> +     * @since 2.6
>>>> +     */
>>>> +    protected static void shutdown(final String fqcn, final boolean 
>>>> currentContext) {
>>>> +        shutdown(getContext(fqcn, currentContext));
>>>> +    }
>>>> +
>>>> +    /**
>>>> +     * Shutdown the logging system if the logging system supports it.
>>>> +     * @param fqcn The fully qualified class name of the Class that this 
>>>> method is a member of.
>>>> +     * @param loader The ClassLoader for the context. If null the context 
>>>> will attempt to determine the appropriate
>>>> +     *            ClassLoader.
>>>> +     * @param currentContext if false the LoggerContext appropriate for 
>>>> the caller of this method will be used.
>>>> +     * @since 2.6
>>>> +     */
>>>> +    protected static void shutdown(final String fqcn, final ClassLoader 
>>>> loader, final boolean currentContext) {
>>>> +        shutdown(getContext(fqcn, loader, currentContext));
>>>> +    }
>>>> +
>>>> +    /**
>>>>       * Returns the current LoggerContextFactory.
>>>>       *
>>>>       * @return The LoggerContextFactory.
>>>> 
>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2df3f0e7/log4j-api/src/main/java/org/apache/logging/log4j/spi/ShutdownCapable.java
>>>>  
>>>> <http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2df3f0e7/log4j-api/src/main/java/org/apache/logging/log4j/spi/ShutdownCapable.java>
>>>> ----------------------------------------------------------------------
>>>> diff --git 
>>>> a/log4j-api/src/main/java/org/apache/logging/log4j/spi/ShutdownCapable.java
>>>>  
>>>> b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ShutdownCapable.java
>>>> new file mode 100644
>>>> index 0000000..a46ef60
>>>> --- /dev/null
>>>> +++ 
>>>> b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ShutdownCapable.java
>>>> @@ -0,0 +1,17 @@
>>>> +/*
>>>> + * Copyright (c) 2016 Nextiva, Inc. to Present.
>>>> + * All rights reserved.
>>>> + */
>>>> +package org.apache.logging.log4j.spi;
>>>> +
>>>> +/**
>>>> + * Interface to be implemented by LoggerContext's that provide a shutdown 
>>>> method.
>>>> + * @since 2.6
>>>> + */
>>>> +public interface ShutdownCapable {
>>>> +
>>>> +    /**
>>>> +     * Requests that the logging implementation shut down.
>>>> +     */
>>>> +    void shutdown();
>>>> +}
>>>> 
>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2df3f0e7/log4j-api/src/test/java/org/apache/logging/log4j/LogManagerTest.java
>>>>  
>>>> <http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2df3f0e7/log4j-api/src/test/java/org/apache/logging/log4j/LogManagerTest.java>
>>>> ----------------------------------------------------------------------
>>>> diff --git 
>>>> a/log4j-api/src/test/java/org/apache/logging/log4j/LogManagerTest.java 
>>>> b/log4j-api/src/test/java/org/apache/logging/log4j/LogManagerTest.java
>>>> index 48f0eea..596a9f2 100644
>>>> --- a/log4j-api/src/test/java/org/apache/logging/log4j/LogManagerTest.java
>>>> +++ b/log4j-api/src/test/java/org/apache/logging/log4j/LogManagerTest.java
>>>> @@ -17,6 +17,7 @@
>>>>  package org.apache.logging.log4j;
>>>> 
>>>>  import org.apache.logging.log4j.message.ParameterizedMessageFactory;
>>>> +import org.apache.logging.log4j.spi.LoggerContext;
>>>>  import org.junit.Test;
>>>> 
>>>>  import static org.junit.Assert.*;
>>>> @@ -53,4 +54,10 @@ public class LogManagerTest {
>>>>          assertNotNull("No Logger returned", logger);
>>>>          assertTrue("Incorrect Logger name: " + 
>>>> logger.getName(),LogManagerTest.class.getName().equals(logger.getName()));
>>>>      }
>>>> +
>>>> +    @Test
>>>> +    public void testShutdown() {
>>>> +        LoggerContext loggerContext = LogManager.getContext(false);
>>>> +        LogManager.shutdown(loggerContext);
>>>> +    }
>>>>  }
>>>> 
>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2df3f0e7/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java
>>>>  
>>>> <http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2df3f0e7/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java>
>>>> ----------------------------------------------------------------------
>>>> diff --git 
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java
>>>>  
>>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java
>>>> index 42efbb5..fcdfc16 100644
>>>> --- 
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java
>>>> +++ 
>>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java
>>>> @@ -45,6 +45,7 @@ import org.apache.logging.log4j.message.MessageFactory;
>>>>  import org.apache.logging.log4j.spi.AbstractLogger;
>>>>  import org.apache.logging.log4j.spi.LoggerContextFactory;
>>>>  import org.apache.logging.log4j.spi.LoggerContextKey;
>>>> +import org.apache.logging.log4j.spi.ShutdownCapable;
>>>> 
>>>>  import static 
>>>> org.apache.logging.log4j.core.util.ShutdownCallbackRegistry.*;
>>>> 
>>>> @@ -54,7 +55,7 @@ import static 
>>>> org.apache.logging.log4j.core.util.ShutdownCallbackRegistry.*;
>>>>   * filters, etc and will be atomically updated whenever a reconfigure 
>>>> occurs.
>>>>   */
>>>>  public class LoggerContext extends AbstractLifeCycle implements 
>>>> org.apache.logging.log4j.spi.LoggerContext,
>>>> -        ConfigurationListener {
>>>> +        ShutdownCapable, ConfigurationListener {
>>>> 
>>>>      /**
>>>>       * Property name of the property change event fired if the 
>>>> configuration is changed.
>>>> @@ -278,6 +279,11 @@ public class LoggerContext extends AbstractLifeCycle 
>>>> implements org.apache.loggi
>>>>      }
>>>> 
>>>>      @Override
>>>> +    public void shutdown() {
>>>> +        stop();
>>>> +    }
>>>> +
>>>> +    @Override
>>>>      public void stop() {
>>>>          LOGGER.debug("Stopping LoggerContext[name={}, {}]...", getName(), 
>>>> this);
>>>>          configLock.lock();
>>>> 
>>> 
>>> 
>>> 
>>> 
>>> -- 
>>> E-Mail: [email protected] <mailto:[email protected]> | 
>>> [email protected]  <mailto:[email protected]>
>>> 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 <http://garygregory.wordpress.com/> 
>>> Home: http://garygregory.com/ <http://garygregory.com/>
>>> Tweet! http://twitter.com/GaryGregory <http://twitter.com/GaryGregory>
>>> 
>>> 
>>> -- 
>>> E-Mail: [email protected] <mailto:[email protected]> | 
>>> [email protected]  <mailto:[email protected]>
>>> 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 <http://garygregory.wordpress.com/> 
>>> Home: http://garygregory.com/ <http://garygregory.com/>
>>> Tweet! http://twitter.com/GaryGregory <http://twitter.com/GaryGregory>
>> 
>> 
>> 
>> -- 
>> E-Mail: [email protected] <mailto:[email protected]> | 
>> [email protected]  <mailto:[email protected]>
>> 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 <http://garygregory.wordpress.com/> 
>> Home: http://garygregory.com/ <http://garygregory.com/>
>> Tweet! http://twitter.com/GaryGregory <http://twitter.com/GaryGregory>
> 
> 
> 
> -- 
> Matt Sicker <[email protected] <mailto:[email protected]>>

Reply via email to