Repository: aries-jax-rs-whiteboard Updated Branches: refs/heads/master 5e82038ef -> afbf0e4b6
Refactor to move shared state to fields 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/afbf0e4b Tree: http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/tree/afbf0e4b Diff: http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/diff/afbf0e4b Branch: refs/heads/master Commit: afbf0e4b6e5a54f147d28f7c2b912d9afda4860b Parents: 5e82038 Author: Carlos Sierra <[email protected]> Authored: Tue Sep 5 12:22:39 2017 +0200 Committer: Carlos Sierra <[email protected]> Committed: Tue Sep 5 12:22:39 2017 +0200 ---------------------------------------------------------------------- .../jax/rs/whiteboard/internal/Whiteboard.java | 414 +++++++++---------- 1 file changed, 202 insertions(+), 212 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/afbf0e4b/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 48dc680..76b3d89 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 @@ -194,7 +194,6 @@ public class Whiteboard { } private OSGi<?> applicationExtensions() { - return onlySupportedInterfaces( countChanges( @@ -206,10 +205,9 @@ public class Whiteboard { resourceReference, Whiteboard::allApplicationReferences). flatMap(registratorReference -> waitForExtensionDependencies( - _bundleContext, resourceReference, - getApplicationName(registratorReference::getProperty), _runtime, - safeRegisterExtension( - resourceReference, registratorReference, _runtime) + resourceReference, + getApplicationName(registratorReference::getProperty), + safeRegisterExtension(resourceReference, registratorReference) ))); } @@ -220,22 +218,19 @@ public class Whiteboard { chooseApplication(resourceReference, this::defaultApplication). flatMap(registratorReference -> waitForExtensionDependencies( - _bundleContext, resourceReference, - getApplicationName(registratorReference::getProperty), _runtime, - safeRegisterEndpoint( - resourceReference, registratorReference, _runtime) + resourceReference, + getApplicationName(registratorReference::getProperty), + safeRegisterEndpoint(resourceReference, registratorReference) ))); } private OSGi<?> applications() { - OSGi<ServiceTuple<Application>> gettableAplicationForWhiteboard = onlyGettables( countChanges( getApplicationsForWhiteboard(), _counter). flatMap( - sr -> waitForApplicationDependencies( - _bundleContext, sr, _runtime, just(sr))), + sr -> waitForApplicationDependencies(sr, just(sr))), _runtime::addNotGettableApplication, _runtime::removeNotGettableApplication); @@ -293,8 +288,7 @@ public class Whiteboard { serviceReferences(HttpServiceRuntime.class, filter.toString()). map( r -> Arrays.asList( - canonicalize( - r.getProperty(HTTP_SERVICE_ENDPOINT))) + canonicalize(r.getProperty(HTTP_SERVICE_ENDPOINT))) ). foreach( this::addHttpEndpoints, @@ -368,6 +362,200 @@ public class Whiteboard { } } + private <T> OSGi<?> safeRegisterEndpoint( + ServiceReference<T> serviceReference, + ServiceReference<CXFJaxRsServiceRegistrator> registratorReference) { + + String applicationName = getApplicationName( + registratorReference::getProperty); + + return + service(registratorReference).flatMap(registrator -> + onlyGettables( + just(serviceReference), + _runtime::addNotGettableEndpoint, + _runtime::removeNotGettableEndpoint + ).flatMap( + tuple -> serviceObjects(serviceReference).flatMap( + serviceObjects -> registerEndpoint( + registrator, serviceObjects).flatMap( + resourceProvider -> + onClose( + () -> Utils.unregisterEndpoint( + registrator, resourceProvider) + ) + ) + ) + ).foreach( + __ -> _runtime.addApplicationEndpoint( + applicationName, serviceReference), + __ -> _runtime.removeApplicationEndpoint( + applicationName, serviceReference) + )); + } + + private OSGi<?> safeRegisterExtension( + ServiceReference<?> serviceReference, + ServiceReference<CXFJaxRsServiceRegistrator> registratorReference) { + + Map<String, Object> properties = getProperties(serviceReference); + + String applicationName = getApplicationName( + registratorReference::getProperty); + + properties.put(JAX_RS_NAME, applicationName); + properties.put( + "original.objectClass", + serviceReference.getProperty("objectClass")); + + return + service(registratorReference).flatMap(registrator -> + onlyGettables( + just(serviceReference), + _runtime::addNotGettableExtension, + _runtime::removeNotGettableExtension + ).foreach( + registrator::addProvider, + registrator::removeProvider + ).foreach( + __ -> _runtime.addApplicationExtension( + applicationName, serviceReference), + __ -> _runtime.removeApplicationExtension( + applicationName, serviceReference) + ).then( + register( + ApplicationExtensionRegistration.class, + new ApplicationExtensionRegistration(){}, properties) + )); + } + + private OSGi<ServiceReference<Application>> + waitForApplicationDependencies( + ServiceReference<Application> applicationReference, + OSGi<ServiceReference<Application>> program) { + + String[] extensionDependencies = canonicalize( + applicationReference.getProperty(JAX_RS_EXTENSION_SELECT)); + + if (extensionDependencies.length > 0) { + program = onClose( + () -> _runtime.removeDependentApplication( + applicationReference)). + then(program); + + _runtime.addDependentApplication(applicationReference); + } + else { + return program; + } + + for (String extensionDependency : extensionDependencies) { + extensionDependency = String.format( + "(&(!(objectClass=%s))%s)", + ApplicationExtensionRegistration.class.getName(), + extensionDependency); + + program = + serviceReferences(extensionDependency). + flatMap( + sr -> { + Object applicationSelectProperty = + sr.getProperty(JAX_RS_APPLICATION_SELECT); + + if (applicationSelectProperty == null) { + return just(applicationReference); + } + + Filter filter; + + try { + filter = _bundleContext.createFilter( + applicationSelectProperty.toString()); + } + catch (InvalidSyntaxException e) { + return nothing(); + } + + if (filter.match(applicationReference)) { + return just(applicationReference); + } + + return nothing(); + } + ).foreach( + __ -> {}, + __ -> _runtime.addDependentApplication( + applicationReference) + ). + then(program); + } + + program = onClose( + ()-> _runtime.removeDependentApplication(applicationReference)). + then(program); + + program = program.foreach( + __ -> _runtime.removeDependentApplication(applicationReference) + ). + then( + just(applicationReference) + ); + + return program; + } + + private OSGi<?> waitForExtensionDependencies( + ServiceReference<?> serviceReference, String applicationName, + OSGi<?> program) { + + String[] extensionDependencies = canonicalize( + serviceReference.getProperty(JAX_RS_EXTENSION_SELECT)); + + if (extensionDependencies.length > 0) { + _runtime.addDependentService(serviceReference); + } + else { + return program; + } + + for (String extensionDependency : extensionDependencies) { + try { + extensionDependency = extensionDependency.replace( + "(objectClass=", "(original.objectClass="); + + Filter extensionFilter = _bundleContext.createFilter( + extensionDependency); + + program = + serviceReferences(ApplicationExtensionRegistration.class). + filter( + sr -> getApplicationName(sr::getProperty).equals( + applicationName) + ). + filter( + extensionFilter::match + ).foreach( + __ -> {}, + __ -> _runtime.addDependentService(serviceReference) + ). + then(program); + } + catch (InvalidSyntaxException e) { + + } + } + + program = onClose( + () -> _runtime.removeDependentService(serviceReference)). + then(program); + + program = program.foreach( + __ -> _runtime.removeDependentService(serviceReference) + ); + + return program; + } + static String getApplicationBase(PropertyHolder properties) { return properties.get(JAX_RS_APPLICATION_BASE).toString(); } @@ -551,75 +739,6 @@ public class Whiteboard { return just(resourceProvider); } - private static <T> OSGi<?> safeRegisterEndpoint( - ServiceReference<T> serviceReference, - ServiceReference<CXFJaxRsServiceRegistrator> registratorReference, - AriesJaxRSServiceRuntime runtime) { - - String applicationName = getApplicationName( - registratorReference::getProperty); - - return - service(registratorReference).flatMap(registrator -> - onlyGettables( - just(serviceReference), - runtime::addNotGettableEndpoint, - runtime::removeNotGettableEndpoint - ).flatMap( - tuple -> serviceObjects(serviceReference).flatMap( - serviceObjects -> registerEndpoint( - registrator, serviceObjects).flatMap( - resourceProvider -> - onClose( - () -> Utils.unregisterEndpoint( - registrator, resourceProvider) - ) - ) - ) - ).foreach( - __ -> runtime.addApplicationEndpoint( - applicationName, serviceReference), - __ -> runtime.removeApplicationEndpoint( - applicationName, serviceReference) - )); - } - - private static OSGi<?> safeRegisterExtension( - ServiceReference<?> serviceReference, - ServiceReference<CXFJaxRsServiceRegistrator> registratorReference, - AriesJaxRSServiceRuntime runtime) { - - Map<String, Object> properties = getProperties(serviceReference); - - String applicationName = getApplicationName( - registratorReference::getProperty); - - properties.put(JAX_RS_NAME, applicationName); - properties.put( - "original.objectClass", - serviceReference.getProperty("objectClass")); - - return - service(registratorReference).flatMap(registrator -> - onlyGettables( - just(serviceReference), - runtime::addNotGettableExtension, - runtime::removeNotGettableExtension - ).foreach( - registrator::addProvider, - registrator::removeProvider - ).foreach( - __ -> runtime.addApplicationExtension( - applicationName, serviceReference), - __ -> runtime.removeApplicationExtension( - applicationName, serviceReference) - ).then( - register( - ApplicationExtensionRegistration.class, - new ApplicationExtensionRegistration(){}, properties) - )); - } - private static boolean signalsValidInterface( ServiceReference<Object> serviceReference) { @@ -630,135 +749,6 @@ public class Whiteboard { anyMatch(SUPPORTED_EXTENSION_INTERFACES::contains); } - private static OSGi<ServiceReference<Application>> - waitForApplicationDependencies( - BundleContext bundleContext, - ServiceReference<Application> applicationReference, - AriesJaxRSServiceRuntime runtime, - OSGi<ServiceReference<Application>> program) { - - String[] extensionDependencies = canonicalize( - applicationReference.getProperty(JAX_RS_EXTENSION_SELECT)); - - if (extensionDependencies.length > 0) { - program = onClose( - () -> runtime.removeDependentApplication(applicationReference)). - then(program); - - runtime.addDependentApplication(applicationReference); - } - else { - return program; - } - - for (String extensionDependency : extensionDependencies) { - extensionDependency = String.format( - "(&(!(objectClass=%s))%s)", - ApplicationExtensionRegistration.class.getName(), - extensionDependency); - - program = - serviceReferences(extensionDependency). - flatMap( - sr -> { - Object applicationSelectProperty = - sr.getProperty(JAX_RS_APPLICATION_SELECT); - - if (applicationSelectProperty == null) { - return just(applicationReference); - } - - Filter filter; - - try { - filter = bundleContext.createFilter( - applicationSelectProperty.toString()); - } - catch (InvalidSyntaxException e) { - return nothing(); - } - - if (filter.match(applicationReference)) { - return just(applicationReference); - } - - return nothing(); - } - ).foreach( - __ -> {}, - __ -> runtime.addDependentApplication( - applicationReference) - ). - then(program); - } - - program = onClose( - ()-> runtime.removeDependentApplication(applicationReference)). - then(program); - - program = program.foreach( - __ -> runtime.removeDependentApplication(applicationReference) - ). - then( - just(applicationReference) - ); - - return program; - } - - private static OSGi<?> waitForExtensionDependencies( - BundleContext bundleContext, ServiceReference<?> serviceReference, - String applicationName, AriesJaxRSServiceRuntime runtime, - OSGi<?> program) { - - String[] extensionDependencies = canonicalize( - serviceReference.getProperty(JAX_RS_EXTENSION_SELECT)); - - if (extensionDependencies.length > 0) { - runtime.addDependentService(serviceReference); - } - else { - return program; - } - - for (String extensionDependency : extensionDependencies) { - try { - extensionDependency = extensionDependency.replace( - "(objectClass=", "(original.objectClass="); - - Filter extensionFilter = bundleContext.createFilter( - extensionDependency); - - program = - serviceReferences(ApplicationExtensionRegistration.class). - filter( - sr -> getApplicationName(sr::getProperty).equals( - applicationName) - ). - filter( - extensionFilter::match - ).foreach( - __ -> {}, - __ -> runtime.addDependentService(serviceReference) - ). - then(program); - } - catch (InvalidSyntaxException e) { - - } - } - - program = onClose( - () -> runtime.removeDependentService(serviceReference)). - then(program); - - program = program.foreach( - __ -> runtime.removeDependentService(serviceReference) - ); - - return program; - } - private interface ChangeCounter { void inc();
