I mean you can wrap the version into the Version class rather than use a double. It has built in logic for comparing API versions, so for example, if Log4j 2.10.0 becomes a required API version, you won't be comparing 2.100 with 2.60.
On 16 July 2017 at 11:21, Ralph Goers <[email protected]> wrote: > 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.isFilePosixAttributeViewSuppor > ted()); > >> } > >> > >> @@ -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/RollingAppenderDirectWriteTemp > CompressedFilePatternTest.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 RollingAppenderDirectWriteTemp > CompressedFilePatternTest > >> { > >> > >> @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 RollingAppenderTempCompressedF > ilePatternTest > >> { > >> > >> @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]> > > > -- Matt Sicker <[email protected]>
