Repository: aries-jax-rs-whiteboard
Updated Branches:
  refs/heads/master c086a9287 -> ad5e86177


Properly register dependent extensions

Also refactor the waitingForExtension functions to not having to pass
the next value as parameter because it is not necessary and made
everything even harder to read.


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/98f26c27
Tree: 
http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/tree/98f26c27
Diff: 
http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/diff/98f26c27

Branch: refs/heads/master
Commit: 98f26c278a551e853b978b3d7129e1a9d0db519e
Parents: c086a92
Author: Carlos Sierra <[email protected]>
Authored: Wed Nov 22 19:15:41 2017 +0100
Committer: Carlos Sierra <[email protected]>
Committed: Wed Nov 22 19:15:41 2017 +0100

----------------------------------------------------------------------
 .../internal/AriesJaxRSServiceRuntime.java      | 32 ++++++++++++---
 .../jax/rs/whiteboard/internal/Whiteboard.java  | 42 ++++++++++++--------
 2 files changed, 53 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/98f26c27/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 0e714dc..edc8e32 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
@@ -105,6 +105,12 @@ public class AriesJaxRSServiceRuntime implements 
JaxRSServiceRuntime {
         _dependentApplications.add(applicationReference);
     }
 
+    public void addDependentExtension(
+        CachingServiceReference<?> cachingServiceReference) {
+
+        _dependentExtensions.add(cachingServiceReference);
+    }
+
     public void addDependentService(CachingServiceReference<?> 
serviceReference) {
         _dependentServices.add(serviceReference);
     }
@@ -218,7 +224,8 @@ public class AriesJaxRSServiceRuntime implements 
JaxRSServiceRuntime {
                     applicationDependentExtensionsDTOStream(),
                     Stream.concat(
                         erroredExtensionsDTOStream(),
-                        invalidExtensionsDTOStream()))
+                        Stream.concat(dependentExtensionsStreamDTO(),
+                            invalidExtensionsDTOStream())))
             ).toArray(
                 FailedExtensionDTO[]::new
             );
@@ -264,6 +271,12 @@ public class AriesJaxRSServiceRuntime implements 
JaxRSServiceRuntime {
         _dependentApplications.remove(applicationReference);
     }
 
+    public void removeDependentExtension(
+        CachingServiceReference<?> cachingServiceReference) {
+
+        _dependentExtensions.add(cachingServiceReference);
+    }
+
     public void removeDependentService(CachingServiceReference<?> 
serviceReference) {
         _dependentServices.remove(serviceReference);
     }
