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()