You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by ma...@apache.org on 2014/07/24 07:02:17 UTC

svn commit: r1612996 - /logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/util/Activator.java

Author: mattsicker
Date: Thu Jul 24 05:02:16 2014
New Revision: 1612996

URL: http://svn.apache.org/r1612996
Log:
Use list of required bundle wires first in Activator to find log4j providers specifying the capability first.

Modified:
    logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/util/Activator.java

Modified: logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/util/Activator.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/util/Activator.java?rev=1612996&r1=1612995&r2=1612996&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/util/Activator.java (original)
+++ logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/util/Activator.java Thu Jul 24 05:02:16 2014
@@ -18,8 +18,10 @@ package org.apache.logging.log4j.util;
 
 import java.net.URL;
 import java.security.Permission;
+import java.util.List;
 
 import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.spi.LoggerContextFactory;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.osgi.framework.AdaptPermission;
 import org.osgi.framework.AdminPermission;
@@ -28,6 +30,7 @@ import org.osgi.framework.BundleActivato
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.BundleEvent;
 import org.osgi.framework.SynchronousBundleListener;
+import org.osgi.framework.wiring.BundleWire;
 import org.osgi.framework.wiring.BundleWiring;
 
 /**
@@ -54,24 +57,29 @@ public class Activator implements Bundle
         }
         try {
             checkPermission(new AdminPermission(bundle, AdminPermission.RESOURCE));
-            final URL url = bundle.getEntry(ProviderUtil.PROVIDER_RESOURCE);
-            if (url != null) {
-                checkPermission(new AdminPermission(bundle, AdminPermission.CLASS));
-                checkPermission(new AdaptPermission(BundleWiring.class.getName(), bundle, AdaptPermission.ADAPT));
-                ProviderUtil.loadProvider(url, getBundleClassLoader(bundle));
-            }
+            checkPermission(new AdaptPermission(BundleWiring.class.getName(), bundle, AdaptPermission.ADAPT));
+            loadProvider(bundle.adapt(BundleWiring.class));
+        } catch (final SecurityException e) {
+            LOGGER.debug("Cannot access bundle [{}] contents. Ignoring.", bundle.getSymbolicName(), e);
         } catch (final Exception e) {
             LOGGER.warn("Problem checking bundle {} for Log4j 2 provider.", bundle.getSymbolicName(), e);
         }
     }
 
-    private static ClassLoader getBundleClassLoader(Bundle bundle) {
-        final BundleWiring wiring = bundle.adapt(BundleWiring.class);
-        return wiring.getClassLoader();
+    private void loadProvider(BundleWiring provider) {
+        final List<URL> urls = provider.findEntries("META-INF", "log4j-provider.properties", 0);
+        for (final URL url : urls) {
+            ProviderUtil.loadProvider(url, provider.getClassLoader());
+        }
     }
 
     @Override
     public void start(final BundleContext context) throws Exception {
+        final BundleWiring self = context.getBundle().adapt(BundleWiring.class);
+        final List<BundleWire> required = self.getRequiredWires(LoggerContextFactory.class.getName());
+        for (BundleWire wire : required) {
+            loadProvider(wire.getProviderWiring());
+        }
         context.addBundleListener(this);
         final Bundle[] bundles = context.getBundles();
         for (final Bundle bundle : bundles) {