Author: rmannibucau
Date: Sun Sep  8 09:22:22 2013
New Revision: 1520847

URL: http://svn.apache.org/r1520847
Log:
OPENEJB-2037 better handling of logging for EJBContainer

Modified:
    
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/OpenEjbContainer.java
    
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/JuliLogStreamFactory.java

Modified: 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/OpenEjbContainer.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/OpenEjbContainer.java?rev=1520847&r1=1520846&r2=1520847&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/OpenEjbContainer.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/OpenEjbContainer.java
 Sun Sep  8 09:22:22 2013
@@ -92,22 +92,19 @@ import static org.apache.openejb.cdi.Sco
  * @version $Rev$ $Date$
  */
 public class OpenEjbContainer extends EJBContainer {
-
     static {
-        Core.warmup();
-
         // if tomee embedded was ran we'll lost log otherwise
         final String logManger = 
System.getProperty("java.util.logging.manager");
         if (logManger != null) {
             try {
                 
Thread.currentThread().getContextClassLoader().loadClass(logManger);
-            } catch (Exception ignored) {
+            } catch (final Exception ignored) {
                 final Field field;
                 try {
                     field = LogManager.class.getDeclaredField("manager");
                     field.setAccessible(true);
                     field.set(null, new 
JuliLogStreamFactory.OpenEJBLogManager());
-                } catch (Exception ignore) {
+                } catch (final Exception ignore) {
                     // ignore
                 }
             }
@@ -115,9 +112,9 @@ public class OpenEjbContainer extends EJ
     }
 
     public static final String OPENEJB_EMBEDDED_REMOTABLE = 
"openejb.embedded.remotable";
-    static Logger logger = Logger.getInstance(LogCategory.OPENEJB_STARTUP, 
OpenEjbContainer.class);
 
     private static OpenEjbContainer instance;
+    private static Logger logger = null; // initialized lazily to get the 
logging config from properties
 
     private ServiceManagerProxy serviceManager;
     private Options options;
@@ -141,8 +138,8 @@ public class OpenEjbContainer extends EJ
         session = new MockHttpSession();
         try {
             startContexts(webBeanContext.getContextsService(), servletContext, 
session);
-        } catch (Exception e) {
-            logger.warning("can't start all CDI contexts", e);
+        } catch (final Exception e) {
+            logger().warning("can't start all CDI contexts", e);
         }
     }
 
@@ -163,7 +160,7 @@ public class OpenEjbContainer extends EJ
                 try {
                     assembler.destroyApplication(info);
                 } catch (UndeployException e) {
-                    logger.error(e.getMessage(), e);
+                    logger().error(e.getMessage(), e);
                 }
             }
         }
@@ -171,10 +168,10 @@ public class OpenEjbContainer extends EJ
         try {
             stopContexts(webBeanContext.getContextsService(), servletContext, 
session);
         } catch (Exception e) {
-            logger.warning("can't stop all CDI contexts", e);
+            logger().warning("can't stop all CDI contexts", e);
         }
 
-        logger.info("Destroying OpenEJB container");
+        logger().info("Destroying OpenEJB container");
         OpenEJB.destroy();
         instance = null;
     }
