Merge pull request #42 from peculater/TAMAYA-383-serviceloader-key-by-static-class-loader

TAMAYA-383 Let OSGi skip thread classloader key
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 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 @@
         }
         return serviceContext;
     }
-
+    
     /**
      * Ge {@link ServiceContext}. If necessary the {@link ServiceContext} will be laziliy loaded.
      *
@@ -119,22 +136,14 @@
      * @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 @@
         // 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()