Keep track of application dependent services

Project: http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/commit/b8248259
Tree: 
http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/tree/b8248259
Diff: 
http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/diff/b8248259

Branch: refs/heads/master
Commit: b8248259c028ea63555aa50399477ee6c4264a44
Parents: 57c5985
Author: Carlos Sierra <[email protected]>
Authored: Mon Nov 6 14:59:04 2017 +0100
Committer: Carlos Sierra <[email protected]>
Committed: Mon Nov 6 14:59:04 2017 +0100

----------------------------------------------------------------------
 .../internal/AriesJaxRSServiceRuntime.java      | 60 +++++++++++++++++---
 .../jax/rs/whiteboard/internal/Whiteboard.java  | 20 +++++--
 2 files changed, 69 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/b8248259/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/AriesJaxRSServiceRuntime.java
----------------------------------------------------------------------
diff --git 
a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/AriesJaxRSServiceRuntime.java
 
b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/AriesJaxRSServiceRuntime.java
index 7d53b21..be3fa1a 100644
--- 
a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/AriesJaxRSServiceRuntime.java
+++ 
b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/AriesJaxRSServiceRuntime.java
@@ -67,6 +67,10 @@ public class AriesJaxRSServiceRuntime implements 
JaxRSServiceRuntime {
         new CopyOnWriteArrayList<>();
     private Set<CachingServiceReference<Application>> _dependentApplications =
         ConcurrentHashMap.newKeySet();
+    private Set<CachingServiceReference<?>> _applicationDependentExtensions =
+        ConcurrentHashMap.newKeySet();
+    private Set<CachingServiceReference<?>> _applicationDependentResources =
+        ConcurrentHashMap.newKeySet();
     private Collection<CachingServiceReference<Application>> 
_clashingApplications =
         new CopyOnWriteArrayList<>();
     private Collection<CachingServiceReference<Application>> 
_erroredApplications =
@@ -83,6 +87,18 @@ public class AriesJaxRSServiceRuntime implements 
JaxRSServiceRuntime {
         new CopyOnWriteArrayList<>();
     private volatile Map<String, Object> _defaultApplicationProperties;
 
+    public void addApplicationDependentExtension(
+        CachingServiceReference<?> cachingServiceReference) {
+
+        _applicationDependentExtensions.add(cachingServiceReference);
+    }
+
+    public void addApplicationDependentResource(
+        CachingServiceReference<?> cachingServiceReference) {
+
+        _applicationDependentResources.add(cachingServiceReference);
+    }
+
     public void addApplicationEndpoint(
         String applicationName, CachingServiceReference<?> 
endpointImmutableServiceReference) {
 
@@ -214,14 +230,18 @@ public class AriesJaxRSServiceRuntime implements 
JaxRSServiceRuntime {
                 unreferenciableEndpointsDTOStream(),
                 Stream.concat(
                     dependentServiceStreamDTO(),
-                    erroredEndpointsStreamDTO())
+                    Stream.concat(
+                        applicationDependentResourcesDTOStream(),
+                        erroredEndpointsStreamDTO()))
             ).toArray(
                 FailedResourceDTO[]::new
             );
 
         runtimeDTO.failedExtensionDTOs = Stream.concat(
                 unreferenciableExtensionsDTOStream(),
-                invalidExtensionsDTOStream()
+                Stream.concat(
+                    applicationDependentExtensionsDTOStream(),
+                    invalidExtensionsDTOStream())
             ).toArray(
                 FailedExtensionDTO[]::new
             );
@@ -229,11 +249,16 @@ public class AriesJaxRSServiceRuntime implements 
JaxRSServiceRuntime {
         return runtimeDTO;
     }
 
-    private Stream<FailedResourceDTO> erroredEndpointsStreamDTO() {
-        return _erroredEndpoints.stream().map(
-            sr -> buildFailedResourceDTO(
-                DTOConstants.FAILURE_REASON_UNKNOWN, sr)
-        );
+    public void removeApplicationDependentExtension(
+        CachingServiceReference<?> cachingServiceReference) {
+
+        _applicationDependentExtensions.remove(cachingServiceReference);
+    }
+
+    public void removeApplicationDependentResource(
+        CachingServiceReference<?> cachingServiceReference) {
+
+        _applicationDependentResources.remove(cachingServiceReference);
     }
 
     public void removeApplicationEndpoint(
@@ -404,6 +429,13 @@ public class AriesJaxRSServiceRuntime implements 
JaxRSServiceRuntime {
         );
     }
 
+    private Stream<FailedResourceDTO> erroredEndpointsStreamDTO() {
+        return _erroredEndpoints.stream().map(
+            sr -> buildFailedResourceDTO(
+                DTOConstants.FAILURE_REASON_UNKNOWN, sr)
+        );
+    }
+
     private Stream<ResourceDTO> getApplicationEndpointsStream(String name) {
         Collection<CachingServiceReference<?>> applicationEndpoints =
             _applicationEndpoints.get(name);
@@ -441,6 +473,20 @@ public class AriesJaxRSServiceRuntime implements 
JaxRSServiceRuntime {
         );
     }
 
+    private Stream<FailedExtensionDTO> 
applicationDependentExtensionsDTOStream() {
+        return _applicationDependentExtensions.stream().map(
+            sr -> buildFailedExtensionDTO(
+                DTOConstants.FAILURE_REASON_REQUIRED_APPLICATION_UNAVAILABLE, 
sr)
+        );
+    }
+
+    private Stream<FailedResourceDTO> applicationDependentResourcesDTOStream() 
{
+        return _applicationDependentResources.stream().map(
+            sr -> buildFailedResourceDTO(
+                DTOConstants.FAILURE_REASON_REQUIRED_APPLICATION_UNAVAILABLE, 
sr)
+        );
+    }
+
     private Stream<FailedApplicationDTO> shadowedApplicationsDTOStream() {
         return _shadowedApplications.stream().
             map(sr -> buildFailedApplicationDTO(

http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/b8248259/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/Whiteboard.java
----------------------------------------------------------------------
diff --git 
a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/Whiteboard.java
 
b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/Whiteboard.java
index 411d60e..7d43068 100644
--- 
a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/Whiteboard.java
+++ 
b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/Whiteboard.java
@@ -239,7 +239,9 @@ public class Whiteboard {
                     _runtime::removeInvalidExtension).
                 flatMap(resourceReference ->
             chooseApplication(
-                    resourceReference, Whiteboard::allApplicationReferences).
+                    resourceReference, Whiteboard::allApplicationReferences,
+                    _runtime::addApplicationDependentExtension,
+                    _runtime::removeApplicationDependentExtension).
                 flatMap(registratorReference ->
             waitForExtensionDependencies(
                 resourceReference,
@@ -252,7 +254,10 @@ public class Whiteboard {
         return
             countChanges(getResourcesForWhiteboard(), _counter).
                 flatMap(resourceReference ->
-            chooseApplication(resourceReference, this::defaultApplication).
+            chooseApplication(
+                resourceReference, this::defaultApplication,
+                _runtime::addApplicationDependentResource,
+                _runtime::removeApplicationDependentResource).
                 flatMap(registratorReference ->
             waitForExtensionDependencies(
                 resourceReference,
@@ -715,7 +720,9 @@ public class Whiteboard {
         chooseApplication(
             CachingServiceReference<?> serviceReference,
             Supplier<OSGi<CachingServiceReference<CXFJaxRsServiceRegistrator>>>
-                theDefault) {
+                theDefault,
+            Consumer<CachingServiceReference<?>> onWaiting,
+            Consumer<CachingServiceReference<?>> onResolved) {
 
         Object applicationSelectProperty = serviceReference.getProperty(
             JAX_RS_APPLICATION_SELECT);
@@ -725,9 +732,14 @@ public class Whiteboard {
         }
 
         return
+            just(0).
+            effects(
+                __ -> onWaiting.accept(serviceReference),
+                __ -> onResolved.accept(serviceReference)).then(
             serviceReferences(
                 CXFJaxRsServiceRegistrator.class,
-                applicationSelectProperty.toString());
+                applicationSelectProperty.toString()).
+            effects(__ -> onResolved.accept(serviceReference), __ -> {}));
     }
 
     private static <T> OSGi<T> countChanges(

Reply via email to