@@ -223,7 +220,7 @@ public class OpenEjbContainer extends EJ
         try {
             OWBInjector.inject(webBeanContext.getBeanManagerImpl(), object, 
null);
         } catch (Throwable t) {
-            logger.warning("an error occured while injecting the class '" + 
object.getClass().getName() + "': " + t.getMessage());
+            logger().warning("an error occured while injecting the class '" + 
object.getClass().getName() + "': " + t.getMessage());
         } finally {
             if (context != null) {
                 ThreadContext.exit(oldContext);
@@ -276,10 +273,17 @@ public class OpenEjbContainer extends EJ
             serviceManager = new ServiceManagerProxy();
             serviceManager.start();
         } catch (ServiceManagerProxy.AlreadyStartedException e) {
-            logger.debug("Network services already started.  Ignoring option " 
+ OPENEJB_EMBEDDED_REMOTABLE);
+            logger().debug("Network services already started.  Ignoring option 
" + OPENEJB_EMBEDDED_REMOTABLE);
         }
     }
 
+    private static Logger logger() { // don't trigger init too eagerly to be 
sure to be configured
+        if (logger == null) {
+            logger = Logger.getInstance(LogCategory.OPENEJB_STARTUP, 
OpenEjbContainer.class);
+        }
+        return logger;
+    }
+
 
     public static class NoInjectionMetaDataException extends 
IllegalStateException {
         public NoInjectionMetaDataException(final String s) {
@@ -309,7 +313,7 @@ public class OpenEjbContainer extends EJ
             if (isOtherProvider(map)) return null;
 
             if (instance != null || OpenEJB.isInitialized()) {
-                logger.info("EJBContainer already initialized.  Call 
ejbContainer.close() to allow reinitialization");
+                logger().info("EJBContainer already initialized.  Call 
ejbContainer.close() to allow reinitialization");
                 return instance;
             }
 
@@ -340,6 +344,8 @@ public class OpenEjbContainer extends EJ
 
                 OpenEJB.init(properties);
 
+                Core.warmup(); // don't do it too eagerly to avoid to not have 
properties
+
                 DeploymentLoader.reloadAltDD(); // otherwise hard to use 
multiple altdd with several start/stop in the same JVM
 
                 final ConfigurationFactory configurationFactory = new 
ConfigurationFactory();
@@ -389,14 +395,14 @@ public class OpenEjbContainer extends EJ
 
                 } catch (ValidationFailedException e) {
 
-                    logger.warning("configureApplication.loadFailed", 
appModule.getModuleId(), e.getMessage()); // DO not include the stacktrace in 
the message
+                    logger().warning("configureApplication.loadFailed", 
appModule.getModuleId(), e.getMessage()); // DO not include the stacktrace in 
the message
 
                     throw new InvalidApplicationException(e);
 
                 } catch (OpenEJBException e) {
                     // DO NOT REMOVE THE EXCEPTION FROM THIS LOG MESSAGE
                     // removing this message causes NO messages to be printed 
when embedded
-                    logger.warning("configureApplication.loadFailed", e, 
appModule.getModuleId(), e.getMessage());
+                    logger().warning("configureApplication.loadFailed", e, 
appModule.getModuleId(), e.getMessage());
 
                     throw new ConfigureApplicationException(e);
                 }
@@ -635,7 +641,7 @@ public class OpenEjbContainer extends EJ
         private static boolean isOtherProvider(Map<?, ?> properties) {
             final Object provider = properties.get(EJBContainer.PROVIDER);
             return provider != null && 
!provider.equals(OpenEjbContainer.class) && 
!provider.equals(OpenEjbContainer.class.getName())
-                    && !"openejb".equals(provider);
+                && !"openejb".equals(provider);
         }
 
         private boolean match(String s, File file) {

Modified: 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/JuliLogStreamFactory.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/JuliLogStreamFactory.java?rev=1520847&r1=1520846&r2=1520847&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/JuliLogStreamFactory.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/JuliLogStreamFactory.java
 Sun Sep  8 09:22:22 2013
@@ -23,9 +23,10 @@ import org.apache.openejb.log.SingleLine
 import org.apache.openejb.util.reflection.Reflections;
 
 import java.io.OutputStreamWriter;
+import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
-import java.util.logging.ConsoleHandler;
-import java.util.logging.LogManager;
+import java.util.logging.*;
+import java.util.logging.Logger;
 
 /**
  * default conf = jre conf
@@ -35,6 +36,7 @@ public class JuliLogStreamFactory implem
     public static final String OPENEJB_LOG_COLOR_PROP = "openejb.log.color";
 
     private static String consoleHandlerClazz;
+    private static boolean useOpenEJBHandler = false;
 
     public LogStream createLogStream(LogCategory logCategory) {
         return new JuliLogStream(logCategory);
@@ -56,11 +58,12 @@ public class JuliLogStreamFactory implem
 
             try { // check it will not fail later (case when a framework 
change the JVM classloading)
                 
ClassLoader.getSystemClassLoader().loadClass(consoleHandlerClazz);
-            } catch (ClassNotFoundException e) {
+            } catch (final ClassNotFoundException e) {
                 consoleHandlerClazz = ConsoleHandler.class.getName();
             }
 
             if (options.get("openejb.jul.forceReload", false)) {
+                useOpenEJBHandler = 
options.get("openejb.jul.forceReload.use-openejb-handler", true);
                 try {
                     final Field logManager = 
LogManager.class.getDeclaredField("manager");
                     final boolean acc = logManager.isAccessible();
@@ -72,7 +75,11 @@ public class JuliLogStreamFactory implem
                         logManager.setAccessible(acc);
                     }
                     value.forceReset();
-                } catch (Exception e) {
+
+                    setRootLogger(value);
+
+                    value.readConfiguration(); // re-read the config to ensure 
we have a parent logger
+                } catch (final Exception e) {
                     // no-op
                 }
             }
@@ -90,6 +97,29 @@ public class JuliLogStreamFactory implem
         System.setProperty("openwebbeans.logging.factory", 
"org.apache.webbeans.logger.JULLoggerFactory");
     }
 
+    private static void setRootLogger(final OpenEJBLogManager value) {
+        try { // if we don't do it - which is done in static part of the 
LogManager - we couldn't log user info when force-reload is to true
+            final Class<?> rootLoggerClass = 
ClassLoader.getSystemClassLoader().loadClass("java.util.logging.LogManager$RootLogger");
+            final Constructor<?> cons = 
rootLoggerClass.getDeclaredConstructor(LogManager.class);
+            final boolean acc = cons.isAccessible();
+            if (!acc) {
+                cons.setAccessible(true);
+            }
+            final Logger rootLogger = 
Logger.class.cast(cons.newInstance(value));
+            try {
+                Reflections.set(value, "rootLogger", rootLogger);
+            } finally {
+                cons.setAccessible(acc);
+            }
+            value.addLogger(rootLogger);
+            Reflections.invokeByReflection(Reflections.get(value, 
"systemContext"), "addLocalLogger", new Class<?>[] { Logger.class }, new 
Object[] { rootLogger });
+            Reflections.invokeByReflection(java.util.logging.Logger.global, 
"setLogManager", new Class<?>[] { LogManager.class }, new Object[] { value });
+            value.addLogger(java.util.logging.Logger.global);
+        } catch (final Throwable e) {
+            // no-op
+        }
+    }
+
     public static boolean isNotIDE() {
         return !System.getProperty("java.class.path").contains("idea_rt"); // 
TODO: eclipse, netbeans
     }
@@ -152,7 +182,8 @@ public class JuliLogStreamFactory implem
         }
 
         private static boolean isOverridableLogger(String name) {
-            return name.toLowerCase().contains("openejb")
+            return useOpenEJBHandler
+                    || name.toLowerCase().contains("openejb")
                     || name.toLowerCase().contains("transaction")
                     || name.toLowerCase().contains("cxf")
                     || name.toLowerCase().contains("timer")


Reply via email to