This is an automated email from the ASF dual-hosted git repository. csierra pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/aries-jax-rs-whiteboard.git
commit 663414e70301c233ba0a6f47b60502ae15d5d6be Author: Carlos Sierra <csie...@apache.org> AuthorDate: Thu Oct 4 18:12:48 2018 +0200 [ARIES-1843] Check if any service is unregistering If so, don't request a new instance of it. fixes #ARIES-1843 --- .../internal/cxf/CxfJaxrsServiceRegistrator.java | 30 ++++++++++++++++++---- .../utils/ServiceReferenceResourceProvider.java | 14 +++++++++- .../rs/whiteboard/internal/utils/ServiceTuple.java | 10 +++++++- .../jax/rs/whiteboard/internal/utils/Utils.java | 19 ++++++++++++++ 4 files changed, 66 insertions(+), 7 deletions(-) diff --git a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/cxf/CxfJaxrsServiceRegistrator.java b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/cxf/CxfJaxrsServiceRegistrator.java index a70fada..d275acc 100644 --- a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/cxf/CxfJaxrsServiceRegistrator.java +++ b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/cxf/CxfJaxrsServiceRegistrator.java @@ -49,7 +49,6 @@ import org.apache.cxf.endpoint.Server; import org.apache.cxf.jaxrs.JAXRSServerFactoryBean; import org.apache.cxf.jaxrs.JAXRSServiceFactoryBean; import org.apache.cxf.jaxrs.impl.ConfigurableImpl; -import org.apache.cxf.jaxrs.lifecycle.ResourceProvider; import org.apache.cxf.jaxrs.model.ApplicationInfo; import org.apache.cxf.jaxrs.model.ClassResourceInfo; import org.apache.cxf.jaxrs.provider.ProviderFactory.ProviderInfoClassComparator; @@ -76,7 +75,9 @@ public class CxfJaxrsServiceRegistrator { rewire(); } - public synchronized void add(ResourceProvider resourceProvider) { + public synchronized void add( + ServiceReferenceResourceProvider resourceProvider) { + if (_closed) { return; } @@ -168,7 +169,9 @@ public class CxfJaxrsServiceRegistrator { return classes; } - public synchronized void remove(ResourceProvider resourceProvider) { + public synchronized void remove( + ServiceReferenceResourceProvider resourceProvider) { + if (_closed) { return; } @@ -189,7 +192,14 @@ public class CxfJaxrsServiceRegistrator { } protected synchronized void rewire() { + if (!_applicationTuple.isAvailable()) { + _applicationTuple.dispose(); + + return; + } + if (_server != null) { + _server.destroy(); _applicationTuple.refresh(); @@ -234,6 +244,10 @@ public class CxfJaxrsServiceRegistrator { CachingServiceReference<?> cachingServiceReference = provider.getCachingServiceReference(); + if (!provider.isAvailable()) { + continue; + } + Object service = provider.getService(); if (service instanceof Feature || service instanceof DynamicFeature) { @@ -278,7 +292,12 @@ public class CxfJaxrsServiceRegistrator { _jaxRsServerFactoryBean.setFeatures(features); } - for (ResourceProvider resourceProvider: _services) { + for (ServiceReferenceResourceProvider resourceProvider: _services) { + if (!resourceProvider.isAvailable()) { + + continue; + } + _jaxRsServerFactoryBean.setResourceProvider(resourceProvider); } @@ -312,7 +331,8 @@ public class CxfJaxrsServiceRegistrator { private final ServiceTuple<Application> _applicationTuple; private final Bus _bus; private final Collection<ServiceTuple<?>> _providers; - private final Collection<ResourceProvider> _services = new ArrayList<>(); + private final Collection<ServiceReferenceResourceProvider> + _services = new ArrayList<>(); private volatile boolean _closed = false; private JAXRSServerFactoryBean _jaxRsServerFactoryBean; private Map<String, Object> _properties; diff --git a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/utils/ServiceReferenceResourceProvider.java b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/utils/ServiceReferenceResourceProvider.java index 126b88a..cbaf5ad 100644 --- a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/utils/ServiceReferenceResourceProvider.java +++ b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/utils/ServiceReferenceResourceProvider.java @@ -38,7 +38,12 @@ public class ServiceReferenceResourceProvider @Override public Object getInstance(Message m) { - return _serviceObjects.getService(); + if (isAvailable()) { + return _serviceObjects.getService(); + } + else { + return null; + } } @Override @@ -50,6 +55,9 @@ public class ServiceReferenceResourceProvider @SuppressWarnings({ "rawtypes", "unchecked" }) @Override public Class<?> getResourceClass() { + if (!isAvailable()) { + return null; + } Object service = _serviceObjects.getService(); try { @@ -69,4 +77,8 @@ public class ServiceReferenceResourceProvider return _serviceReference; } + public boolean isAvailable() { + return Utils.isAvailable(_serviceObjects.getServiceReference()); + } + } diff --git a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/utils/ServiceTuple.java b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/utils/ServiceTuple.java index 9efd80b..0224ced 100644 --- a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/utils/ServiceTuple.java +++ b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/utils/ServiceTuple.java @@ -18,7 +18,9 @@ package org.apache.aries.jax.rs.whiteboard.internal.utils; import org.apache.aries.component.dsl.CachingServiceReference; +import org.osgi.framework.Bundle; import org.osgi.framework.ServiceObjects; +import org.osgi.framework.ServiceReference; public class ServiceTuple<T> implements Comparable<ServiceTuple<T>> { @@ -47,7 +49,9 @@ public class ServiceTuple<T> implements Comparable<ServiceTuple<T>> { public void refresh() { dispose(); - _service = _serviceObjects.getService(); + if (isAvailable()) { + _service = _serviceObjects.getService(); + } } public T getService() { @@ -77,4 +81,8 @@ public class ServiceTuple<T> implements Comparable<ServiceTuple<T>> { return _serviceReference; } + public boolean isAvailable() { + return Utils.isAvailable(_serviceObjects.getServiceReference()); + } + } diff --git a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/utils/Utils.java b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/utils/Utils.java index c9fa124..a5e0e99 100644 --- a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/utils/Utils.java +++ b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/utils/Utils.java @@ -19,6 +19,7 @@ package org.apache.aries.jax.rs.whiteboard.internal.utils; import org.apache.aries.component.dsl.CachingServiceReference; import org.apache.aries.component.dsl.OSGi; +import org.osgi.framework.Bundle; import org.osgi.framework.ServiceObjects; import org.osgi.framework.ServiceReference; import org.osgi.framework.ServiceRegistration; @@ -140,6 +141,24 @@ public class Utils { ); } + public static boolean isAvailable(ServiceReference<?> serviceReference) { + Bundle bundle = serviceReference.getBundle(); + + if (bundle == null) { + return false; + } + + for (ServiceReference<?> registeredService : + bundle.getRegisteredServices()) { + + if (registeredService.equals(serviceReference)) { + return true; + } + } + + return false; + } + public static void mergePropertyMaps( Map<String, Object> receptor, Map<String, ?> map) {