simplify by not publishing the Bus service
diff --git a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/activator/CXFJaxRsBundleActivator.java b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/activator/CXFJaxRsBundleActivator.java
index 918b619..97555bd 100644
--- a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/activator/CXFJaxRsBundleActivator.java
+++ b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/activator/CXFJaxRsBundleActivator.java
@@ -17,41 +17,74 @@
package org.apache.aries.jax.rs.whiteboard.activator;
+import javax.servlet.Servlet;
+import javax.ws.rs.core.Application;
import javax.ws.rs.ext.RuntimeDelegate;
+import org.apache.aries.jax.rs.whiteboard.internal.ApplicationServiceTrackerCustomizer;
+import org.apache.aries.jax.rs.whiteboard.internal.FiltersAndInterceptorsServiceTrackerCustomizer;
+import org.apache.aries.jax.rs.whiteboard.internal.SingletonServiceTrackerCustomizer;
import org.apache.cxf.Bus;
+import org.apache.cxf.BusFactory;
+import org.apache.cxf.bus.CXFBusFactory;
+import org.apache.cxf.transport.servlet.CXFNonSpringServlet;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
import org.osgi.framework.Filter;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceRegistration;
import org.osgi.framework.wiring.BundleWiring;
import org.osgi.util.tracker.ServiceTracker;
-import org.apache.aries.jax.rs.whiteboard.internal.BusServiceTrackerCustomizer;
import org.apache.aries.jax.rs.whiteboard.internal.ServicesServiceTrackerCustomizer;
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import static org.osgi.service.http.whiteboard.HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME;
+import static org.osgi.service.http.whiteboard.HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT;
+import static org.osgi.service.http.whiteboard.HttpWhiteboardConstants.HTTP_WHITEBOARD_DEFAULT_CONTEXT_NAME;
+import static org.osgi.service.http.whiteboard.HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN;
+
public class CXFJaxRsBundleActivator implements BundleActivator {
- private ServiceTracker<?, ?> _busServiceTracker;
private ServiceTracker<?, ?> _singletonsTracker;
- private ServicesRegistrator _servicesRegistrator;
+ private BundleContext _bundleContext;
+ private ServiceTracker<Application, ?> _applicationTracker;
+ private ServiceTracker<Object, ?> _singletonsServiceTracker;
+ private ServiceTracker<Object, ?> _filtersAndInterceptorsServiceTracker;
@Override
public void start(BundleContext bundleContext) throws Exception {
+ _bundleContext = bundleContext;
initRuntimeDelegate(bundleContext);
// TODO make the context path of the JAX-RS Whiteboard configurable.
- _servicesRegistrator = new ServicesRegistrator(bundleContext);
- _servicesRegistrator.start();
+ Bus bus = BusFactory.newInstance(
+ CXFBusFactory.class.getName()).createBus();
+ registerCXFServletService(bus);
- _busServiceTracker = new ServiceTracker<>(
- bundleContext, Bus.class,
- new BusServiceTrackerCustomizer(bundleContext));
- _busServiceTracker.open();
+ _applicationTracker = new ServiceTracker<>(
+ bundleContext, getApplicationFilter(),
+ new ApplicationServiceTrackerCustomizer(bundleContext, bus));
+ _applicationTracker.open();
+ _singletonsServiceTracker = new ServiceTracker<>(
+ bundleContext, getSingletonsFilter(),
+ new SingletonServiceTrackerCustomizer(bundleContext, bus));
+ _singletonsServiceTracker.open();
+
+ _filtersAndInterceptorsServiceTracker = new ServiceTracker<>(
+ bundleContext, getFiltersFilter(),
+ new FiltersAndInterceptorsServiceTrackerCustomizer(bundleContext));
+ _filtersAndInterceptorsServiceTracker.open();
+
Filter filter = bundleContext.createFilter(
"(jaxrs.application.select=*)");
+
_singletonsTracker = new ServiceTracker<>(
- bundleContext, filter,
+ bundleContext, filter,
new ServicesServiceTrackerCustomizer(bundleContext));
_singletonsTracker.open();
}
@@ -63,7 +96,8 @@
private void initRuntimeDelegate(BundleContext bundleContext) {
Thread thread = Thread.currentThread();
ClassLoader oldClassLoader = thread.getContextClassLoader();
- BundleWiring bundleWiring = bundleContext.getBundle().adapt(BundleWiring.class);
+ BundleWiring bundleWiring = bundleContext.getBundle().adapt(
+ BundleWiring.class);
thread.setContextClassLoader(bundleWiring.getClassLoader());
try {
RuntimeDelegate.getInstance();
@@ -73,11 +107,44 @@
}
}
+ private ServiceRegistration<Servlet> registerCXFServletService(Bus bus) {
+ Dictionary<String, Object> properties = new Hashtable<>();
+ properties.put(HTTP_WHITEBOARD_CONTEXT_SELECT,
+ "(" + HTTP_WHITEBOARD_CONTEXT_NAME + "=" +
+ HTTP_WHITEBOARD_DEFAULT_CONTEXT_NAME + ")");
+ properties.put(HTTP_WHITEBOARD_SERVLET_PATTERN, "/*");
+ properties.put(Constants.SERVICE_RANKING, -1);
+ CXFNonSpringServlet cxfNonSpringServlet = createCXFServlet(bus);
+ return _bundleContext.registerService(
+ Servlet.class, cxfNonSpringServlet, properties);
+ }
+
+ private CXFNonSpringServlet createCXFServlet(Bus bus) {
+ CXFNonSpringServlet cxfNonSpringServlet = new CXFNonSpringServlet();
+ cxfNonSpringServlet.setBus(bus);
+ return cxfNonSpringServlet;
+ }
+
+ private Filter getFiltersFilter() throws InvalidSyntaxException {
+ return _bundleContext.createFilter("(osgi.jaxrs.filter.base=*)");
+ }
+
+ private Filter getApplicationFilter() throws InvalidSyntaxException {
+ return _bundleContext.createFilter(
+ "(&(objectClass=" + Application.class.getName() + ")" +
+ "(osgi.jaxrs.application.base=*))");
+ }
+
+ private Filter getSingletonsFilter() throws InvalidSyntaxException {
+ return _bundleContext.createFilter("(osgi.jaxrs.resource.base=*)");
+ }
+
@Override
public void stop(BundleContext context) throws Exception {
- _busServiceTracker.close();
+ _applicationTracker.close();
+ _filtersAndInterceptorsServiceTracker.close();
+ _singletonsServiceTracker.close();
_singletonsTracker.close();
- _servicesRegistrator.stop();
}
}
diff --git a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/activator/ServicesRegistrator.java b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/activator/ServicesRegistrator.java
deleted file mode 100644
index 7905c4a..0000000
--- a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/activator/ServicesRegistrator.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.aries.jax.rs.whiteboard.activator;
-
-import org.apache.cxf.Bus;
-import org.apache.cxf.BusFactory;
-import org.apache.cxf.bus.CXFBusFactory;
-import org.apache.cxf.transport.servlet.CXFNonSpringServlet;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.Constants;
-import org.osgi.framework.Filter;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceReference;
-import org.osgi.framework.ServiceRegistration;
-import org.osgi.service.http.context.ServletContextHelper;
-import org.osgi.util.tracker.ServiceTracker;
-import org.osgi.util.tracker.ServiceTrackerCustomizer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.servlet.Servlet;
-
-import static org.osgi.service.http.whiteboard.HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME;
-import static org.osgi.service.http.whiteboard.HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH;
-import static org.osgi.service.http.whiteboard.HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT;
-import static org.osgi.service.http.whiteboard.HttpWhiteboardConstants.HTTP_WHITEBOARD_DEFAULT_CONTEXT_NAME;
-import static org.osgi.service.http.whiteboard.HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN;
-
-import java.util.Dictionary;
-import java.util.Hashtable;
-
-public class ServicesRegistrator
- implements ServiceTrackerCustomizer<ServletContextHelper, Object> {
-
- private static final Logger _logger = LoggerFactory.getLogger(ServicesRegistrator.class);
-
- private final BundleContext _bundleContext;
- private ServiceRegistration<Bus> _busServiceRegistration;
- private ServiceTracker<ServletContextHelper, Object> _serviceTracker;
- private ServiceRegistration<Servlet> _servletServiceRegistration;
-
- public ServicesRegistrator(BundleContext bundleContext) {
- _bundleContext = bundleContext;
- }
-
- @Override
- public Object addingService(ServiceReference<ServletContextHelper> reference) {
- Bus bus = BusFactory.newInstance(CXFBusFactory.class.getName()).createBus();
- _servletServiceRegistration = createCXFServletService(bus);
- _busServiceRegistration = createBusService(reference, bus);
- return new Object();
- }
-
- private ServiceRegistration<Servlet> createCXFServletService(Bus bus) {
- Dictionary<String, Object> properties = new Hashtable<>();
- properties.put(HTTP_WHITEBOARD_CONTEXT_SELECT,
- "(" + HTTP_WHITEBOARD_CONTEXT_NAME + "=" + HTTP_WHITEBOARD_DEFAULT_CONTEXT_NAME + ")");
- properties.put(HTTP_WHITEBOARD_SERVLET_PATTERN, "/*");
- properties.put(Constants.SERVICE_RANKING, -1);
-
- CXFNonSpringServlet cxfNonSpringServlet = new CXFNonSpringServlet();
- cxfNonSpringServlet.setBus(bus);
- return _bundleContext.registerService(Servlet.class, cxfNonSpringServlet, properties);
- }
-
- private ServiceRegistration<Bus> createBusService(ServiceReference<ServletContextHelper> reference, Bus bus) {
- Dictionary<String, Object> properties = new Hashtable<>();
- String contextPath = (String)reference.getProperty(HTTP_WHITEBOARD_CONTEXT_PATH);
- properties.put(HTTP_WHITEBOARD_CONTEXT_PATH, contextPath);
- return _bundleContext.registerService(Bus.class, bus, properties);
- }
-
- @Override
- public void modifiedService(ServiceReference<ServletContextHelper> reference, Object object) {
- }
-
- @Override
- public void removedService(ServiceReference<ServletContextHelper> reference, Object object) {
- unregister(_busServiceRegistration);
- unregister(_servletServiceRegistration);
- }
-
- private void unregister(ServiceRegistration<?> reg) {
- try {
- reg.unregister();
- }
- catch (Exception e) {
- _logger.warn("Unable to unregister CXF bus service registration " + reg);
- }
- }
-
- public void start() throws InvalidSyntaxException {
- String filterS = String.format("(&(objectClass=%s)(%s=%s))",
- ServletContextHelper.class.getName(),
- HTTP_WHITEBOARD_CONTEXT_NAME,
- HTTP_WHITEBOARD_DEFAULT_CONTEXT_NAME);
- Filter filter = _bundleContext.createFilter(filterS);
- _serviceTracker = new ServiceTracker<>(_bundleContext, filter, this);
- _serviceTracker.open();
- }
-
- public void stop() {
- _serviceTracker.close();
- }
-
-}
diff --git a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/ApplicationServiceTrackerCustomizer.java b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/ApplicationServiceTrackerCustomizer.java
index 01edbbc..264a3fd 100644
--- a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/ApplicationServiceTrackerCustomizer.java
+++ b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/ApplicationServiceTrackerCustomizer.java
@@ -29,7 +29,7 @@
import org.osgi.framework.ServiceRegistration;
import org.osgi.util.tracker.ServiceTrackerCustomizer;
-class ApplicationServiceTrackerCustomizer
+public class ApplicationServiceTrackerCustomizer
implements ServiceTrackerCustomizer
<Application, ApplicationServiceTrackerCustomizer.Tracked> {
diff --git a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/BusServiceTrackerCustomizer.java b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/BusServiceTrackerCustomizer.java
deleted file mode 100644
index 2801146..0000000
--- a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/BusServiceTrackerCustomizer.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.aries.jax.rs.whiteboard.internal;
-
-import java.util.Arrays;
-import java.util.Collection;
-
-import javax.ws.rs.core.Application;
-
-import org.apache.cxf.Bus;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.Filter;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceReference;
-import org.osgi.util.tracker.ServiceTracker;
-import org.osgi.util.tracker.ServiceTrackerCustomizer;
-
-public class BusServiceTrackerCustomizer
- implements ServiceTrackerCustomizer<Bus, Collection<ServiceTracker<?, ?>>> {
-
- private BundleContext _bundleContext;
-
- public BusServiceTrackerCustomizer(BundleContext bundleContext) {
- _bundleContext = bundleContext;
- }
-
- @Override
- public Collection<ServiceTracker<?, ?>>
- addingService(ServiceReference<Bus> serviceReference) {
-
- Bus bus = _bundleContext.getService(serviceReference);
-
- try {
- ServiceTracker<Application,?> applicationTracker =
- new ServiceTracker<>(_bundleContext, getApplicationFilter(),
- new ApplicationServiceTrackerCustomizer(
- _bundleContext, bus));
-
- applicationTracker.open();
-
- ServiceTracker<Object, ?> singletonsServiceTracker =
- new ServiceTracker<>(_bundleContext, getSingletonsFilter(),
- new SingletonServiceTrackerCustomizer(_bundleContext, bus));
-
- singletonsServiceTracker.open();
-
- ServiceTracker<Object, ?> filtersAndInterceptorsServiceTracker =
- new ServiceTracker<>(_bundleContext, getFiltersFilter(),
- new FiltersAndInterceptorsServiceTrackerCustomizer(
- _bundleContext));
-
- filtersAndInterceptorsServiceTracker.open();
-
- return Arrays.asList(applicationTracker, singletonsServiceTracker,
- filtersAndInterceptorsServiceTracker);
- }
- catch (InvalidSyntaxException ise) {
- throw new RuntimeException(ise);
- }
- catch (Exception e) {
- _bundleContext.ungetService(serviceReference);
-
- throw e;
- }
- }
-
- private Filter getFiltersFilter() throws InvalidSyntaxException {
- return _bundleContext.createFilter("(osgi.jaxrs.filter.base=*)");
- }
-
- private Filter getApplicationFilter() throws InvalidSyntaxException {
- return _bundleContext.createFilter(
- "(&(objectClass=" + Application.class.getName() + ")" +
- "(osgi.jaxrs.application.base=*))");
- }
-
- private Filter getSingletonsFilter() throws InvalidSyntaxException {
- return _bundleContext.createFilter("(osgi.jaxrs.resource.base=*)");
- }
-
- @Override
- public void modifiedService(
- ServiceReference<Bus> reference,
- Collection<ServiceTracker<?, ?>> serviceTrackers) {
-
- removedService(reference, serviceTrackers);
-
- addingService(reference);
- }
-
- @Override
- public void removedService(
- ServiceReference<Bus> serviceReference,
- Collection<ServiceTracker<?, ?>> serviceTrackers) {
-
- _bundleContext.ungetService(serviceReference);
-
- for (ServiceTracker<?, ?> serviceTracker : serviceTrackers) {
- serviceTracker.close();
- }
- }
-
-}
diff --git a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/SingletonServiceTrackerCustomizer.java b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/SingletonServiceTrackerCustomizer.java
index 64bab69..e6c2787 100644
--- a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/SingletonServiceTrackerCustomizer.java
+++ b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/SingletonServiceTrackerCustomizer.java
@@ -30,7 +30,7 @@
import java.util.Map;
import java.util.Set;
-class SingletonServiceTrackerCustomizer
+public class SingletonServiceTrackerCustomizer
implements ServiceTrackerCustomizer
<Object, SingletonServiceTrackerCustomizer.Tracked> {