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);
 

Reply via email to