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