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(
