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

Reply via email to