Delay Whiteboard initialization until HttpRuntime Do not start the whiteboard and register the runtime until there is evidence that a HTTP Runtime exists.
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/17727027 Tree: http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/tree/17727027 Diff: http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/diff/17727027 Branch: refs/heads/master Commit: 177270270fc8d2ee6c714ad946536492ceec61fc Parents: 02898c9 Author: Carlos Sierra <[email protected]> Authored: Tue Nov 21 08:20:02 2017 +0100 Committer: Carlos Sierra <[email protected]> Committed: Tue Nov 21 08:20:02 2017 +0100 ---------------------------------------------------------------------- .../activator/CXFJaxRsBundleActivator.java | 60 +++++++++++++-- .../jax/rs/whiteboard/internal/Whiteboard.java | 77 +++++--------------- 2 files changed, 72 insertions(+), 65 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/17727027/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/activator/CXFJaxRsBundleActivator.java ---------------------------------------------------------------------- diff --git a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/activator/CXFJaxRsBundleActivator.java b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/activator/CXFJaxRsBundleActivator.java index c80b463..425e28b 100644 --- a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/activator/CXFJaxRsBundleActivator.java +++ b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/activator/CXFJaxRsBundleActivator.java @@ -17,29 +17,48 @@ package org.apache.aries.jax.rs.whiteboard.activator; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Dictionary; import java.util.Hashtable; +import java.util.List; +import java.util.function.Supplier; import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.ext.RuntimeDelegate; import org.apache.aries.jax.rs.whiteboard.internal.ClientBuilderFactory; +import org.apache.aries.jax.rs.whiteboard.internal.Utils; +import org.apache.aries.jax.rs.whiteboard.internal.Utils.PropertyHolder; import org.apache.aries.jax.rs.whiteboard.internal.Whiteboard; +import org.apache.aries.osgi.functional.CachingServiceReference; import org.apache.aries.osgi.functional.OSGi; import org.apache.aries.osgi.functional.OSGiResult; import org.apache.cxf.jaxrs.impl.RuntimeDelegateImpl; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; import org.osgi.framework.Constants; +import org.osgi.framework.Filter; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.service.http.runtime.HttpServiceRuntime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import static java.lang.String.format; +import static org.apache.aries.jax.rs.whiteboard.internal.Utils.canonicalize; import static org.apache.aries.jax.rs.whiteboard.internal.Utils.ignoreResult; import static org.apache.aries.jax.rs.whiteboard.internal.Whiteboard.createWhiteboard; import static org.apache.aries.osgi.functional.OSGi.all; import static org.apache.aries.osgi.functional.OSGi.configurations; +import static org.apache.aries.osgi.functional.OSGi.effects; +import static org.apache.aries.osgi.functional.OSGi.ignore; import static org.apache.aries.osgi.functional.OSGi.just; +import static org.apache.aries.osgi.functional.OSGi.nothing; +import static org.apache.aries.osgi.functional.OSGi.once; import static org.apache.aries.osgi.functional.OSGi.register; +import static org.apache.aries.osgi.functional.OSGi.serviceReferences; +import static org.osgi.service.http.runtime.HttpServiceRuntimeConstants.HTTP_SERVICE_ENDPOINT; +import static org.osgi.service.http.whiteboard.HttpWhiteboardConstants.HTTP_WHITEBOARD_TARGET; public class CXFJaxRsBundleActivator implements BundleActivator { @@ -104,12 +123,41 @@ public class CXFJaxRsBundleActivator implements BundleActivator { private static OSGi<?> runWhiteboard( BundleContext bundleContext, Dictionary<String, ?> configuration) { - return just( - createWhiteboard(bundleContext, configuration) - ).effects( - Whiteboard::start, - Whiteboard::stop - ); + OSGi<List<String>> endpoints = + serviceReferences( + endpointFilter(bundleContext, configuration::get) + ).map( + r -> Arrays.asList( + canonicalize(r.getProperty(HTTP_SERVICE_ENDPOINT))) + ); + + return + just(createWhiteboard(bundleContext, configuration)).flatMap( + whiteboard -> + endpoints.distribute( + e -> once(e).effects( + __ -> whiteboard.start(), __ -> whiteboard.stop()), + e -> e.effects( + whiteboard::addHttpEndpoints, + whiteboard::removeHttpEndpoints) + )); + } + + private static String endpointFilter( + BundleContext bundleContext, PropertyHolder configuration ) { + + Object whiteBoardTargetProperty = configuration.get( + HTTP_WHITEBOARD_TARGET); + + String targetFilter = + whiteBoardTargetProperty != null ? + whiteBoardTargetProperty.toString() : + "(osgi.http.endpoint=*)"; + + + return format( + "(&(objectClass=%s)%s)", HttpServiceRuntime.class.getName(), + targetFilter); } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/17727027/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 c0e36ae..9f11bf8 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 @@ -25,17 +25,14 @@ import org.apache.aries.osgi.functional.OSGi; import org.apache.aries.osgi.functional.OSGiResult; import org.apache.cxf.Bus; import org.apache.cxf.bus.extension.ExtensionManagerBus; -import org.apache.cxf.jaxrs.lifecycle.ResourceProvider; import org.apache.cxf.transport.servlet.CXFNonSpringServlet; import org.osgi.framework.BundleContext; import org.osgi.framework.Constants; import org.osgi.framework.Filter; import org.osgi.framework.InvalidSyntaxException; -import org.osgi.framework.ServiceObjects; import org.osgi.framework.ServiceReference; import org.osgi.framework.ServiceRegistration; import org.osgi.framework.wiring.BundleWiring; -import org.osgi.service.http.runtime.HttpServiceRuntime; import org.osgi.service.jaxrs.runtime.JaxRSServiceRuntime; import javax.servlet.Servlet; @@ -72,12 +69,10 @@ import static org.apache.aries.jax.rs.whiteboard.internal.AriesJaxRSServiceRunti import static org.apache.aries.jax.rs.whiteboard.internal.Utils.canonicalize; import static org.apache.aries.jax.rs.whiteboard.internal.Utils.generateApplicationName; import static org.apache.aries.jax.rs.whiteboard.internal.Utils.getProperties; -import static org.apache.aries.jax.rs.whiteboard.internal.Utils.getResourceProvider; import static org.apache.aries.jax.rs.whiteboard.internal.Utils.highestPer; import static org.apache.aries.jax.rs.whiteboard.internal.Utils.ignoreResult; import static org.apache.aries.jax.rs.whiteboard.internal.Utils.onlyGettables; import static org.apache.aries.jax.rs.whiteboard.internal.Utils.service; -import static org.apache.aries.jax.rs.whiteboard.internal.Utils.serviceObjects; import static org.apache.aries.jax.rs.whiteboard.internal.Utils.updateProperty; import static org.apache.aries.osgi.functional.OSGi.all; import static org.apache.aries.osgi.functional.OSGi.effects; @@ -88,7 +83,6 @@ import static org.apache.aries.osgi.functional.OSGi.once; import static org.apache.aries.osgi.functional.OSGi.register; import static org.apache.aries.osgi.functional.OSGi.serviceReferences; import static org.apache.aries.osgi.functional.Utils.highest; -import static org.osgi.service.http.runtime.HttpServiceRuntimeConstants.HTTP_SERVICE_ENDPOINT; import static org.osgi.service.http.whiteboard.HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME; import static org.osgi.service.http.whiteboard.HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT; import static org.osgi.service.http.whiteboard.HttpWhiteboardConstants.HTTP_WHITEBOARD_DEFAULT_CONTEXT_NAME; @@ -138,11 +132,10 @@ public class Whiteboard { private final AriesJaxRSServiceRuntime _runtime; private final Map<String, ?> _configurationMap; private final BundleContext _bundleContext; - private final ServiceRegistrationChangeCounter _counter; - private final ServiceReference<?> _runtimeReference; - private final OSGi<Void> _program; + private ServiceRegistrationChangeCounter _counter; + private ServiceReference<?> _runtimeReference; private final List<Object> _endpoints; - private final ServiceRegistration<?> _runtimeRegistration; + private ServiceRegistration<?> _runtimeRegistration; private OSGiResult _osgiResult; private Whiteboard( @@ -152,18 +145,6 @@ public class Whiteboard { _runtime = new AriesJaxRSServiceRuntime(); _configurationMap = Maps.from(configuration); _endpoints = new ArrayList<>(); - _runtimeRegistration = registerJaxRSServiceRuntime( - new HashMap<>(_configurationMap)); - _runtimeReference = _runtimeRegistration.getReference(); - _counter = new ServiceRegistrationChangeCounter(_runtimeRegistration); - _program = - all( - ignoreResult(bestEffortCalculationOfEnpoints()), - ignoreResult(registerDefaultApplication()), - ignoreResult(applications()), - ignoreResult(applicationResources()), - ignoreResult(applicationExtensions() - )); } public static Whiteboard createWhiteboard( @@ -173,7 +154,19 @@ public class Whiteboard { } public void start() { - _osgiResult = _program.run(_bundleContext); + _runtimeRegistration = registerJaxRSServiceRuntime( + new HashMap<>(_configurationMap)); + _runtimeReference = _runtimeRegistration.getReference(); + _counter = new ServiceRegistrationChangeCounter(_runtimeRegistration); + + OSGi<Void> program = all( + ignoreResult(registerDefaultApplication()), + ignoreResult(applications()), + ignoreResult(applicationResources()), + ignoreResult(applicationExtensions() + )); + + _osgiResult = program.run(_bundleContext); } public void stop() { @@ -182,7 +175,7 @@ public class Whiteboard { _runtimeRegistration.unregister(); } - private void addHttpEndpoints(List<String> endpoints) { + public void addHttpEndpoints(List<String> endpoints) { synchronized (_runtimeRegistration) { _endpoints.addAll(endpoints); @@ -274,40 +267,6 @@ public class Whiteboard { ); } - private OSGi<?> bestEffortCalculationOfEnpoints() { - Object whiteBoardTargetProperty = _configurationMap.get( - HTTP_WHITEBOARD_TARGET); - - String targetFilter = - whiteBoardTargetProperty != null ? - whiteBoardTargetProperty.toString() : - "(osgi.http.endpoint=*)"; - - Filter filter; - - try { - filter = _bundleContext.createFilter( - format( - "(&(objectClass=%s)%s)", HttpServiceRuntime.class.getName(), - targetFilter)); - } - catch (InvalidSyntaxException ise) { - throw new IllegalArgumentException( - format("Invalid syntax for filter %s", targetFilter)); - } - - return - serviceReferences(HttpServiceRuntime.class, filter.toString()). - map( - r -> Arrays.asList( - canonicalize(r.getProperty(HTTP_SERVICE_ENDPOINT))) - ). - foreach( - this::addHttpEndpoints, - this::removeHttpEndpoints - ); - } - private ExtensionManagerBus createBus() { BundleWiring wiring = _bundleContext.getBundle().adapt( BundleWiring.class); @@ -440,7 +399,7 @@ public class Whiteboard { JaxRSServiceRuntime.class, _runtime, new Hashtable<>(properties)); } - private void removeHttpEndpoints(List<String> endpoints) { + public void removeHttpEndpoints(List<String> endpoints) { synchronized (_runtimeRegistration) { _endpoints.removeAll(endpoints);
