You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rg...@apache.org on 2013/04/28 03:44:44 UTC

svn commit: r1476705 - in /logging/log4j/log4j2/trunk: core/src/main/java/org/apache/logging/log4j/core/ core/src/main/java/org/apache/logging/log4j/core/config/ core/src/main/java/org/apache/logging/log4j/core/jmx/ core/src/test/java/org/apache/loggin...

Author: rgoers
Date: Sun Apr 28 01:44:44 2013
New Revision: 1476705

URL: http://svn.apache.org/r1476705
Log:
LOG4J2-223 - Fix LoggerContext start and stop to eliminate IllegalStateException and NoClassDefFound errors.

Modified:
    logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java
    logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/config/Configurator.java
    logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/config/NullConfiguration.java
    logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/jmx/LoggerContextAdmin.java
    logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/core/SimplePerfTest.java
    logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/core/config/AdvertiserTest.java
    logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/core/config/TestConfigurator.java
    logging/log4j/log4j2/trunk/src/changes/changes.xml
    logging/log4j/log4j2/trunk/web/src/test/java/org/apache/logging/log4j/core/web/Log4jContextListenerTest.java

Modified: logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java?rev=1476705&r1=1476704&r2=1476705&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java (original)
+++ logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java Sun Apr 28 01:44:44 2013
@@ -118,7 +118,7 @@ public class LoggerContext implements or
     /**
      * Constructor taking a name external context and a configuration location
      * String. The location must be resolvable to a File.
-     * 
+     *
      * @param name The configuration location.
      * @param externalContext The external context.
      * @param configLocn The configuration location.
@@ -142,7 +142,7 @@ public class LoggerContext implements or
     public void start() {
         if (configLock.tryLock()) {
             try {
-                if (status == Status.INITIALIZED) {
+                if (status == Status.INITIALIZED || status == Status.STOPPED) {
                     status = Status.STARTING;
                     reconfigure();
                     shutdownThread = new ShutdownThread(this);
@@ -160,16 +160,45 @@ public class LoggerContext implements or
         }
     }
 
+    /**
+     * Start with a specific configuration.
+     * @param config The new Configuration.
+     */
+    public void start(final Configuration config) {
+        if (configLock.tryLock()) {
+            try {
+                if (status == Status.INITIALIZED || status == Status.STOPPED) {
+                    shutdownThread = new ShutdownThread(this);
+                    try {
+                        Runtime.getRuntime().addShutdownHook(shutdownThread);
+                    } catch (SecurityException se) {
+                        LOGGER.warn("Unable to register shutdown hook due to security restrictions");
+                        shutdownThread = null;
+                    }
+                    status = Status.STARTED;
+                }
+            } finally {
+                configLock.unlock();
+            }
+        }
+        setConfiguration(config);
+    }
+
     public void stop() {
         configLock.lock();
         try {
+            if (status == Status.STOPPED) {
+                return;
+            }
             status = Status.STOPPING;
             if (shutdownThread != null) {
                 Runtime.getRuntime().removeShutdownHook(shutdownThread);
                 shutdownThread = null;
             }
-            updateLoggers(new NullConfiguration());
-            config.stop();
+            Configuration prev = config;
+            config = new NullConfiguration();
+            updateLoggers();
+            prev.stop();
             externalContext = null;
             status = Status.STOPPED;
         } finally {
@@ -251,7 +280,7 @@ public class LoggerContext implements or
     /**
      * Returns the current Configuration. The Configuration will be replaced
      * when a reconfigure occurs.
-     * 
+     *
      * @return The Configuration.
      */
     public Configuration getConfiguration() {
@@ -280,7 +309,7 @@ public class LoggerContext implements or
      * @param config The new Configuration.
      * @return The previous Configuration.
      */
-    public synchronized Configuration setConfiguration(final Configuration config) {
+    private synchronized Configuration setConfiguration(final Configuration config) {
         if (config == null) {
             throw new NullPointerException("No Configuration was provided");
         }
@@ -357,7 +386,7 @@ public class LoggerContext implements or
     /**
      * Cause a reconfiguration to take place when the underlying configuration
      * file changes.
-     * 
+     *
      * @param reconfigurable The Configuration that can be reconfigured.
      */
     public synchronized void onChange(final Reconfigurable reconfigurable) {

Modified: logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/config/Configurator.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/config/Configurator.java?rev=1476705&r1=1476704&r2=1476705&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/config/Configurator.java (original)
+++ logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/config/Configurator.java Sun Apr 28 01:44:44 2013
@@ -65,7 +65,7 @@ public final class Configurator {
             if (context instanceof LoggerContext) {
                 final LoggerContext ctx = (LoggerContext) context;
                 final Configuration config = ConfigurationFactory.getInstance().getConfiguration(name, configLocation);
-                ctx.setConfiguration(config);
+                ctx.start(config);
                 return ctx;
             } else {
                 LOGGER.error("LogManager returned an instance of {} which does not implement {}. Unable to initialize Log4j",
@@ -97,7 +97,7 @@ public final class Configurator {
             if (context instanceof LoggerContext) {
                 final LoggerContext ctx = (LoggerContext) context;
                 final Configuration config = ConfigurationFactory.getInstance().getConfiguration(source);
-                ctx.setConfiguration(config);
+                ctx.start(config);
                 return ctx;
             } else {
                 LOGGER.error("LogManager returned an instance of {} which does not implement {}. Unable to initialize Log4j",
@@ -115,7 +115,7 @@ public final class Configurator {
      */
     public static void shutdown(final LoggerContext ctx) {
         if (ctx != null) {
-            ctx.setConfiguration(new DefaultConfiguration());
+            ctx.stop();
         }
     }
 }

Modified: logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/config/NullConfiguration.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/config/NullConfiguration.java?rev=1476705&r1=1476704&r2=1476705&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/config/NullConfiguration.java (original)
+++ logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/config/NullConfiguration.java Sun Apr 28 01:44:44 2013
@@ -23,7 +23,7 @@ import org.apache.logging.log4j.Level;
  */
 public class NullConfiguration extends BaseConfiguration {
 
-    private static final String NULL_NAME = "Null";
+    public static final String NULL_NAME = "Null";
 
     public NullConfiguration() {
 

Modified: logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/jmx/LoggerContextAdmin.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/jmx/LoggerContextAdmin.java?rev=1476705&r1=1476704&r2=1476705&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/jmx/LoggerContextAdmin.java (original)
+++ logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/jmx/LoggerContextAdmin.java Sun Apr 28 01:44:44 2013
@@ -61,7 +61,7 @@ public class LoggerContextAdmin extends 
     /**
      * Constructs a new {@code LoggerContextAdmin} with the {@code Executor} to
      * be used for sending {@code Notification}s asynchronously to listeners.
-     * 
+     *
      * @param executor
      */
     public LoggerContextAdmin(LoggerContext loggerContext, Executor executor) {
@@ -166,7 +166,7 @@ public class LoggerContextAdmin extends 
             ConfigurationSource source = new ConfigurationSource(in);
             Configuration updated = ConfigurationFactory.getInstance()
                     .getConfiguration(source);
-            loggerContext.setConfiguration(updated);
+            loggerContext.start(updated);
             LOGGER.debug("Completed remote request to reconfigure from config text.");
         } catch (Exception ex) {
             customConfigText = old;

Modified: logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/core/SimplePerfTest.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/core/SimplePerfTest.java?rev=1476705&r1=1476704&r2=1476705&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/core/SimplePerfTest.java (original)
+++ logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/core/SimplePerfTest.java Sun Apr 28 01:44:44 2013
@@ -46,7 +46,7 @@ public class SimplePerfTest {
         final Configuration config = ((LoggerContext)LogManager.getContext()).getConfiguration();
         if (!DefaultConfiguration.DEFAULT_NAME.equals(config.getName())) {
             System.out.println("Configuration was " + config.getName());
-            ((LoggerContext)LogManager.getContext()).setConfiguration(new DefaultConfiguration());
+            ((LoggerContext)LogManager.getContext()).start(new DefaultConfiguration());
         }
 
         for (int i=0; i < WARMUP; ++i) {

Modified: logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/core/config/AdvertiserTest.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/core/config/AdvertiserTest.java?rev=1476705&r1=1476704&r2=1476705&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/core/config/AdvertiserTest.java (original)
+++ logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/core/config/AdvertiserTest.java Sun Apr 28 01:44:44 2013
@@ -92,7 +92,7 @@ public class AdvertiserTest {
     public void testAdvertisementsFound() {
         verifyExpectedEntriesAdvertised(InMemoryAdvertiser.getAdvertisedEntries());
     }
-    
+
     @Test
     public void testAdvertisementsRemovedOnConfigStop() {
         verifyExpectedEntriesAdvertised(InMemoryAdvertiser.getAdvertisedEntries());
@@ -102,9 +102,9 @@ public class AdvertiserTest {
 
         Map<Object, Map<String, String>> entries = InMemoryAdvertiser.getAdvertisedEntries();
         assertTrue("Entries found: " + entries, entries.isEmpty());
-        
+
         //reconfigure for subsequent testing
-        ctx.reconfigure();
+        ctx.start();
     }
 
     @Test
@@ -116,8 +116,8 @@ public class AdvertiserTest {
 
         Map<Object, Map<String, String>> entries = InMemoryAdvertiser.getAdvertisedEntries();
         assertTrue("Entries found: " + entries, entries.isEmpty());
-        
-        ctx.reconfigure();
+
+        ctx.start();
 
         verifyExpectedEntriesAdvertised(InMemoryAdvertiser.getAdvertisedEntries());
     }

Modified: logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/core/config/TestConfigurator.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/core/config/TestConfigurator.java?rev=1476705&r1=1476704&r2=1476705&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/core/config/TestConfigurator.java (original)
+++ logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/core/config/TestConfigurator.java Sun Apr 28 01:44:44 2013
@@ -76,8 +76,8 @@ public class TestConfigurator {
         assertTrue("Wrong configuration", map.containsKey("List"));
         Configurator.shutdown(ctx);
         config = ctx.getConfiguration();
-        assertTrue("Incorrect Configuration. Expected " + DefaultConfiguration.DEFAULT_NAME + " but found " +
-            config.getName(), DefaultConfiguration.DEFAULT_NAME.equals(config.getName()));
+        assertTrue("Incorrect Configuration. Expected " + NullConfiguration.NULL_NAME + " but found " +
+            config.getName(), NullConfiguration.NULL_NAME.equals(config.getName()));
     }
 
     @Test
@@ -96,8 +96,8 @@ public class TestConfigurator {
         assertTrue("Wrong configuration", map.containsKey("List"));
         Configurator.shutdown(ctx);
         config = ctx.getConfiguration();
-        assertTrue("Incorrect Configuration. Expected " + DefaultConfiguration.DEFAULT_NAME + " but found " +
-            config.getName(), DefaultConfiguration.DEFAULT_NAME.equals(config.getName()));
+        assertTrue("Incorrect Configuration. Expected " + NullConfiguration.NULL_NAME + " but found " +
+            config.getName(), NullConfiguration.NULL_NAME.equals(config.getName()));
     }
 
     @Test
@@ -116,8 +116,8 @@ public class TestConfigurator {
         assertTrue("Wrong configuration", map.containsKey("List"));
         Configurator.shutdown(ctx);
         config = ctx.getConfiguration();
-        assertTrue("Incorrect Configuration. Expected " + DefaultConfiguration.DEFAULT_NAME + " but found " +
-            config.getName(), DefaultConfiguration.DEFAULT_NAME.equals(config.getName()));
+        assertTrue("Incorrect Configuration. Expected " + NullConfiguration.NULL_NAME + " but found " +
+            config.getName(), NullConfiguration.NULL_NAME.equals(config.getName()));
     }
 
     @Test
@@ -133,8 +133,8 @@ public class TestConfigurator {
         assertTrue("Wrong configuration", map.containsKey("List"));
         Configurator.shutdown(ctx);
         config = ctx.getConfiguration();
-        assertTrue("Incorrect Configuration. Expected " + DefaultConfiguration.DEFAULT_NAME + " but found " +
-            config.getName(), DefaultConfiguration.DEFAULT_NAME.equals(config.getName()));
+        assertTrue("Incorrect Configuration. Expected " + NullConfiguration.NULL_NAME + " but found " +
+            config.getName(), NullConfiguration.NULL_NAME.equals(config.getName()));
     }
 
     @Test
@@ -150,8 +150,8 @@ public class TestConfigurator {
         assertTrue("Wrong configuration", map.containsKey("List"));
         Configurator.shutdown(ctx);
         config = ctx.getConfiguration();
-        assertTrue("Incorrect Configuration. Expected " + DefaultConfiguration.DEFAULT_NAME + " but found " +
-            config.getName(), DefaultConfiguration.DEFAULT_NAME.equals(config.getName()));
+        assertTrue("Incorrect Configuration. Expected " + NullConfiguration.NULL_NAME + " but found " +
+            config.getName(), NullConfiguration.NULL_NAME.equals(config.getName()));
     }
 
     @Test
@@ -177,8 +177,8 @@ public class TestConfigurator {
         assertTrue("Configuration not reset", newConfig != config);
         Configurator.shutdown(ctx);
         config = ctx.getConfiguration();
-        assertTrue("Incorrect Configuration. Expected " + DefaultConfiguration.DEFAULT_NAME + " but found " +
-            config.getName(), DefaultConfiguration.DEFAULT_NAME.equals(config.getName()));
+        assertTrue("Incorrect Configuration. Expected " + NullConfiguration.NULL_NAME + " but found " +
+            config.getName(), NullConfiguration.NULL_NAME.equals(config.getName()));
     }
 
     @Test

Modified: logging/log4j/log4j2/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/src/changes/changes.xml?rev=1476705&r1=1476704&r2=1476705&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/src/changes/changes.xml (original)
+++ logging/log4j/log4j2/trunk/src/changes/changes.xml Sun Apr 28 01:44:44 2013
@@ -23,7 +23,10 @@
 
   <body>
     <release version="2.0-beta6" date="@TBD@" description="Bug fixes and enhancements">
-      <action issue="LOG4J2-221" dev-"rgoers" type="fix" due-to="Nick Williams">
+      <action issue="LOG4J2-223" dev="rgoers" type="fix">
+        Fix LoggerContext start and stop to eliminate IllegalStateException and NoClassDefFound errors.
+      </action>
+      <action issue="LOG4J2-221" dev="rgoers" type="fix" due-to="Nick Williams">
         Remove hundreds of compiler warnings.
       </action>
       <action issue="LOG4J2-215" dev="rpopma" type="fix">

Modified: logging/log4j/log4j2/trunk/web/src/test/java/org/apache/logging/log4j/core/web/Log4jContextListenerTest.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/web/src/test/java/org/apache/logging/log4j/core/web/Log4jContextListenerTest.java?rev=1476705&r1=1476704&r2=1476705&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/web/src/test/java/org/apache/logging/log4j/core/web/Log4jContextListenerTest.java (original)
+++ logging/log4j/log4j2/trunk/web/src/test/java/org/apache/logging/log4j/core/web/Log4jContextListenerTest.java Sun Apr 28 01:44:44 2013
@@ -20,7 +20,7 @@ import org.apache.logging.log4j.LogManag
 import org.apache.logging.log4j.core.Appender;
 import org.apache.logging.log4j.core.LoggerContext;
 import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.DefaultConfiguration;
+import org.apache.logging.log4j.core.config.NullConfiguration;
 import org.junit.Test;
 
 import javax.servlet.RequestDispatcher;
@@ -65,8 +65,8 @@ public class Log4jContextListenerTest {
         assertTrue("Wrong configuration", map.containsKey("List"));
         listener.contextDestroyed(event);
         config = ctx.getConfiguration();
-        assertTrue("Incorrect Configuration. Expected " + DefaultConfiguration.DEFAULT_NAME + " but found " +
-            config.getName(), DefaultConfiguration.DEFAULT_NAME.equals(config.getName()));
+        assertTrue("Incorrect Configuration. Expected " + NullConfiguration.NULL_NAME + " but found " +
+            config.getName(), NullConfiguration.NULL_NAME.equals(config.getName()));
     }
 
     @Test
@@ -88,8 +88,8 @@ public class Log4jContextListenerTest {
         assertTrue("Wrong configuration", map.containsKey("List"));
         listener.contextDestroyed(event);
         config = ctx.getConfiguration();
-        assertTrue("Incorrect Configuration. Expected " + DefaultConfiguration.DEFAULT_NAME + " but found " +
-            config.getName(), DefaultConfiguration.DEFAULT_NAME.equals(config.getName()));
+        assertTrue("Incorrect Configuration. Expected " + NullConfiguration.NULL_NAME + " but found " +
+            config.getName(), NullConfiguration.NULL_NAME.equals(config.getName()));
     }
 
     @Test
@@ -110,8 +110,8 @@ public class Log4jContextListenerTest {
         assertTrue("Wrong configuration", map.containsKey("List"));
         listener.contextDestroyed(event);
         config = ctx.getConfiguration();
-        assertTrue("Incorrect Configuration. Expected " + DefaultConfiguration.DEFAULT_NAME + " but found " +
-            config.getName(), DefaultConfiguration.DEFAULT_NAME.equals(config.getName()));
+        assertTrue("Incorrect Configuration. Expected " + NullConfiguration.NULL_NAME + " but found " +
+            config.getName(), NullConfiguration.NULL_NAME.equals(config.getName()));
     }