@@ -339,14 +352,18 @@ public class AriesJaxRSServiceRuntime implements 
JaxRSServiceRuntime {
         _ungettableApplications = new CopyOnWriteArrayList<>();
     private Collection<CachingServiceReference<Application>> 
_shadowedApplications =
         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 Set<CachingServiceReference<Application>> _dependentApplications =
+        ConcurrentHashMap.newKeySet();
+    private Set<CachingServiceReference<?>> _dependentExtensions =
+        ConcurrentHashMap.newKeySet();
+    private Set<CachingServiceReference<?>> _dependentServices =
+        ConcurrentHashMap.newKeySet();
     private Collection<CachingServiceReference<Application>> 
_erroredApplications =
         new CopyOnWriteArrayList<>();
     private Collection<CachingServiceReference<?>> _erroredEndpoints =
@@ -357,8 +374,6 @@ public class AriesJaxRSServiceRuntime implements 
JaxRSServiceRuntime {
         new CopyOnWriteArrayList<>();
     private Collection<CachingServiceReference<?>> _ungettableExtensions =
         new CopyOnWriteArrayList<>();
-    private Set<CachingServiceReference<?>> _dependentServices =
-        ConcurrentHashMap.newKeySet();
     private Collection<CachingServiceReference<?>> _invalidExtensions =
         new CopyOnWriteArrayList<>();
     private volatile Map<String, Object> _defaultApplicationProperties;
@@ -521,6 +536,13 @@ public class AriesJaxRSServiceRuntime implements 
JaxRSServiceRuntime {
         );
     }
 
+    private Stream<FailedExtensionDTO> dependentExtensionsStreamDTO() {
+        return _dependentExtensions.stream().map(
+            sr -> buildFailedExtensionDTO(
+                DTOConstants.FAILURE_REASON_REQUIRED_EXTENSIONS_UNAVAILABLE,
+                sr));
+    }
+
     private Stream<FailedResourceDTO> dependentServiceStreamDTO() {
         return _dependentServices.stream().map(
             sr -> buildFailedResourceDTO(

http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/98f26c27/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 961c468..9eed2be 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
@@ -196,8 +196,11 @@ public class Whiteboard {
                     _runtime::removeApplicationDependentExtension).
                 flatMap(registratorReference ->
             waitForExtensionDependencies(
-                resourceReference,
-                getApplicationName(registratorReference::getProperty),
+                    resourceReference,
+                    getApplicationName(registratorReference::getProperty),
+                    _runtime::addDependentExtension,
+                    _runtime::removeDependentExtension).
+                then(
             safeRegisterExtension(resourceReference, registratorReference)
         )));
     }
@@ -214,16 +217,18 @@ public class Whiteboard {
             waitForExtensionDependencies(
                 resourceReference,
                 getApplicationName(registratorReference::getProperty),
-            safeRegisterEndpoint(resourceReference, registratorReference)
-        )));
+                _runtime::addDependentService,
+                _runtime::removeDependentService).
+            then(
+                safeRegisterEndpoint(resourceReference, registratorReference)
+            )));
     }
 
     private OSGi<?> applications() {
         OSGi<CachingServiceReference<Application>> applicationsForWhiteboard =
-            countChanges(
-                getApplicationsForWhiteboard(), _counter).
-            flatMap(
-                sr -> waitForApplicationDependencies(sr, just(sr)));
+            countChanges(getApplicationsForWhiteboard(), _counter).flatMap(
+                this::waitForApplicationDependencies
+            );
 
         OSGi<CachingServiceReference<Application>> highestRankedPerName =
             highestPer(
@@ -495,12 +500,14 @@ public class Whiteboard {
 
     private OSGi<CachingServiceReference<Application>>
         waitForApplicationDependencies(
-            CachingServiceReference<Application> applicationReference,
-            OSGi<CachingServiceReference<Application>> program) {
+            CachingServiceReference<Application> applicationReference) {
 
         String[] extensionDependencies = canonicalize(
             applicationReference.getProperty(JAX_RS_EXTENSION_SELECT));
 
+        OSGi<CachingServiceReference<Application>> program = just(
+            applicationReference);
+
         if (extensionDependencies.length > 0) {
             program = effects(
                 () -> _runtime.addDependentApplication(applicationReference),
@@ -564,13 +571,16 @@ public class Whiteboard {
 
     private OSGi<?> waitForExtensionDependencies(
         CachingServiceReference<?> serviceReference, String applicationName,
-        OSGi<?> program) {
+        Consumer<CachingServiceReference<?>> onAddingDependent,
+        Consumer<CachingServiceReference<?>> onRemovingDependent) {
 
         String[] extensionDependencies = canonicalize(
             serviceReference.getProperty(JAX_RS_EXTENSION_SELECT));
 
+        OSGi<CachingServiceReference<?>> program = just(serviceReference);
+
         if (extensionDependencies.length > 0) {
-            _runtime.addDependentService(serviceReference);
+            onAddingDependent.accept(serviceReference);
         }
         else {
             return program;
@@ -596,7 +606,7 @@ public class Whiteboard {
                         )
                     ).effects(
                         __ -> {},
-                        __ -> _runtime.addDependentService(serviceReference)
+                        __ -> onAddingDependent.accept(serviceReference)
                     ).
                     then(program);
             }
@@ -606,11 +616,11 @@ public class Whiteboard {
         }
 
         program = onClose(
-            () -> _runtime.removeDependentService(serviceReference)).
+            () -> onRemovingDependent.accept(serviceReference)).
             then(program);
 
-        program = program.foreach(
-            __ -> _runtime.removeDependentService(serviceReference),
+        program = program.effects(
+            __ -> onRemovingDependent.accept(serviceReference),
             __ -> {}
         );
 

Reply via email to