Simplify addons tracker
diff --git a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/AddonsServiceTrackerCustomizer.java b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/AddonsServiceTrackerCustomizer.java
index ddf4cb2..9db1aea 100644
--- a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/AddonsServiceTrackerCustomizer.java
+++ b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/AddonsServiceTrackerCustomizer.java
@@ -21,15 +21,12 @@
import org.osgi.framework.ServiceReference;
import org.osgi.util.tracker.ServiceTrackerCustomizer;
-import javax.ws.rs.ext.Provider;
-
public class AddonsServiceTrackerCustomizer
implements
ServiceTrackerCustomizer<CXFJaxRsServiceRegistrator, CXFJaxRsServiceRegistrator> {
private final BundleContext _bundleContext;
private final ClassLoader _classLoader;
- private final Class<?> _serviceClass;
private final Object _service;
public AddonsServiceTrackerCustomizer(
@@ -39,42 +36,19 @@
_bundleContext = bundleContext;
_classLoader = classLoader;
_service = service;
-
- _serviceClass = service.getClass();
}
@Override
- public CXFJaxRsServiceRegistrator addingService(
- ServiceReference<CXFJaxRsServiceRegistrator> reference) {
-
- Thread thread = Thread.currentThread();
-
- ClassLoader contextClassLoader =
- thread.getContextClassLoader();
-
- CXFJaxRsServiceRegistrator cxfJaxRsServiceRegistrator =
- _bundleContext.getService(reference);
-
+ public CXFJaxRsServiceRegistrator addingService(ServiceReference<CXFJaxRsServiceRegistrator> reference) {
+ CXFJaxRsServiceRegistrator registrator = _bundleContext.getService(reference);
try {
- thread.setContextClassLoader(_classLoader);
-
- if (_serviceClass.isAnnotationPresent(Provider.class)) {
- cxfJaxRsServiceRegistrator.addProvider(_service);
- } else {
- cxfJaxRsServiceRegistrator.addService(_service);
- }
-
-
- return cxfJaxRsServiceRegistrator;
+ runInClassLoader(_classLoader, () -> registrator.add(_service));
+ return registrator;
}
catch (Exception e) {
_bundleContext.ungetService(reference);
-
throw e;
}
- finally {
- thread.setContextClassLoader(contextClassLoader);
- }
}
@Override
@@ -83,7 +57,6 @@
CXFJaxRsServiceRegistrator cxfJaxRsServiceRegistrator) {
removedService(reference, cxfJaxRsServiceRegistrator);
-
addingService(reference);
}
@@ -92,13 +65,20 @@
ServiceReference<CXFJaxRsServiceRegistrator> reference,
CXFJaxRsServiceRegistrator cxfJaxRsServiceRegistrator) {
- if (_serviceClass.isAnnotationPresent(Provider.class)) {
- cxfJaxRsServiceRegistrator.removeProvider(_service);
- } else {
- cxfJaxRsServiceRegistrator.removeService(_service);
- }
-
+ cxfJaxRsServiceRegistrator.remove(_service);
_bundleContext.ungetService(reference);
}
-
+
+ private void runInClassLoader(ClassLoader cl, Runnable runable) {
+ Thread thread = Thread.currentThread();
+ ClassLoader contextClassLoader = thread.getContextClassLoader();
+ try {
+ thread.setContextClassLoader(_classLoader);
+ runable.run();
+ }
+ finally {
+ thread.setContextClassLoader(contextClassLoader);
+ }
+ }
+
}
diff --git a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/CXFJaxRsServiceRegistrator.java b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/CXFJaxRsServiceRegistrator.java
index e3e8583..43f6ddb 100644
--- a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/CXFJaxRsServiceRegistrator.java
+++ b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/CXFJaxRsServiceRegistrator.java
@@ -23,6 +23,7 @@
import java.util.Map;
import javax.ws.rs.core.Application;
+import javax.ws.rs.ext.Provider;
import javax.ws.rs.ext.RuntimeDelegate;
import org.apache.cxf.Bus;
@@ -33,6 +34,13 @@
import org.osgi.framework.ServiceReference;
public class CXFJaxRsServiceRegistrator {
+ private volatile boolean _closed = false;
+ private final Application _application;
+ private final Bus _bus;
+ private final Map<String, Object> _properties;
+ private final Collection<Object> _providers = new ArrayList<>();
+ private Server _server;
+ private final Collection<Object> _services = new ArrayList<>();
public CXFJaxRsServiceRegistrator(
Bus bus, Application application, Map<String, Object> properties) {
@@ -71,43 +79,27 @@
_closed = true;
}
- public void addProvider(Object provider) {
+ public void add(Object object) {
if (_closed) {
return;
}
-
- _providers.add(provider);
-
+ if (object.getClass().isAnnotationPresent(Provider.class)) {
+ _providers.add(object);
+ } else {
+ _services.add(object);
+ }
rewire();
}
- public void addService(Object service) {
+ public void remove(Object object) {
if (_closed) {
return;
}
-
- _services.add(service);
-
- rewire();
- }
-
- public void removeProvider(Object provider) {
- if (_closed) {
- return;
+ if (object.getClass().isAnnotationPresent(Provider.class)) {
+ _providers.remove(object);
+ } else {
+ _services.remove(object);
}
-
- _providers.remove(provider);
-
- rewire();
- }
-
- public void removeService(Object service) {
- if (_closed) {
- return;
- }
-
- _services.remove(service);
-
rewire();
}
@@ -154,12 +146,4 @@
_server.start();
}
- private volatile boolean _closed = false;
- private final Application _application;
- private final Bus _bus;
- private final Map<String, Object> _properties;
- private final Collection<Object> _providers = new ArrayList<>();
- private Server _server;
- private final Collection<Object> _services = new ArrayList<>();
-
}
diff --git a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/FiltersAndInterceptorsServiceTrackerCustomizer.java b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/FiltersAndInterceptorsServiceTrackerCustomizer.java
index 71c8725..9e516b8 100644
--- a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/FiltersAndInterceptorsServiceTrackerCustomizer.java
+++ b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/FiltersAndInterceptorsServiceTrackerCustomizer.java
@@ -62,7 +62,7 @@
CXFJaxRsServiceRegistrator serviceRegistrator =
_bundleContext.getService(cxfReference);
try {
- serviceRegistrator.addProvider(service);
+ serviceRegistrator.add(service);
return serviceRegistrator;
}
@@ -89,7 +89,7 @@
CXFJaxRsServiceRegistrator serviceRegistrator) {
try {
- serviceRegistrator.removeProvider(service);
+ serviceRegistrator.remove(service);
}
finally {
_bundleContext.ungetService(reference);
diff --git a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/ServicesServiceTrackerCustomizer.java b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/ServicesServiceTrackerCustomizer.java
index fa5410b..758199a 100644
--- a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/ServicesServiceTrackerCustomizer.java
+++ b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/ServicesServiceTrackerCustomizer.java
@@ -26,10 +26,7 @@
import org.osgi.util.tracker.ServiceTracker;
import org.osgi.util.tracker.ServiceTrackerCustomizer;
-public class ServicesServiceTrackerCustomizer
- implements ServiceTrackerCustomizer
- <Object, ServiceTracker
- <CXFJaxRsServiceRegistrator, ?>> {
+public class ServicesServiceTrackerCustomizer implements ServiceTrackerCustomizer<Object, ServiceTracker<?, ?>> {
private final BundleContext _bundleContext;
@@ -38,61 +35,39 @@
}
@Override
- public ServiceTracker
- <CXFJaxRsServiceRegistrator, ?>
- addingService(ServiceReference<Object> reference) {
-
- String applicationSelector =
- reference.getProperty("jaxrs.application.select").toString();
-
+ public ServiceTracker<?, ?> addingService(ServiceReference<Object> reference) {
+ String applicationSelector = reference.getProperty("jaxrs.application.select").toString();
Bundle bundle = reference.getBundle();
-
BundleWiring bundleWiring = bundle.adapt(BundleWiring.class);
-
ClassLoader classLoader = bundleWiring.getClassLoader();
-
Object service = _bundleContext.getService(reference);
-
try {
Filter filter = _bundleContext.createFilter(
"(&(objectClass=" + CXFJaxRsServiceRegistrator.class.getName() +
- ")" + applicationSelector + ")");
-
- ServiceTracker
- <CXFJaxRsServiceRegistrator, ?>
- serviceTracker = new ServiceTracker<>(
- _bundleContext, filter,
+ ")" + applicationSelector + ")");
+ ServiceTracker<?, ?> serviceTracker = new ServiceTracker<>(
+ _bundleContext,
+ filter,
new AddonsServiceTrackerCustomizer(
_bundleContext, classLoader, service));
-
serviceTracker.open();
-
return serviceTracker;
}
catch (InvalidSyntaxException ise) {
_bundleContext.ungetService(reference);
-
throw new RuntimeException(ise);
}
}
@Override
- public void modifiedService(
- ServiceReference<Object> reference,
- ServiceTracker<CXFJaxRsServiceRegistrator, ?> serviceTracker) {
-
+ public void modifiedService(ServiceReference<Object> reference, ServiceTracker<?, ?> serviceTracker) {
removedService(reference, serviceTracker);
-
addingService(reference);
}
@Override
- public void removedService(
- ServiceReference<Object> reference,
- ServiceTracker<CXFJaxRsServiceRegistrator, ?> serviceTracker) {
-
+ public void removedService(ServiceReference<Object> reference, ServiceTracker<?, ?> serviceTracker) {
serviceTracker.close();
-
_bundleContext.ungetService(reference);
}