This is the effective version of Log4j-API (i.e. the last API version that would impact an implementation). That hasn’t changed since 2.6.
Ralph > On Jul 16, 2017, at 8:59 AM, Matt Sicker <[email protected]> wrote: > > If this is purely OSGi, you can use their Version class for a better way of > comparing versions. > > On 15 July 2017 at 11:30, <[email protected]> wrote: > >> Repository: logging-log4j2 >> Updated Branches: >> refs/heads/master 8133b6a02 -> 9a08eb08f >> >> >> LOG4J2-1971 - Register Log4j-core as a service. Bypass tests that don't >> work on MacOS >> >> >> Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo >> Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/ >> commit/2c16e17d >> Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/2c16e17d >> Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/2c16e17d >> >> Branch: refs/heads/master >> Commit: 2c16e17d2a636155804c166ccff7b3d389fe03f0 >> Parents: 8133b6a >> Author: Ralph Goers <[email protected]> >> Authored: Sat Jul 15 09:26:32 2017 -0700 >> Committer: Ralph Goers <[email protected]> >> Committed: Sat Jul 15 09:26:40 2017 -0700 >> >> ---------------------------------------------------------------------- >> .../apache/logging/log4j/util/Activator.java | 27 +++++++++++++++++--- >> .../apache/logging/log4j/util/ProviderUtil.java | 5 ++++ >> .../logging/log4j/core/osgi/Activator.java | 11 ++++++++ >> .../appender/FileAppenderPermissionsTest.java | 6 +++++ >> ...irectWriteTempCompressedFilePatternTest.java | 4 +++ >> ...ngAppenderTempCompressedFilePatternTest.java | 4 +++ >> 6 files changed, 53 insertions(+), 4 deletions(-) >> ---------------------------------------------------------------------- >> >> >> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ >> 2c16e17d/log4j-api/src/main/java/org/apache/logging/log4j/ >> util/Activator.java >> ---------------------------------------------------------------------- >> diff --git >> a/log4j-api/src/main/java/org/apache/logging/log4j/util/Activator.java >> b/log4j-api/src/main/java/org/apache/logging/log4j/util/Activator.java >> index 2547b7d..30cd566 100644 >> --- a/log4j-api/src/main/java/org/apache/logging/log4j/util/Activator.java >> +++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/Activator.java >> @@ -18,10 +18,12 @@ package org.apache.logging.log4j.util; >> >> import java.net.URL; >> import java.security.Permission; >> +import java.util.Collection; >> import java.util.List; >> >> import org.apache.logging.log4j.Logger; >> import org.apache.logging.log4j.spi.LoggerContextFactory; >> +import org.apache.logging.log4j.spi.Provider; >> import org.apache.logging.log4j.status.StatusLogger; >> import org.osgi.framework.AdaptPermission; >> import org.osgi.framework.AdminPermission; >> @@ -29,6 +31,8 @@ import org.osgi.framework.Bundle; >> import org.osgi.framework.BundleActivator; >> import org.osgi.framework.BundleContext; >> import org.osgi.framework.BundleEvent; >> +import org.osgi.framework.InvalidSyntaxException; >> +import org.osgi.framework.ServiceReference; >> import org.osgi.framework.SynchronousBundleListener; >> import org.osgi.framework.wiring.BundleWire; >> import org.osgi.framework.wiring.BundleWiring; >> @@ -63,7 +67,7 @@ public class Activator implements BundleActivator, >> SynchronousBundleListener { >> try { >> checkPermission(new AdminPermission(bundle, >> AdminPermission.RESOURCE)); >> checkPermission(new AdaptPermission(BundleWiring.class.getName(), >> bundle, AdaptPermission.ADAPT)); >> - loadProvider(bundle.adapt(BundleWiring.class)); >> + loadProvider(bundle.getBundleContext(), >> bundle.adapt(BundleWiring.class)); >> } catch (final SecurityException e) { >> LOGGER.debug("Cannot access bundle [{}] contents. Ignoring.", >> bundle.getSymbolicName(), e); >> } catch (final Exception e) { >> @@ -71,8 +75,23 @@ public class Activator implements BundleActivator, >> SynchronousBundleListener { >> } >> } >> >> - private void loadProvider(final BundleWiring bundleWiring) { >> - ProviderUtil.loadProviders(bundleWiring.getClassLoader()); >> + private void loadProvider(final BundleContext context, final >> BundleWiring bundleWiring) { >> + String filter = "(APIVersion>=2.60)"; >> + try { >> + Collection<ServiceReference<Provider>> serviceReferences = >> context.getServiceReferences(Provider.class, filter); >> + Provider maxProvider = null; >> + for (ServiceReference<Provider> serviceReference : >> serviceReferences) { >> + Provider provider = context.getService(serviceReference); >> + if (maxProvider == null || provider.getPriority() > >> maxProvider.getPriority()) { >> + maxProvider = provider; >> + } >> + } >> + if (maxProvider != null) { >> + ProviderUtil.addProvider(maxProvider); >> + } >> + } catch (InvalidSyntaxException ex) { >> + LOGGER.error("Invalid service filter: " + filter, ex); >> + } >> final List<URL> urls = bundleWiring.findEntries("META-INF", >> "log4j-provider.properties", 0); >> for (final URL url : urls) { >> ProviderUtil.loadProvider(url, bundleWiring.getClassLoader()) >> ; >> @@ -86,7 +105,7 @@ public class Activator implements BundleActivator, >> SynchronousBundleListener { >> final BundleWiring self = context.getBundle().adapt( >> BundleWiring.class); >> final List<BundleWire> required = self.getRequiredWires( >> LoggerContextFactory.class.getName()); >> for (final BundleWire wire : required) { >> - loadProvider(wire.getProviderWiring()); >> + loadProvider(context, wire.getProviderWiring()); >> } >> context.addBundleListener(this); >> final Bundle[] bundles = context.getBundles(); >> >> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ >> 2c16e17d/log4j-api/src/main/java/org/apache/logging/log4j/ >> util/ProviderUtil.java >> ---------------------------------------------------------------------- >> diff --git >> a/log4j-api/src/main/java/org/apache/logging/log4j/util/ProviderUtil.java >> b/log4j-api/src/main/java/org/apache/logging/log4j/util/ProviderUtil.java >> index 3bb5ad4..9449217 100644 >> --- a/log4j-api/src/main/java/org/apache/logging/log4j/util/ >> ProviderUtil.java >> +++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/ >> ProviderUtil.java >> @@ -69,6 +69,11 @@ public final class ProviderUtil { >> } >> } >> >> + protected static void addProvider(Provider provider) { >> + PROVIDERS.add(provider); >> + LOGGER.debug("Loaded Provider {}", provider); >> + } >> + >> /** >> * Loads an individual Provider implementation. This method is really >> only useful for the OSGi bundle activator and >> * this class itself. >> >> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ >> 2c16e17d/log4j-core/src/main/java/org/apache/logging/log4j/ >> core/osgi/Activator.java >> ---------------------------------------------------------------------- >> diff --git >> a/log4j-core/src/main/java/org/apache/logging/log4j/core/osgi/Activator.java >> b/log4j-core/src/main/java/org/apache/logging/log4j/core/ >> osgi/Activator.java >> index 4da1ecc..ab9f5ba 100644 >> --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/ >> osgi/Activator.java >> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/ >> osgi/Activator.java >> @@ -17,18 +17,22 @@ >> >> package org.apache.logging.log4j.core.osgi; >> >> +import java.util.Hashtable; >> import java.util.concurrent.atomic.AtomicReference; >> >> import org.apache.logging.log4j.LogManager; >> import org.apache.logging.log4j.Logger; >> import org.apache.logging.log4j.core.config.plugins.util.PluginRegistry; >> +import org.apache.logging.log4j.core.impl.Log4jProvider; >> import org.apache.logging.log4j.core.util.Constants; >> +import org.apache.logging.log4j.spi.Provider; >> import org.apache.logging.log4j.status.StatusLogger; >> import org.apache.logging.log4j.util.PropertiesUtil; >> import org.osgi.framework.Bundle; >> import org.osgi.framework.BundleActivator; >> import org.osgi.framework.BundleContext; >> import org.osgi.framework.BundleEvent; >> +import org.osgi.framework.ServiceRegistration; >> import org.osgi.framework.SynchronousBundleListener; >> import org.osgi.framework.wiring.BundleWiring; >> >> @@ -41,8 +45,14 @@ public final class Activator implements >> BundleActivator, SynchronousBundleListen >> >> private final AtomicReference<BundleContext> contextRef = new >> AtomicReference<>(); >> >> + ServiceRegistration provideRegistration = null; >> + >> @Override >> public void start(final BundleContext context) throws Exception { >> + Provider provider = new Log4jProvider(); >> + Hashtable<String, String> props = new Hashtable<>(); >> + props.put("APIVersion", "2.60"); >> + provideRegistration = >> context.registerService(Provider.class.getName(), >> provider, props); >> // allow the user to override the default ContextSelector (e.g., >> by using BasicContextSelector for a global cfg) >> if >> (PropertiesUtil.getProperties().getStringProperty(Constants.LOG4J_CONTEXT_SELECTOR) >> == null) { >> System.setProperty(Constants.LOG4J_CONTEXT_SELECTOR, >> BundleContextSelector.class.getName()); >> @@ -80,6 +90,7 @@ public final class Activator implements BundleActivator, >> SynchronousBundleListen >> >> @Override >> public void stop(final BundleContext context) throws Exception { >> + provideRegistration.unregister(); >> this.contextRef.compareAndSet(context, null); >> LogManager.shutdown(); >> } >> >> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ >> 2c16e17d/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ >> FileAppenderPermissionsTest.java >> ---------------------------------------------------------------------- >> diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/ >> appender/FileAppenderPermissionsTest.java b/log4j-core/src/test/java/ >> org/apache/logging/log4j/core/appender/FileAppenderPermissionsTest.java >> index 8f67a27..6dbd712 100644 >> --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ >> FileAppenderPermissionsTest.java >> +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ >> FileAppenderPermissionsTest.java >> @@ -33,9 +33,11 @@ import java.util.Arrays; >> import java.util.Collection; >> import java.util.List; >> >> +import org.apache.commons.lang3.SystemUtils; >> import org.apache.logging.log4j.Level; >> import org.apache.logging.log4j.core.Layout; >> import org.apache.logging.log4j.core.LogEvent; >> +import org.apache.logging.log4j.core.config.status.StatusConfiguration; >> import org.apache.logging.log4j.core.impl.Log4jLogEvent; >> import org.apache.logging.log4j.core.layout.PatternLayout; >> import org.apache.logging.log4j.core.util.FileUtils; >> @@ -79,6 +81,7 @@ public class FileAppenderPermissionsTest { >> >> @BeforeClass >> public static void beforeClass() { >> + System.setProperty("log4j2.debug", "true"); >> Assume.assumeTrue(FileUtils.isFilePosixAttributeViewSupported()); >> } >> >> @@ -188,6 +191,9 @@ public class FileAppenderPermissionsTest { >> } >> >> public static String findAGroup(final String user) throws IOException >> { >> + if (SystemUtils.IS_OS_MAC_OSX) { >> + return "staff"; >> + } >> String group = user; >> try (FileInputStream fis = new FileInputStream("/etc/group")) { >> final List<String> groups = >> org.apache.commons.io.IOUtils.readLines(fis, >> Charset.defaultCharset()); >> >> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ >> 2c16e17d/log4j-core/src/test/java/org/apache/logging/log4j/ >> core/appender/rolling/RollingAppenderDirectWriteTemp >> CompressedFilePatternTest.java >> ---------------------------------------------------------------------- >> diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/ >> appender/rolling/RollingAppenderDirectWriteTempCompressedFilePatternTest.java >> b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/ >> RollingAppenderDirectWriteTempCompressedFilePatternTest.java >> index 4e913cf..06f1cbc 100644 >> --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/ >> appender/rolling/RollingAppenderDirectWriteTemp >> CompressedFilePatternTest.java >> +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/ >> appender/rolling/RollingAppenderDirectWriteTemp >> CompressedFilePatternTest.java >> @@ -32,8 +32,10 @@ import java.nio.file.WatchEvent; >> import java.nio.file.WatchKey; >> import java.nio.file.WatchService; >> >> +import org.apache.commons.lang3.SystemUtils; >> import org.apache.logging.log4j.Logger; >> import org.apache.logging.log4j.junit.LoggerContextRule; >> +import org.junit.Assume; >> import org.junit.Before; >> import org.junit.Rule; >> import org.junit.Test; >> @@ -58,6 +60,8 @@ public class >> RollingAppenderDirectWriteTempCompressedFilePatternTest >> { >> >> @Before >> public void setUp() throws Exception { >> + // Disable this test on MacOS. FileWatcher isn't fast enough to >> work properly. >> + Assume.assumeTrue(!SystemUtils.IS_OS_MAC_OSX); >> this.logger = loggerContextRule.getLogger( >> RollingAppenderDirectWriteTest.class.getName()); >> } >> >> >> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ >> 2c16e17d/log4j-core/src/test/java/org/apache/logging/log4j/ >> core/appender/rolling/RollingAppenderTempCompressedFilePatternTest.java >> ---------------------------------------------------------------------- >> diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/ >> appender/rolling/RollingAppenderTempCompressedFilePatternTest.java >> b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/ >> RollingAppenderTempCompressedFilePatternTest.java >> index c1755ee..03fd6be 100644 >> --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/ >> appender/rolling/RollingAppenderTempCompressedFilePatternTest.java >> +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/ >> appender/rolling/RollingAppenderTempCompressedFilePatternTest.java >> @@ -38,9 +38,11 @@ import java.util.concurrent.TimeUnit; >> import org.apache.commons.compress.compressors.CompressorException; >> import org.apache.commons.compress.compressors.CompressorStreamFactory; >> import org.apache.commons.compress.utils.IOUtils; >> +import org.apache.commons.lang3.SystemUtils; >> import org.apache.logging.log4j.Logger; >> import org.apache.logging.log4j.core.util.Closer; >> import org.apache.logging.log4j.junit.LoggerContextRule; >> +import org.junit.Assume; >> import org.junit.Before; >> import org.junit.Rule; >> import org.junit.Test; >> @@ -66,6 +68,8 @@ public class RollingAppenderTempCompressedFilePatternTest >> { >> >> @Before >> public void setUp() throws Exception { >> + // Disable this test on MacOS. FileWatcher isn't fast enough to >> work properly. >> + Assume.assumeTrue(!SystemUtils.IS_OS_MAC_OSX); >> this.logger = loggerContextRule.getLogger( >> RollingAppenderTempCompressedFilePatternTest.class.getName()); >> } >> >> >> > > > -- > Matt Sicker <[email protected]>
