Author: rmannibucau Date: Mon May 19 20:49:05 2014 New Revision: 1596054 URL: http://svn.apache.org/r1596054 Log: TOMEE-1215 TOMEE-1214 reworking what is loaded and when and using jul when openejb Logger is not available. Replacing tomcat-juli by tomee-juli (keeping same name for tomcat tools) to be able to switch tomcat loggers too. Default stays the same.
Added: tomee/tomee/trunk/tomee/tomee-juli/ tomee/tomee/trunk/tomee/tomee-juli/pom.xml tomee/tomee/trunk/tomee/tomee-juli/src/ tomee/tomee/trunk/tomee/tomee-juli/src/main/ tomee/tomee/trunk/tomee/tomee-juli/src/main/java/ tomee/tomee/trunk/tomee/tomee-juli/src/main/java/org/ tomee/tomee/trunk/tomee/tomee-juli/src/main/java/org/apache/ tomee/tomee/trunk/tomee/tomee-juli/src/main/java/org/apache/juli/ tomee/tomee/trunk/tomee/tomee-juli/src/main/java/org/apache/juli/logging/ tomee/tomee/trunk/tomee/tomee-juli/src/main/java/org/apache/juli/logging/LogFactory.java tomee/tomee/trunk/tomee/tomee-juli/src/main/java/org/apache/tomee/ tomee/tomee/trunk/tomee/tomee-juli/src/main/java/org/apache/tomee/TomEELogConfigurer.java tomee/tomee/trunk/tomee/tomee-juli/src/main/resources/ tomee/tomee/trunk/tomee/tomee-juli/src/test/ tomee/tomee/trunk/tomee/tomee-juli/src/test/java/ tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/log/ tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/log/Log4jLog.java tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/log/Log4jLogFactory.java tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/log/Slf4jLog.java tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/log/Slf4jLogFactory.java Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/Core.java tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/persistence/PersistenceBootstrap.java tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/JuliLogStreamFactory.java tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/Log4jLogStreamFactory.java tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/Logger.java tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/SystemInstance.java tomee/tomee/trunk/tomee/pom.xml tomee/tomee/trunk/tomee/tomee-catalina/pom.xml tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/ServerListener.java tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatLoader.java tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/Warmup.java tomee/tomee/trunk/tomee/tomee-common/src/main/java/org/apache/tomee/installer/Installer.java tomee/tomee/trunk/tomee/tomee-common/src/main/java/org/apache/tomee/installer/Paths.java tomee/tomee/trunk/tomee/tomee-loader/pom.xml tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/OpenEJBListener.java Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/Core.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/Core.java?rev=1596054&r1=1596053&r2=1596054&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/Core.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/Core.java Mon May 19 20:49:05 2014 @@ -104,7 +104,6 @@ public class Core { try { // logging classes should be loaded before any other classes so do it here synchronously Class.forName("org.apache.openejb.util.Logger", true, loader); - Class.forName("org.apache.openejb.util.JuliLogStreamFactory", true, loader); } catch (final Throwable e) { // no-op } Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/persistence/PersistenceBootstrap.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/persistence/PersistenceBootstrap.java?rev=1596054&r1=1596053&r2=1596054&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/persistence/PersistenceBootstrap.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/persistence/PersistenceBootstrap.java Mon May 19 20:49:05 2014 @@ -21,8 +21,6 @@ import org.apache.openejb.core.TempClass import org.apache.openejb.javaagent.Agent; import org.apache.openejb.loader.IO; import org.apache.openejb.loader.SystemInstance; -import org.apache.openejb.util.LogCategory; -import org.apache.openejb.util.Logger; import org.apache.openejb.util.Saxs; import org.apache.xbean.finder.ClassLoaders; import org.xml.sax.Attributes; @@ -59,6 +57,8 @@ import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; +import java.util.logging.Level; +import java.util.logging.Logger; import static org.apache.openejb.loader.JarLocation.decode; @@ -77,7 +77,7 @@ import static org.apache.openejb.loader. */ public class PersistenceBootstrap { - public static final Logger logger = Logger.getInstance(LogCategory.OPENEJB_STARTUP, PersistenceBootstrap.class); + public static final Logger logger = Logger.getLogger(PersistenceBootstrap.class.getName()); public static final String DEFAULT_PROVIDER = getDefaultProvider(); @@ -93,7 +93,7 @@ public class PersistenceBootstrap { return trim; } } catch (final Exception e) { - logger.warning("Could not read " + name, e); + logger.log(Level.WARNING, "Could not read " + name, e); } return "org.apache.openjpa.persistence.PersistenceProviderImpl"; @@ -443,7 +443,7 @@ public class PersistenceBootstrap { return null; } - public java.util.logging.Logger getParentLogger() throws SQLFeatureNotSupportedException { + public Logger getParentLogger() throws SQLFeatureNotSupportedException { return null; } 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=1596054&r1=1596053&r2=1596054&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 Mon May 19 20:49:05 2014 @@ -22,6 +22,7 @@ import org.apache.openejb.loader.SystemI import org.apache.openejb.log.ConsoleColorHandler; import org.apache.openejb.log.SingleLineFormatter; import org.apache.openejb.util.reflection.Reflections; +import org.apache.webbeans.logger.WebBeansLoggerFacade; import java.io.OutputStreamWriter; import java.lang.reflect.Constructor; @@ -96,7 +97,7 @@ public class JuliLogStreamFactory implem // no-op: openjpa is not at the classpath so don't trigger it loading with our logger } - System.setProperty("openwebbeans.logging.factory", "org.apache.webbeans.logger.JULLoggerFactory"); + System.setProperty(WebBeansLoggerFacade.class.getName(), "org.apache.webbeans.logger.JULLoggerFactory"); } private static void setRootLogger(final OpenEJBLogManager value) { Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/Log4jLogStreamFactory.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/Log4jLogStreamFactory.java?rev=1596054&r1=1596053&r2=1596054&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/Log4jLogStreamFactory.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/Log4jLogStreamFactory.java Mon May 19 20:49:05 2014 @@ -21,9 +21,11 @@ import org.apache.log4j.ConsoleAppender; import org.apache.log4j.PropertyConfigurator; import org.apache.log4j.SimpleLayout; import org.apache.log4j.xml.DOMConfigurator; +import org.apache.openejb.cdi.logging.Log4jLoggerFactory; import org.apache.openejb.loader.FileUtils; import org.apache.openejb.loader.IO; import org.apache.openejb.loader.SystemInstance; +import org.apache.webbeans.logger.WebBeansLoggerFacade; import java.io.File; import java.io.IOException; @@ -64,6 +66,7 @@ public class Log4jLogStreamFactory imple // OpenJPA should use Log4j also System.setProperty("openjpa.Log", "log4j"); System.setProperty("org.apache.cxf.Logger", "org.apache.cxf.common.logging.Log4jLogger"); + System.setProperty(WebBeansLoggerFacade.OPENWEBBEANS_LOGGING_FACTORY_PROP, Log4jLoggerFactory.class.getName()); final boolean embedded = SystemInstance.get().getOptions().get("openejb.logging.embedded", false); Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/Logger.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/Logger.java?rev=1596054&r1=1596053&r2=1596054&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/Logger.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/Logger.java Mon May 19 20:49:05 2014 @@ -39,6 +39,14 @@ public class Logger { configure(); } + // don't return the instance since it needs to stay private but export which one is used to allow integration with other libs (as tomcat ;)) + public static String delegateClass() { + if (logStreamFactory == null) { + throw new IllegalStateException("Call this method after having configured the logger"); + } + return logStreamFactory.getClass().getName(); + } + public static synchronized void configure() { if (logStreamFactory != null) { return; Modified: tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/SystemInstance.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/SystemInstance.java?rev=1596054&r1=1596053&r2=1596054&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/SystemInstance.java (original) +++ tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/SystemInstance.java Mon May 19 20:49:05 2014 @@ -155,10 +155,16 @@ public class SystemInstance { } public FileUtils getHome() { + if (!isInitialized()) { + return new FileUtils("openejb.home", "user.dir", System.getProperties()); + } return home; } public FileUtils getBase() { + if (!isInitialized()) { + return new FileUtils("openejb.base", "openejb.home", System.getProperties()); + } return base; } Modified: tomee/tomee/trunk/tomee/pom.xml URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/pom.xml?rev=1596054&r1=1596053&r2=1596054&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/pom.xml (original) +++ tomee/tomee/trunk/tomee/pom.xml Mon May 19 20:49:05 2014 @@ -54,6 +54,7 @@ <module>tomee-jaxrs-webapp</module> <module>apache-tomee</module> <module>tomee-util</module> + <module>tomee-juli</module> <!--<module>tomee-deb</module>--> </modules> Modified: tomee/tomee/trunk/tomee/tomee-catalina/pom.xml URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/pom.xml?rev=1596054&r1=1596053&r2=1596054&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-catalina/pom.xml (original) +++ tomee/tomee/trunk/tomee/tomee-catalina/pom.xml Mon May 19 20:49:05 2014 @@ -38,7 +38,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jxr-plugin</artifactId> - <version>2.3</version> + <version>2.3</version> </plugin> </plugins> </reporting> @@ -105,6 +105,11 @@ </dependency> <dependency> <groupId>org.apache.openejb</groupId> + <artifactId>tomee-juli</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>org.apache.openejb</groupId> <artifactId>openejb-server</artifactId> </dependency> <dependency> Modified: tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/ServerListener.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/ServerListener.java?rev=1596054&r1=1596053&r2=1596054&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/ServerListener.java (original) +++ tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/ServerListener.java Mon May 19 20:49:05 2014 @@ -26,6 +26,7 @@ import org.apache.openejb.loader.IO; import org.apache.openejb.loader.ProvisioningUtil; import org.apache.openejb.loader.SystemInstance; import org.apache.openejb.util.OpenEjbVersion; +import org.apache.tomee.TomEELogConfigurer; import org.apache.tomee.loader.TomcatHelper; import java.io.File; @@ -145,6 +146,8 @@ public class ServerListener implements L final TomcatLoader loader = new TomcatLoader(); loader.init(properties); + TomEELogConfigurer.configureLogs(); + listenerInstalled.set(true); } catch (final Exception e) { LOGGER.log(Level.SEVERE, "TomEE Listener can't start OpenEJB", e); Modified: tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatLoader.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatLoader.java?rev=1596054&r1=1596053&r2=1596054&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatLoader.java (original) +++ tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatLoader.java Mon May 19 20:49:05 2014 @@ -46,8 +46,6 @@ import org.apache.openejb.server.Service import org.apache.openejb.server.ejbd.EjbServer; import org.apache.openejb.spi.Service; import org.apache.openejb.util.Join; -import org.apache.openejb.util.LogCategory; -import org.apache.openejb.util.Logger; import org.apache.openejb.util.OptionsLog; import org.apache.tomcat.util.scan.Constants; import org.apache.tomee.catalina.deployment.TomcatWebappDeployer; @@ -65,6 +63,8 @@ import java.util.HashSet; import java.util.List; import java.util.Properties; import java.util.Set; +import java.util.logging.Level; +import java.util.logging.Logger; /** * <h1>Prerequisites</h1> @@ -93,7 +93,7 @@ import java.util.Set; * @version $Revision: 617255 $ $Date: 2008-01-31 13:58:36 -0800 (Thu, 31 Jan 2008) $ */ public class TomcatLoader implements Loader { - private static final Logger logger = Logger.getInstance(LogCategory.OPENEJB_STARTUP, TomcatLoader.class); + private static final Logger logger = Logger.getLogger(TomcatLoader.class.getName()); public static final String TOMEE_NOSHUTDOWNHOOK_PROP = "tomee.noshutdownhook"; /** @@ -268,7 +268,7 @@ public class TomcatLoader implements Loa try { manager = (ServiceManager) cl.loadClass(clazz).newInstance(); } catch (ClassNotFoundException cnfe) { - logger.error("can't find the service manager " + clazz + ", the TomEE one will be used"); + logger.severe("can't find the service manager " + clazz + ", the TomEE one will be used"); manager = new TomEEServiceManager(); } manager.init(); @@ -283,8 +283,7 @@ public class TomcatLoader implements Loa } catch (ClassNotFoundException ignored) { // no-op } catch (Exception e) { - Logger logger = Logger.getInstance(LogCategory.OPENEJB_STARTUP, getClass()); - logger.error("Webservices failed to start", e); + logger.log(Level.SEVERE, "Webservices failed to start", e); } // REST @@ -296,7 +295,7 @@ public class TomcatLoader implements Loa } catch (ClassNotFoundException ignored) { // no-op } catch (Exception e) { - logger.error("REST failed to start", e); + logger.log(Level.SEVERE, "REST failed to start", e); } } @@ -327,10 +326,10 @@ public class TomcatLoader implements Loa Service service = (Service) getClass().getClassLoader().loadClass(className).newInstance(); service.init(properties); return true; - } catch (ClassNotFoundException e) { - logger.info("Optional service not installed: " + className); - } catch (Exception e) { - logger.error("Failed to start: " + className, e); + } catch (final ClassNotFoundException e) { + // no-op: logger.info("Optional service not installed: " + className); + } catch (final Exception e) { + logger.log(Level.SEVERE, "Failed to start: " + className, e); } return false; } Modified: tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/Warmup.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/Warmup.java?rev=1596054&r1=1596053&r2=1596054&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/Warmup.java (original) +++ tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/Warmup.java Mon May 19 20:49:05 2014 @@ -161,7 +161,6 @@ public class Warmup { try { // see org.apache.openejb.Core Class.forName("org.apache.openejb.util.Logger", true, loader); - Class.forName("org.apache.openejb.util.JuliLogStreamFactory", true, loader); } catch (Throwable e) { // no-op } Modified: tomee/tomee/trunk/tomee/tomee-common/src/main/java/org/apache/tomee/installer/Installer.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-common/src/main/java/org/apache/tomee/installer/Installer.java?rev=1596054&r1=1596053&r2=1596054&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-common/src/main/java/org/apache/tomee/installer/Installer.java (original) +++ tomee/tomee/trunk/tomee/tomee-common/src/main/java/org/apache/tomee/installer/Installer.java Mon May 19 20:49:05 2014 @@ -101,6 +101,7 @@ public class Installer implements Instal removeTomcatLibJar("annotations-api.jar"); addJavaeeInEndorsed(); + addTomEEJuli(); addTomEEAdminConfInTomcatUsers(); addTomEELinkToTomcatHome(); @@ -110,6 +111,22 @@ public class Installer implements Instal } } + // switch tomcat-juli with tomee-juli + // we keep the same name to let all tomcat tooling work as expected + private void addTomEEJuli() { + final File original = new File(paths.getCatalinaBinDir(), "tomcat-juli.jar"); + + final File juli = paths.findOpenEJBJar("tomee-juli"); + try { + Installers.copyFile(juli, new File(original.getAbsolutePath())); + if (!juli.delete()) { // remove original + juli.deleteOnExit(); + } + } catch (IOException e) { + alerts.addInfo("Add tomee user to tomcat-users.xml"); + } + } + public void addTomEEAdminConfInTomcatUsers() { addTomEEAdminConfInTomcatUsers(false); } @@ -169,6 +186,7 @@ public class Installer implements Instal removeTomcatLibJar("annotations-api.jar"); addJavaeeInEndorsed(); + addTomEEJuli(); // before moveLibs moveLibs(); addTomEEAdminConfInTomcatUsers(); Modified: tomee/tomee/trunk/tomee/tomee-common/src/main/java/org/apache/tomee/installer/Paths.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-common/src/main/java/org/apache/tomee/installer/Paths.java?rev=1596054&r1=1596053&r2=1596054&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-common/src/main/java/org/apache/tomee/installer/Paths.java (original) +++ tomee/tomee/trunk/tomee/tomee-common/src/main/java/org/apache/tomee/installer/Paths.java Mon May 19 20:49:05 2014 @@ -23,6 +23,7 @@ import org.apache.openejb.loader.JarLoca import org.apache.tomee.common.TomcatVersion; import java.io.File; +import java.io.FilenameFilter; import java.util.ArrayList; import java.util.List; /** @@ -300,22 +301,17 @@ public class Paths implements PathsInter return jar; } - private File findJar(File dir, String namePrefix) { + private File findJar(final File dir, final String namePrefix) { if (dir == null) return null; - File openejbLoaderJar = null; - final File[] files = dir.listFiles(); - if (files != null) { - for (File file : files) { - final String name = file.getName(); - if ((name.startsWith(namePrefix + "-") && name.endsWith(".jar")) - || name.equals(namePrefix)) { - return file; - } + final File[] files = dir.listFiles(new FilenameFilter() { + @Override + public boolean accept(final File dir, final String name) { + return (name.startsWith(namePrefix + "-") && name.endsWith(".jar")) || name.equals(namePrefix); } - } + }); - return openejbLoaderJar; + return files != null && files.length > 0? files[0] : null; } /**Verifies the following: Added: tomee/tomee/trunk/tomee/tomee-juli/pom.xml URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-juli/pom.xml?rev=1596054&view=auto ============================================================================== --- tomee/tomee/trunk/tomee/tomee-juli/pom.xml (added) +++ tomee/tomee/trunk/tomee/tomee-juli/pom.xml Mon May 19 20:49:05 2014 @@ -0,0 +1,85 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + + <parent> + <artifactId>tomee</artifactId> + <groupId>org.apache.openejb</groupId> + <version>1.6.1-SNAPSHOT</version> + </parent> + + <modelVersion>4.0.0</modelVersion> + <artifactId>tomee-juli</artifactId> + <name>OpenEJB :: TomEE :: Juli</name> + + <dependencies> + <dependency> + <groupId>org.apache.tomcat</groupId> + <artifactId>tomcat-juli</artifactId> + <version>${tomcat.version}</version> + <optional>true</optional> + </dependency> + <dependency> + <groupId>log4j</groupId> + <artifactId>log4j</artifactId> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + <scope>provided</scope> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-shade-plugin</artifactId> + <version>2.3</version> + <executions> + <execution> + <id>tomee-juli</id> + <phase>package</phase> + <goals> + <goal>shade</goal> + </goals> + <configuration> + <createSourcesJar>true</createSourcesJar> + <artifactSet> + <includes> + <include>org.apache.tomcat:tomcat-juli</include> + </includes> + </artifactSet> + <filters> + <filter> + <artifact>org.apache.tomcat:tomcat-juli</artifact> + <excludes> + <exclude>org/apache/juli/logging/LogFactory.class</exclude> + </excludes> + </filter> + </filters> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> +</project> Added: tomee/tomee/trunk/tomee/tomee-juli/src/main/java/org/apache/juli/logging/LogFactory.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-juli/src/main/java/org/apache/juli/logging/LogFactory.java?rev=1596054&view=auto ============================================================================== --- tomee/tomee/trunk/tomee/tomee-juli/src/main/java/org/apache/juli/logging/LogFactory.java (added) +++ tomee/tomee/trunk/tomee/tomee-juli/src/main/java/org/apache/juli/logging/LogFactory.java Mon May 19 20:49:05 2014 @@ -0,0 +1,136 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.juli.logging; + + +import java.util.Collection; +import java.util.HashSet; +import java.util.Properties; +import java.util.logging.LogManager; + + +// tomcat doesn't have any spi mecanism so forking this class +public /* abstract */ class LogFactory { + public static final String FACTORY_PROPERTY = + "org.apache.commons.logging.LogFactory"; + + public static final String FACTORY_DEFAULT = + "org.apache.commons.logging.impl.LogFactoryImpl"; + + public static final String FACTORY_PROPERTIES = + "commons-logging.properties"; + + public static final String HASHTABLE_IMPLEMENTATION_PROPERTY = + "org.apache.commons.logging.LogFactory.HashtableImpl"; + + private static LogFactory singleton=new LogFactory(); + private final Collection<String> names = new HashSet<String>(); + + Properties logConfig; + + protected LogFactory() { + logConfig=new Properties(); + } + + protected static void setSingleton(final LogFactory singleton) { + if (singleton == null) { + return; + } + LogFactory.singleton = singleton; + } + + void setLogConfig( Properties p ) { + this.logConfig=p; + } + + public Collection<String> getNames() { + return names; + } + + public Log getInstance(String name) + throws LogConfigurationException { + synchronized (names) { + names.add(name); + } + return DirectJDKLog.getInstance(name); + } + + public void release() { + DirectJDKLog.release(); + } + + public Object getAttribute(String name) { + return logConfig.get(name); + } + + public String[] getAttributeNames() { + String result[] = new String[logConfig.size()]; + return logConfig.keySet().toArray(result); + } + + public void removeAttribute(String name) { + logConfig.remove(name); + } + + public void setAttribute(String name, Object value) { + logConfig.put(name, value); + } + + public Log getInstance(Class<?> clazz) + throws LogConfigurationException { + return getInstance( clazz.getName()); + } + + public static LogFactory getFactory() throws LogConfigurationException { + return singleton; + } + + public static Log getLog(Class<?> clazz) + throws LogConfigurationException { + return (getFactory().getInstance(clazz)); + + } + + public static Log getLog(String name) + throws LogConfigurationException { + return (getFactory().getInstance(name)); + + } + + public static void release(ClassLoader classLoader) { + // JULI's log manager looks at the current classLoader so there is no + // need to use the passed in classLoader, the default implementation + // does not so calling reset in that case will break things + if (!LogManager.getLogManager().getClass().getName().equals( + "java.util.logging.LogManager")) { + LogManager.getLogManager().reset(); + } + } + + public static void releaseAll() { + singleton.release(); + } + + public static String objectId(Object o) { + if (o == null) { + return "null"; + } else { + return o.getClass().getName() + "@" + System.identityHashCode(o); + } + } +} Added: tomee/tomee/trunk/tomee/tomee-juli/src/main/java/org/apache/tomee/TomEELogConfigurer.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-juli/src/main/java/org/apache/tomee/TomEELogConfigurer.java?rev=1596054&view=auto ============================================================================== --- tomee/tomee/trunk/tomee/tomee-juli/src/main/java/org/apache/tomee/TomEELogConfigurer.java (added) +++ tomee/tomee/trunk/tomee/tomee-juli/src/main/java/org/apache/tomee/TomEELogConfigurer.java Mon May 19 20:49:05 2014 @@ -0,0 +1,96 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.tomee; + +import org.apache.juli.logging.Log; +import org.apache.juli.logging.LogFactory; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.Collection; + +public abstract class TomEELogConfigurer extends LogFactory { + public static void configureLogs() { + if (Boolean.getBoolean("tomee.skip-tomcat-log")) { + return; + } + + final Thread thread = Thread.currentThread(); + try { + final ClassLoader tccl = thread.getContextClassLoader(); // this is in classpath not StandardClassLoader so use reflection + final Class<?> logger = tccl.loadClass("org.apache.openejb.util.Logger"); + final Method m = logger.getDeclaredMethod("delegateClass"); + final String clazz = (String) m.invoke(null); + final LogFactory factory; + if ("org.apache.openejb.util.Log4jLogStreamFactory".equals(clazz)) { + factory = LogFactory.class.cast(tccl.loadClass("org.apache.tomee.loader.log.Log4jLogFactory").newInstance()); + } else if ("org.apache.openejb.util.Slf4jLogStreamFactory".equals(clazz)) { + factory = LogFactory.class.cast(tccl.loadClass("org.apache.tomee.loader.log.Slf4jLogFactory").newInstance()); + } else { + factory = null; + } + if (factory != null) { + final LogFactory oldFactory = getFactory(); + final Collection<String> names = new ArrayList<String>(oldFactory.getNames()); + oldFactory.getNames().clear(); + oldFactory.release(); + setSingleton(factory); + reload(factory, tccl, names); + } + } catch (final Throwable th) { + System.err.println(th.getClass().getName() + ": " + th.getMessage()); + } + } + + private static void reload(final LogFactory factory, final ClassLoader tccl, final Collection<String> names) { + for (final String name : names) { + try { + final Field f = Class.forName(name, false, tccl).getDeclaredField("log"); + if (!Log.class.equals(f.getType())) { + continue; + } + + final boolean acc = f.isAccessible(); + f.setAccessible(true); + + final Log newValue = factory.getInstance(name); + final int modifiers = f.getModifiers(); + if (Modifier.isFinal(modifiers)) { + final Field modifiersField = Field.class.getDeclaredField("modifiers"); + modifiersField.setAccessible(true); + modifiersField.setInt(f, modifiers & ~Modifier.FINAL); + + f.set(null, newValue); + + modifiersField.setInt(f, modifiers & Modifier.FINAL); + } else { + f.set(null, newValue); + } + + f.setAccessible(acc); + } catch (final Throwable e) { + // no-op + } + } + } + + private TomEELogConfigurer() { + // no-op + } +} Modified: tomee/tomee/trunk/tomee/tomee-loader/pom.xml URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-loader/pom.xml?rev=1596054&r1=1596053&r2=1596054&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-loader/pom.xml (original) +++ tomee/tomee/trunk/tomee/tomee-loader/pom.xml Mon May 19 20:49:05 2014 @@ -42,12 +42,30 @@ <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-catalina</artifactId> <scope>provided</scope> + <exclusions> + <exclusion> + <groupId>org.apache.tomcat</groupId> + <artifactId>tomcat-juli</artifactId> + </exclusion> + </exclusions> + </dependency> + <dependency> + <groupId>org.apache.openejb</groupId> + <artifactId>tomee-juli</artifactId> + <version>${project.version}</version> </dependency> <dependency> <groupId>org.apache.openejb</groupId> <artifactId>tomee-common</artifactId> <version>${project.version}</version> </dependency> + + <dependency> + <groupId>log4j</groupId> + <artifactId>log4j</artifactId> + <version>${log4j.version}</version> + <scope>provided</scope> + </dependency> </dependencies> </project> Modified: tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/OpenEJBListener.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/OpenEJBListener.java?rev=1596054&r1=1596053&r2=1596054&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/OpenEJBListener.java (original) +++ tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/OpenEJBListener.java Mon May 19 20:49:05 2014 @@ -26,6 +26,7 @@ import org.apache.catalina.core.Standard import org.apache.catalina.core.StandardEngine; import org.apache.catalina.core.StandardHost; import org.apache.catalina.core.StandardServer; +import org.apache.tomee.TomEELogConfigurer; import java.io.BufferedOutputStream; import java.io.File; @@ -88,6 +89,7 @@ public class OpenEJBListener implements properties.setProperty("openejb.embedder.source", OpenEJBListener.class.getSimpleName()); TomcatEmbedder.embed(properties, StandardServer.class.getClassLoader()); listenerInstalled = true; + TomEELogConfigurer.configureLogs(); } else if (logWebappNotFound) { LOGGER.info("tomee webapp not found from the listener, will try from the webapp if exists"); logWebappNotFound = false; Added: tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/log/Log4jLog.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/log/Log4jLog.java?rev=1596054&view=auto ============================================================================== --- tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/log/Log4jLog.java (added) +++ tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/log/Log4jLog.java Mon May 19 20:49:05 2014 @@ -0,0 +1,120 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.tomee.loader.log; + +import org.apache.juli.logging.Log; +import org.apache.log4j.Level; +import org.apache.log4j.Logger; + +public class Log4jLog implements Log { + private final Logger log; + + public Log4jLog(final Logger log) { + this.log = log; + } + + @Override + public boolean isDebugEnabled() { + return log.isDebugEnabled(); + } + + @Override + public boolean isErrorEnabled() { + return log.isEnabledFor(Level.ERROR); + } + + @Override + public boolean isFatalEnabled() { + return log.isEnabledFor(Level.FATAL); + } + + @Override + public boolean isInfoEnabled() { + return log.isInfoEnabled(); + } + + @Override + public boolean isTraceEnabled() { + return log.isEnabledFor(Level.TRACE); + } + + @Override + public boolean isWarnEnabled() { + return log.isEnabledFor(Level.WARN); + } + + @Override + public void trace(final Object message) { + log.trace(message); + } + + @Override + public void trace(final Object message, final Throwable t) { + log.trace(message, t); + } + + @Override + public void debug(final Object message) { + log.debug(message); + } + + @Override + public void debug(final Object message, final Throwable t) { + log.debug(message, t); + } + + @Override + public void info(final Object message) { + log.info(message); + } + + @Override + public void info(final Object message, final Throwable t) { + log.info(message, t); + } + + @Override + public void warn(final Object message) { + log.warn(message); + } + + @Override + public void warn(final Object message, final Throwable t) { + log.warn(message, t); + } + + @Override + public void error(final Object message) { + log.error(message); + } + + @Override + public void error(final Object message, final Throwable t) { + log.error(message, t); + } + + @Override + public void fatal(final Object message) { + log.fatal(message); + } + + @Override + public void fatal(final Object message, final Throwable t) { + log.fatal(message, t); + } +} Added: tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/log/Log4jLogFactory.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/log/Log4jLogFactory.java?rev=1596054&view=auto ============================================================================== --- tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/log/Log4jLogFactory.java (added) +++ tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/log/Log4jLogFactory.java Mon May 19 20:49:05 2014 @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.tomee.loader.log; + +import org.apache.juli.logging.Log; +import org.apache.juli.logging.LogConfigurationException; +import org.apache.juli.logging.LogFactory; +import org.apache.log4j.Logger; + +public class Log4jLogFactory extends LogFactory { + @Override + public Log getInstance(final String name) throws LogConfigurationException { + try { + return new Log4jLog(Logger.getLogger(name)); + } catch (final Exception e) { + throw new IllegalStateException(e); + } + } +} Added: tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/log/Slf4jLog.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/log/Slf4jLog.java?rev=1596054&view=auto ============================================================================== --- tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/log/Slf4jLog.java (added) +++ tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/log/Slf4jLog.java Mon May 19 20:49:05 2014 @@ -0,0 +1,123 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.tomee.loader.log; + +import org.apache.juli.logging.Log; +import org.slf4j.Logger; + +public class Slf4jLog implements Log { + private final Logger log; + + public Slf4jLog(final Logger log) { + this.log = log; + } + + @Override + public boolean isDebugEnabled() { + return log.isDebugEnabled(); + } + + @Override + public boolean isErrorEnabled() { + return log.isErrorEnabled(); + } + + @Override + public boolean isFatalEnabled() { + return log.isErrorEnabled(); + } + + @Override + public boolean isInfoEnabled() { + return log.isInfoEnabled(); + } + + @Override + public boolean isTraceEnabled() { + return log.isTraceEnabled(); + } + + @Override + public boolean isWarnEnabled() { + return log.isWarnEnabled(); + } + + private static String m(final Object message) { + return message == null ? "null" : message.toString(); + } + + @Override + public void trace(final Object message) { + log.trace(m(message)); + } + + @Override + public void trace(final Object message, final Throwable t) { + log.trace(m(message), t); + } + + @Override + public void debug(final Object message) { + log.debug(m(message)); + } + + @Override + public void debug(final Object message, final Throwable t) { + log.debug(m(message), t); + } + + @Override + public void info(final Object message) { + log.info(m(message)); + } + + @Override + public void info(final Object message, final Throwable t) { + log.info(m(message), t); + } + + @Override + public void warn(final Object message) { + log.warn(m(message)); + } + + @Override + public void warn(final Object message, final Throwable t) { + log.warn(m(message), t); + } + + @Override + public void error(final Object message) { + log.error(m(message)); + } + + @Override + public void error(final Object message, final Throwable t) { + log.error(m(message), t); + } + + @Override + public void fatal(final Object message) { + log.error(m(message)); + } + + @Override + public void fatal(final Object message, final Throwable t) { + log.error(m(message), t); + } +} Added: tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/log/Slf4jLogFactory.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/log/Slf4jLogFactory.java?rev=1596054&view=auto ============================================================================== --- tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/log/Slf4jLogFactory.java (added) +++ tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/log/Slf4jLogFactory.java Mon May 19 20:49:05 2014 @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.tomee.loader.log; + +import org.apache.juli.logging.Log; +import org.apache.juli.logging.LogConfigurationException; +import org.apache.juli.logging.LogFactory; +import org.slf4j.LoggerFactory; + +public class Slf4jLogFactory extends LogFactory { + @Override + public Log getInstance(final String name) throws LogConfigurationException { + try { + return new Slf4jLog(LoggerFactory.getLogger(name)); + } catch (final Exception e) { + throw new IllegalStateException(e); + } + } +}