This is an automated email from the ASF dual-hosted git repository.

pottlinger pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-tamaya.git


The following commit(s) were added to refs/heads/master by this push:
     new ceb848a  TAMAYA-383 Let OSGi skip thread classloader key
     new 8615fa4  Merge pull request #42 from 
peculater/TAMAYA-383-serviceloader-key-by-static-class-loader
ceb848a is described below

commit ceb848ab2b14b1422688218afa668b4b4742c857
Author: William Lieurance <[email protected]>
AuthorDate: Mon Feb 11 01:28:49 2019 -0600

    TAMAYA-383 Let OSGi skip thread classloader key
    
    We use the thread's classloader as a key into a hashmap to find the
    serviceloader for a given configuration.  In OSGi, we have separate
    classloaders for the CoreConfigurationBuilder,
    DefaultConfigurationBuilder, and ServiceContextManager.  That confusion
    prevents the simple case from finding a match in the hashmap that can
    load a particular ServiceContext.  Since
    CoreConfiguation/DefaultConfiguration already uses the static class's
    classloader during <init>, this PR allows the OSGIActivator to point
    that classloader at the relevant OSGIServiceContext.
---
 .../apache/tamaya/spi/ServiceContextManager.java   | 35 ++++++++++++++--------
 .../java/org/apache/tamaya/core/OSGIActivator.java |  2 +-
 2 files changed, 23 insertions(+), 14 deletions(-)

diff --git 
a/code/api/src/main/java/org/apache/tamaya/spi/ServiceContextManager.java 
b/code/api/src/main/java/org/apache/tamaya/spi/ServiceContextManager.java
index 9909a40..4a5de3a 100644
--- a/code/api/src/main/java/org/apache/tamaya/spi/ServiceContextManager.java
+++ b/code/api/src/main/java/org/apache/tamaya/spi/ServiceContextManager.java
@@ -84,11 +84,28 @@ public final class ServiceContextManager {
      */
     public static ServiceContext set(ServiceContext serviceContext) {
         Objects.requireNonNull(serviceContext);
+        return setWithClassLoader(serviceContext, 
serviceContext.getClassLoader());
+    }
+    
+    /**
+     * Replace the current {@link ServiceContext} for the 
ServiceContextManager's classloader in use.
+     *
+     * @param serviceContext the new {@link ServiceContext}, not {@code null}.
+     * @return the currently used context after setting it.
+     */
+    public static ServiceContext setToStaticClassLoader(ServiceContext 
serviceContext) {
+        Objects.requireNonNull(serviceContext);
+        return setWithClassLoader(serviceContext, 
ServiceContextManager.class.getClassLoader());
+    }
+    
+    private static ServiceContext setWithClassLoader(ServiceContext 
serviceContext, ClassLoader cl) {
+        Objects.requireNonNull(serviceContext);
+        Objects.requireNonNull(cl);
 
         ServiceContext previousContext;
         synchronized (ServiceContextManager.class) {
             previousContext = ServiceContextManager.serviceContexts
-                    .put(serviceContext.getClassLoader(), serviceContext);
+                    .put(cl, serviceContext);
         }
         if(previousContext!=null) {
             LOG.log(Level.WARNING, "Replaced ServiceProvider " +
@@ -101,7 +118,7 @@ public final class ServiceContextManager {
         }
         return serviceContext;
     }
-
+    
     /**
      * Ge {@link ServiceContext}. If necessary the {@link ServiceContext} will 
be laziliy loaded.
      *
@@ -119,22 +136,14 @@ public final class ServiceContextManager {
      * @return the {@link ServiceContext} used.
      */
     public static ServiceContext getServiceContext() {
-        ClassLoader cl = Thread.currentThread().getContextClassLoader();
-        if(cl==null){
-            cl = ServiceContextManager.class.getClassLoader();
-        }
-        return getServiceContext(cl);
+        return getServiceContext(getDefaultClassLoader());
     }
 
     /**
-     * Evaluate the default classloader: 1. the thread context classloader, 2. 
This class's classloader.
+     * Evaluate the default classloader: This class's classloader.
      * @return the classloder, not null.
      */
     public static ClassLoader getDefaultClassLoader() {
-        ClassLoader cl = Thread.currentThread().getContextClassLoader();
-        if(cl==null){
-            cl = ServiceContextManager.class.getClassLoader();
-        }
-        return cl;
+        return ServiceContextManager.class.getClassLoader();
     }
 }
diff --git a/code/core/src/main/java/org/apache/tamaya/core/OSGIActivator.java 
b/code/core/src/main/java/org/apache/tamaya/core/OSGIActivator.java
index 842b8c6..50e81cb 100644
--- a/code/core/src/main/java/org/apache/tamaya/core/OSGIActivator.java
+++ b/code/core/src/main/java/org/apache/tamaya/core/OSGIActivator.java
@@ -46,7 +46,7 @@ public class OSGIActivator implements BundleActivator {
         // Register marker service
         this.serviceLoader = new OSGIServiceLoader(context);
         context.addBundleListener(serviceLoader);
-        ServiceContextManager.set(new OSGIServiceContext(serviceLoader));
+        ServiceContextManager.setToStaticClassLoader(new 
OSGIServiceContext(serviceLoader));
         LOG.info("Registered Tamaya OSGI ServiceContext...");
         Configuration.setCurrent(
                        new CoreConfigurationBuilder()

Reply via email to