Index: osgi/core-osgi-net/pom.xml =================================================================== --- osgi/core-osgi-net/pom.xml (revision 1505664) +++ osgi/core-osgi-net/pom.xml (working copy) @@ -38,6 +38,19 @@ org.apache.logging.log4j log4j-core + + org.apache.geronimo.specs + geronimo-jms_1.1_spec + + + javax.mail + mail + + + org.apache.geronimo.specs + geronimo-activation_1.1_spec + 1.1 + @@ -54,7 +67,6 @@ true - false <_nouses>true @@ -68,7 +80,7 @@ ${osgi.import} ${osgi.dynamicImport} ${project.url} - org.apache.commons.log4j-api;bundle-version=${project.version.osgi} + org.apache.logging.log4j-api;bundle-version="[${project.version.osgi},${project.version.osgi}]" Index: osgi/pom.xml =================================================================== --- osgi/pom.xml (revision 1505664) +++ osgi/pom.xml (working copy) @@ -46,6 +46,8 @@ core-osgi-nosql-couch core-osgi-nosql-mongo core-osgi-reduced + core-osgi-web + core-osgi-test Index: osgi/core-osgi-test/src/test/java/org/apache/logging/log4j/core/osgi/tests/InMemoryAppender.java =================================================================== --- osgi/core-osgi-test/src/test/java/org/apache/logging/log4j/core/osgi/tests/InMemoryAppender.java (revision 0) +++ osgi/core-osgi-test/src/test/java/org/apache/logging/log4j/core/osgi/tests/InMemoryAppender.java (working copy) @@ -0,0 +1,53 @@ +/* + * 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.logging.log4j.core.osgi.tests; + +import java.io.ByteArrayOutputStream; +import java.io.Serializable; + +import org.apache.logging.log4j.core.Layout; +import org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender; +import org.apache.logging.log4j.core.appender.OutputStreamManager; +import org.apache.logging.log4j.core.filter.CompositeFilter; + +/** + * + */ +public class InMemoryAppender extends AbstractOutputStreamAppender { + + public InMemoryAppender(final String name, final Layout layout, final CompositeFilter filters, + final boolean ignoreExceptions) { + super(name, layout, filters, ignoreExceptions, true, new InMemoryManager(name, layout)); + } + + @Override + public String toString() { + return getManager().toString(); + } + + private static class InMemoryManager extends OutputStreamManager { + + public InMemoryManager(final String name, final Layout layout) { + super(new ByteArrayOutputStream(), name, layout); + } + + @Override + public String toString() { + return getOutputStream().toString(); + } + } +} Index: osgi/core-osgi-test/src/test/java/org/apache/logging/log4j/core/osgi/tests/InMemoryAppender.java =================================================================== --- osgi/core-osgi-test/src/test/java/org/apache/logging/log4j/core/osgi/tests/InMemoryAppender.java (revision 0) +++ osgi/core-osgi-test/src/test/java/org/apache/logging/log4j/core/osgi/tests/InMemoryAppender.java (working copy) Property changes on: osgi/core-osgi-test/src/test/java/org/apache/logging/log4j/core/osgi/tests/InMemoryAppender.java ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +text/plain Index: core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java =================================================================== --- core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java (revision 1505664) +++ core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java (working copy) @@ -36,7 +36,6 @@ import org.apache.logging.log4j.core.Filter; import org.apache.logging.log4j.core.LifeCycle; import org.apache.logging.log4j.core.LogEvent; -import org.apache.logging.log4j.core.async.AsyncLoggerContextSelector; import org.apache.logging.log4j.core.config.plugins.Plugin; import org.apache.logging.log4j.core.config.plugins.PluginAttr; import org.apache.logging.log4j.core.config.plugins.PluginConfiguration; @@ -482,7 +481,11 @@ // for synchronous loggers, includeLocation default is TRUE. protected static boolean includeLocation(final String includeLocationConfigValue) { if (includeLocationConfigValue == null) { - final boolean sync = !AsyncLoggerContextSelector.class.getName() + // Originally this code used AsyncLoggerContextSelector.class.getName() + // but this introduces a cyclic package dependency and makes it impossible + // to separate the log4j JARs by function. As the class name is API + // (clients are setting it as a System property) there is no risk in hard-coding. + final boolean sync = !"org.apache.logging.log4j.core.async.AsyncLoggerContextSelector" .equals(System.getProperty(Constants.LOG4J_CONTEXT_SELECTOR)); return sync; } Index: core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginManager.java =================================================================== --- core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginManager.java (revision 1505664) +++ core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginManager.java (working copy) @@ -229,8 +229,18 @@ final String name = dis.readUTF(); final boolean printable = dis.readBoolean(); final boolean defer = dis.readBoolean(); - final Class clazz = Class.forName(className); - types.put(key, new PluginType(clazz, name, printable, defer)); + // We sometimes don't have the full set of dependencies available + // to load our plugins, for example the JMS and SMTP Appenders + // need the full o.a.l.l.core.net package, which isn't in the reduced + // log4j bundle, and so needs the core-net extension to be added. + try { + final Class clazz = Class.forName(className); + types.put(key, new PluginType(clazz, name, printable, defer)); + } catch (ClassNotFoundException cnfe) { + LOGGER.warn("Unable to preload plugin " + name, cnfe); + } catch (NoClassDefFoundError cnfe) { + LOGGER.warn("Unable to preload plugin " + name, cnfe); + } } map.putIfAbsent(type, types); } Index: osgi/core-osgi-reduced/pom.xml =================================================================== --- osgi/core-osgi-reduced/pom.xml (revision 1505664) +++ osgi/core-osgi-reduced/pom.xml (working copy) @@ -38,6 +38,21 @@ org.apache.logging.log4j log4j-core + + com.fasterxml.jackson.core + jackson-core + true + + + com.fasterxml.jackson.core + jackson-databind + true + + + org.osgi + core + provided + @@ -54,7 +69,6 @@ true - false <_nouses>true @@ -67,13 +81,29 @@ !${project.parent.groupId}.core.appender.db.nosql.*, !${project.parent.groupId}.core.async.*, !${project.parent.groupId}.core.net.*, + !${project.parent.groupId}.core.web.*, ${project.parent.groupId}.core.* ${osgi.private} - ${osgi.import} + + ${project.parent.groupId}.core.net;resolution:=optional, + ${osgi.import} + ${osgi.dynamicImport} ${project.url} - org.apache.commons.log4j-api;bundle-version=${project.version.osgi} + org.apache.logging.log4j-api;bundle-version="[${project.version.osgi},${project.version.osgi}]" + + @log4j-core-${project.version}.jar!/Log4j-V2.0.xsd, + @log4j-core-${project.version}.jar!/Log4j-events.dtd, + @log4j-core-${project.version}.jar!/Log4j-events.xsd, + @log4j-core-${project.version}.jar!/META-INF/DEPENDENCIES, + @log4j-core-${project.version}.jar!/META-INF/LICENSE, + @log4j-core-${project.version}.jar!/META-INF/log4j-provider.properties, + @log4j-core-${project.version}.jar!/META-INF/NOTICE, + @log4j-core-${project.version}.jar!/org/apache/logging/log4j/core/net/Advertiser.class, + @log4j-core-${project.version}.jar!/org/apache/logging/log4j/core/net/Facility.class, + @log4j-core-${project.version}.jar!/org/apache/logging/log4j/core/net/Priority.class + Index: pom.xml =================================================================== --- pom.xml (revision 1505664) +++ pom.xml (working copy) @@ -157,6 +157,8 @@ 1.6 Site Documentation + 3.1.0 + 1.6.0 @@ -382,7 +384,7 @@ org.apache.geronimo.specs geronimo-jms_1.1_spec - 1.0 + 1.1.1 org.mockejb @@ -442,6 +444,37 @@ lightcouch 0.0.5 + + + org.ops4j.pax.exam + pax-exam-container-forked + ${pax.exam.version} + test + + + org.ops4j.pax.exam + pax-exam-junit4 + ${pax.exam.version} + test + + + org.ops4j.pax.exam + pax-exam-link-mvn + ${pax.exam.version} + test + + + org.ops4j.pax.url + pax-url-aether + ${pax.url.version} + test + + + org.apache.felix + org.apache.felix.framework + 4.2.1 + test + @@ -612,7 +645,7 @@ true - true + false target/osgi Index: osgi/core-osgi-test/pom.xml =================================================================== --- osgi/core-osgi-test/pom.xml (revision 0) +++ osgi/core-osgi-test/pom.xml (working copy) @@ -0,0 +1,101 @@ + + + + 4.0.0 + + org.apache.logging.log4j + log4j + 2.0-beta9-SNAPSHOT + ../../ + + org.apache.logging.log4j.osgi + log4j-core-osgi-test + Apache Log4J Core OSGi Tests + Apache Log4J Implementation Tests for OSGi. + + ${basedir}/../.. + Core Documentation + /core + + + + org.apache.logging.log4j + log4j-api + + + org.apache.logging.log4j + log4j-core + + + org.apache.logging.log4j.osgi + log4j-core-osgi-reduced + ${project.version} + + + org.ops4j.pax.exam + pax-exam-container-forked + + + org.ops4j.pax.exam + pax-exam-junit4 + + + org.ops4j.pax.exam + pax-exam-link-mvn + + + org.ops4j.pax.url + pax-url-aether + + + org.apache.felix + org.apache.felix.framework + + + + + + yourkit + + + /Applications/YourKit_Java_Profiler_8.0.17.app + + + + com.yourkit + yjp-controller-api-redist + 8.0.17 + system + ${yourkit.home}/lib/yjp-controller-api-redist.jar + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + -agentpath:"${yourkit.home}/bin/mac/libyjpagent.jnilib" + + + + + + + + Index: osgi/core-osgi-test/pom.xml =================================================================== --- osgi/core-osgi-test/pom.xml (revision 0) +++ osgi/core-osgi-test/pom.xml (working copy) Property changes on: osgi/core-osgi-test/pom.xml ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +text/plain Index: osgi/core-osgi-jpa/pom.xml =================================================================== --- osgi/core-osgi-jpa/pom.xml (revision 1505664) +++ osgi/core-osgi-jpa/pom.xml (working copy) @@ -38,6 +38,18 @@ org.apache.logging.log4j log4j-core + + org.eclipse.persistence + javax.persistence + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + @@ -54,7 +66,6 @@ true - false <_nouses>true @@ -68,7 +79,7 @@ ${osgi.import} ${osgi.dynamicImport} ${project.url} - org.apache.commons.log4j-api;bundle-version=${project.version.osgi} + org.apache.logging.log4j-api;bundle-version="[${project.version.osgi},${project.version.osgi}]" Index: osgi/core-osgi-nosql-couch/pom.xml =================================================================== --- osgi/core-osgi-nosql-couch/pom.xml (revision 1505664) +++ osgi/core-osgi-nosql-couch/pom.xml (working copy) @@ -38,6 +38,10 @@ org.apache.logging.log4j log4j-core + + org.lightcouch + lightcouch + @@ -54,7 +58,6 @@ true - false <_nouses>true @@ -68,7 +71,7 @@ ${osgi.import} ${osgi.dynamicImport} ${project.url} - org.apache.commons.log4j-api;bundle-version=${project.version.osgi} + org.apache.logging.log4j-api;bundle-version="[${project.version.osgi},${project.version.osgi}]" Index: osgi/core-osgi-async/pom.xml =================================================================== --- osgi/core-osgi-async/pom.xml (revision 1505664) +++ osgi/core-osgi-async/pom.xml (working copy) @@ -38,6 +38,10 @@ org.apache.logging.log4j log4j-core + + com.lmax + disruptor + @@ -54,7 +58,6 @@ true - false <_nouses>true @@ -68,7 +71,7 @@ ${osgi.import} ${osgi.dynamicImport} ${project.url} - org.apache.commons.log4j-api;bundle-version=${project.version.osgi} + org.apache.logging.log4j-api;bundle-version="[${project.version.osgi},${project.version.osgi}]" Index: osgi/core-osgi-web/pom.xml =================================================================== --- osgi/core-osgi-web/pom.xml (revision 0) +++ osgi/core-osgi-web/pom.xml (working copy) @@ -0,0 +1,129 @@ + + + + 4.0.0 + + org.apache.logging.log4j + log4j + 2.0-beta9-SNAPSHOT + ../../ + + org.apache.logging.log4j.osgi + log4j-core-osgi-web + bundle + Apache Log4J Core OSGi Web + Apache Log4J Implementation. + + ${basedir}/../.. + Core Documentation + /core + + + + org.apache.logging.log4j + log4j-core + + + + + + org.apache.felix + maven-bundle-plugin + true + + + + true + + + + <_nouses>true + + <_removeheaders>JAVA_1_3_HOME,JAVA_1_4_HOME,JAVA_1_5_HOME,JAVA_1_6_HOME,JAVA_1_7_HOME + ${osgi.symbolicName} + + ${project.parent.groupId}.core.web + + ${osgi.private} + javax.servlet;version="[2.5,3)", + ${osgi.import} + + ${osgi.dynamicImport} + ${project.url} + org.apache.logging.log4j-api;bundle-version="[${project.version.osgi},${project.version.osgi}]" + + + + + generate-sources + + cleanVersions + + + + ${project.version} + + + + + bundle-manifest + process-classes + + manifest + + + + + + + + + + yourkit + + + /Applications/YourKit_Java_Profiler_8.0.17.app + + + + com.yourkit + yjp-controller-api-redist + 8.0.17 + system + ${yourkit.home}/lib/yjp-controller-api-redist.jar + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + -agentpath:"${yourkit.home}/bin/mac/libyjpagent.jnilib" + + + + + + + + Index: osgi/core-osgi-web/pom.xml =================================================================== --- osgi/core-osgi-web/pom.xml (revision 0) +++ osgi/core-osgi-web/pom.xml (working copy) Property changes on: osgi/core-osgi-web/pom.xml ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +text/plain Index: osgi/core-osgi-test/src/test/java/org/apache/logging/log4j/core/osgi/tests/OSGiSniffTest.java =================================================================== --- osgi/core-osgi-test/src/test/java/org/apache/logging/log4j/core/osgi/tests/OSGiSniffTest.java (revision 0) +++ osgi/core-osgi-test/src/test/java/org/apache/logging/log4j/core/osgi/tests/OSGiSniffTest.java (working copy) @@ -0,0 +1,78 @@ +package org.apache.logging.log4j.core.osgi.tests; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.ops4j.pax.exam.CoreOptions.junitBundles; +import static org.ops4j.pax.exam.CoreOptions.mavenBundle; +import static org.ops4j.pax.exam.CoreOptions.options; + +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.Layout; +import org.apache.logging.log4j.core.Logger; +import org.apache.logging.log4j.core.helpers.Constants; +import org.apache.logging.log4j.core.layout.PatternLayout; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.ops4j.pax.exam.Configuration; +import org.ops4j.pax.exam.Option; +import org.ops4j.pax.exam.junit.PaxExam; +import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy; +import org.ops4j.pax.exam.spi.reactors.PerMethod; + +@RunWith(PaxExam.class) +@ExamReactorStrategy(PerMethod.class) +public class OSGiSniffTest { + + @Configuration + public Option[] configCore() { + + /* Install log4j into the OSGi framework */ + return options( + mavenBundle("org.apache.logging.log4j", "log4j-core").noStart(), + mavenBundle("org.apache.logging.log4j", "log4j-api"), + junitBundles() + ); + } + + @Configuration + public Option[] configCoreOSGiReduced() { + + /* Install log4j into the OSGi framework */ + return options( + mavenBundle("org.apache.logging.log4j.osgi", "log4j-core-osgi-reduced").noStart(), + mavenBundle("org.apache.logging.log4j", "log4j-api"), + junitBundles() + ); + } + + @Test + public void testLoggingInOSGi() { + + final Layout layout = PatternLayout.createLayout(null, null, null, null, null); + final InMemoryAppender app = new InMemoryAppender("test", layout, null, false); + + System.out.println(LogManager.getContext().getClass().getName()); + + Logger logger = (Logger) LogManager.getLogger(); + + logger.addAppender(app); + + app.start(); + assertTrue("Appender did not start", app.isStarted()); + + logger.setLevel(Level.INFO); + logger.log(Level.INFO, "Test"); + final String msg = app.toString(); + + assertNotNull("No message", msg); + assertTrue("Incorrect message: " + msg , msg.endsWith("Test" + Constants.LINE_SEP)); + + app.stop(); + assertFalse("Appender did not stop", app.isStarted()); + + logger.removeAppender(app); + } + +} \ No newline at end of file Index: osgi/core-osgi-test/src/test/java/org/apache/logging/log4j/core/osgi/tests/OSGiSniffTest.java =================================================================== --- osgi/core-osgi-test/src/test/java/org/apache/logging/log4j/core/osgi/tests/OSGiSniffTest.java (revision 0) +++ osgi/core-osgi-test/src/test/java/org/apache/logging/log4j/core/osgi/tests/OSGiSniffTest.java (working copy) Property changes on: osgi/core-osgi-test/src/test/java/org/apache/logging/log4j/core/osgi/tests/OSGiSniffTest.java ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +text/plain Index: osgi/core-osgi-nosql-mongo/pom.xml =================================================================== --- osgi/core-osgi-nosql-mongo/pom.xml (revision 1505664) +++ osgi/core-osgi-nosql-mongo/pom.xml (working copy) @@ -38,6 +38,10 @@ org.apache.logging.log4j log4j-core + + org.mongodb + mongo-java-driver + @@ -54,7 +58,6 @@ true - false <_nouses>true @@ -68,7 +71,7 @@ ${osgi.import} ${osgi.dynamicImport} ${project.url} - org.apache.commons.log4j-api;bundle-version=${project.version.osgi} + org.apache.logging.log4j-api;bundle-version="[${project.version.osgi},${project.version.osgi}]" Index: core/pom.xml =================================================================== --- core/pom.xml (revision 1505664) +++ core/pom.xml (working copy) @@ -203,7 +203,6 @@ true - true target/osgi @@ -213,10 +212,13 @@ ${osgi.symbolicName} ${osgi.export} ${osgi.private} - ${osgi.import} + + javax.servlet;version="[2.5,3)";resolution:=optional, + ${osgi.import} + ${osgi.dynamicImport} ${project.url} - org.apache.commons.log4j-api;bundle-version=${project.version.osgi} + org.apache.logging.log4j-api;bundle-version="[${project.version.osgi},${project.version.osgi}]" Index: api/src/main/java/org/apache/logging/log4j/util/ProviderUtil.java =================================================================== --- api/src/main/java/org/apache/logging/log4j/util/ProviderUtil.java (revision 1505664) +++ api/src/main/java/org/apache/logging/log4j/util/ProviderUtil.java (working copy) @@ -97,6 +97,30 @@ } if (cl == null) { cl = ProviderUtil.class.getClassLoader(); + } else { + // If the ThreadContextClassLoader can't see the Class/Resource we need + // then we should fall back to the ClassLoader that loaded Log4J + cl = new ClassLoader(cl) { + + ClassLoader log4JClassLoader = ProviderUtil.class.getClassLoader(); + + @Override + protected Class findClass(String name) + throws ClassNotFoundException { + return log4JClassLoader.loadClass(name); + } + + @Override + protected URL findResource(String name) { + return log4JClassLoader.getResource(name); + } + + @Override + protected Enumeration findResources(String name) + throws IOException { + return log4JClassLoader.getResources(name); + } + }; } return cl;