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

Branch: refs/heads/master
Commit: a25250e168e860ceb0c6e053a50b48a9e0175bf9
Parents: 1772702
Author: Carlos Sierra <[email protected]>
Authored: Tue Nov 21 08:20:02 2017 +0100
Committer: Carlos Sierra <[email protected]>
Committed: Tue Nov 21 15:08:36 2017 +0100

----------------------------------------------------------------------
 .../activator/CXFJaxRsBundleActivator.java      | 70 ++++++++++----------
 .../jax/rs/whiteboard/internal/Whiteboard.java  | 32 ++++-----
 2 files changed, 50 insertions(+), 52 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/a25250e1/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 425e28b..6ec4532 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,22 @@
 
 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;
@@ -53,7 +46,6 @@ 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;
@@ -69,9 +61,6 @@ public class CXFJaxRsBundleActivator implements 
BundleActivator {
         RuntimeDelegate.setInstance(new RuntimeDelegateImpl());
     }
 
-    private OSGiResult _defaultOSGiResult;
-    private OSGiResult _whiteboardsResult;
-
     @Override
     public void start(BundleContext bundleContext) throws Exception {
         if (_log.isDebugEnabled()) {
@@ -119,32 +108,10 @@ public class CXFJaxRsBundleActivator implements 
BundleActivator {
             _log.debug("Stopped whiteboard factory");
         }
     }
+    private OSGiResult _defaultOSGiResult;
+    private OSGiResult _whiteboardsResult;
 
-    private static OSGi<?> runWhiteboard(
-        BundleContext bundleContext, Dictionary<String, ?> configuration) {
-
-        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 ) {
+    private static String endpointFilter(PropertyHolder configuration ) {
 
         Object whiteBoardTargetProperty = configuration.get(
             HTTP_WHITEBOARD_TARGET);
@@ -160,4 +127,35 @@ public class CXFJaxRsBundleActivator implements 
BundleActivator {
             targetFilter);
     }
 
+    private static OSGi<?> runWhiteboard(
+        BundleContext bundleContext, Dictionary<String, ?> configuration) {
+
+        OSGi<List<String>> endpoints =
+            serviceReferences(endpointFilter(configuration::get)
+            ).map(
+                r -> Arrays.asList(
+                    canonicalize(r.getProperty(HTTP_SERVICE_ENDPOINT)))
+            );
+
+        return
+            once(
+                serviceReferences(
+                    endpointFilter(configuration::get),
+                    __ -> false //never reload
+                ).then(
+                    just(createWhiteboard(bundleContext, configuration))
+                .flatMap(
+                    whiteboard ->
+                        all(
+                            ignore(
+                                endpoints.effects(
+                                    whiteboard::addHttpEndpoints,
+                                    whiteboard::removeHttpEndpoints)
+                            ),
+                            effects(whiteboard::start, whiteboard::stop)
+                        )
+                ))
+            );
+    }
+
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/a25250e1/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 9f11bf8..0bfc5bf 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
@@ -132,10 +132,11 @@ public class Whiteboard {
     private final AriesJaxRSServiceRuntime _runtime;
     private final Map<String, ?> _configurationMap;
     private final BundleContext _bundleContext;
-    private ServiceRegistrationChangeCounter _counter;
-    private ServiceReference<?> _runtimeReference;
+    private final ServiceRegistrationChangeCounter _counter;
+    private final ServiceReference<?> _runtimeReference;
+    private final OSGi<Void> _program;
     private final List<Object> _endpoints;
-    private ServiceRegistration<?> _runtimeRegistration;
+    private final ServiceRegistration<?> _runtimeRegistration;
     private OSGiResult _osgiResult;
 
     private Whiteboard(
@@ -145,6 +146,17 @@ 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(registerDefaultApplication()),
+                ignoreResult(applications()),
+                ignoreResult(applicationResources()),
+                ignoreResult(applicationExtensions()
+            ));
     }
 
     public static Whiteboard createWhiteboard(
@@ -154,19 +166,7 @@ public class Whiteboard {
     }
 
     public void start() {
-        _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);
+        _osgiResult = _program.run(_bundleContext);
     }
 
     public void stop() {

Reply via email to