You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by cs...@apache.org on 2017/08/18 14:02:02 UTC

[13/14] aries-jax-rs-whiteboard git commit: Factor out gettable checks

Factor out gettable checks

to make them reusable for other elements as well


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

Branch: refs/heads/master
Commit: ffc117555d028f609143b659278e7efc01f6928f
Parents: 6e52bcb
Author: Carlos Sierra <cs...@apache.org>
Authored: Thu Aug 17 18:30:44 2017 +0200
Committer: Carlos Sierra <cs...@apache.org>
Committed: Fri Aug 18 15:59:21 2017 +0200

----------------------------------------------------------------------
 .../internal/AriesJaxRSServiceRuntime.java      | 71 +++++---------------
 .../aries/jax/rs/whiteboard/internal/Utils.java | 35 ++++++++++
 .../jax/rs/whiteboard/internal/Whiteboard.java  | 12 +++-
 3 files changed, 61 insertions(+), 57 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/ffc11755/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 62acc89..11e9772 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
@@ -30,7 +30,6 @@ import org.osgi.service.jaxrs.runtime.dto.RuntimeDTO;
 import org.osgi.service.jaxrs.whiteboard.JaxRSWhiteboardConstants;
 
 import javax.ws.rs.core.Application;
-import java.util.Collection;
 import java.util.Comparator;
 import java.util.Objects;
 import java.util.TreeSet;
@@ -47,31 +46,38 @@ public class AriesJaxRSServiceRuntime implements JaxRSServiceRuntime {
     private ConcurrentHashMap<String, TreeSet<Event<MutableTuple<Application>>>>
         _applications = new ConcurrentHashMap<>();
 
-    private Collection<Event<MutableTuple<Application>>>
+    private TreeSet<ServiceReference<Application>>
         _ungettableApplications;
+
     private Comparator<Event<MutableTuple<Application>>>
         _applicationComparator;
-    private BundleContext _bundleContext;
 
     public AriesJaxRSServiceRuntime(BundleContext bundleContext) {
-        _bundleContext = bundleContext;
-
         _applicationComparator = Comparator.comparing(
             Event::getContent);
 
         _applicationComparator = _applicationComparator.reversed();
 
-        _ungettableApplications = new TreeSet<>(_applicationComparator);
+        _ungettableApplications = new TreeSet<>(Comparator.reverseOrder());
+    }
+
+    public boolean addNotGettable(
+        ServiceReference<Application> serviceReference) {
+
+        return _ungettableApplications.add(serviceReference);
+    }
+
+    public boolean removeNotGettable(
+        ServiceReference<Application> serviceReference) {
+
+        return _ungettableApplications.remove(serviceReference);
     }
 
     public OSGi<MutableTuple<Application>> processApplications(
-        OSGi<ServiceReference<Application>> source) {
+        OSGi<MutableTuple<Application>> source) {
 
         return
-            source.map(
-                sr -> new MutableTuple<>(sr, null)
-            ).
-            route(
+            source.route(
                 router -> {
                 router.onIncoming(event -> {
                     MutableTuple<Application>
@@ -80,16 +86,6 @@ public class AriesJaxRSServiceRuntime implements JaxRSServiceRuntime {
                     ServiceReference<Application> serviceReference =
                         tuple.getServiceReference();
 
-                    Application application = checkGettable(serviceReference);
-
-                    if (application == null)  {
-                        _ungettableApplications.add(event);
-
-                        return;
-                    }
-
-                    tuple.setService(application);
-
                     String path = serviceReference.getProperty(JAX_RS_APPLICATION_BASE).
                         toString();
 
@@ -116,13 +112,6 @@ public class AriesJaxRSServiceRuntime implements JaxRSServiceRuntime {
                     ServiceReference<Application> serviceReference =
                         tuple.getServiceReference();
 
-                    boolean ungettable = _ungettableApplications.removeIf(
-                        t -> t.getContent().equals(tuple));
-
-                    if (ungettable) {
-                        return;
-                    }
-
                     String path = serviceReference.getProperty(JAX_RS_APPLICATION_BASE).
                         toString();
 
@@ -149,28 +138,6 @@ public class AriesJaxRSServiceRuntime implements JaxRSServiceRuntime {
             });
     }
 
-    private Application checkGettable(
-        ServiceReference<Application> serviceReference) {
-
-        Application application = null;
-
-        try {
-            application = _bundleContext.getService(
-                serviceReference);
-        }
-        catch (Exception e) {
-        }
-
-        if (application == null) {
-            return null;
-        }
-        else {
-            _bundleContext.ungetService(serviceReference);
-        }
-
-        return application;
-    }
-
     @Override
     public RequestInfoDTO calculateRequestInfoDTO(String path) {
         return null;
@@ -213,10 +180,6 @@ public class AriesJaxRSServiceRuntime implements JaxRSServiceRuntime {
     private Stream<FailedApplicationDTO> unreferenciableApplications() {
         return _ungettableApplications.stream().
             map(
-                Event::getContent
-            ).map(
-                MutableTuple::getServiceReference
-            ).map(
                 sr -> buildFailedApplicationDTO(
                     DTOConstants.FAILURE_REASON_SERVICE_NOT_GETTABLE,
                     sr)

http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/ffc11755/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/Utils.java
----------------------------------------------------------------------
diff --git a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/Utils.java b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/Utils.java
index 2fb2854..9846ebb 100644
--- a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/Utils.java
+++ b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/Utils.java
@@ -17,6 +17,7 @@
 
 package org.apache.aries.jax.rs.whiteboard.internal;
 
+import org.apache.aries.jax.rs.whiteboard.internal.AriesJaxRSServiceRuntime.MutableTuple;
 import org.apache.aries.osgi.functional.Event;
 import org.apache.aries.osgi.functional.OSGi;
 import org.apache.cxf.Bus;
@@ -36,6 +37,7 @@ import java.util.function.Consumer;
 
 import static org.apache.aries.osgi.functional.OSGi.bundleContext;
 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.onClose;
 import static org.apache.aries.osgi.functional.OSGi.register;
 
@@ -126,6 +128,39 @@ public class Utils {
         return program.route(new RepeatInOrderRouter<>());
     }
 
+    public static <T> OSGi<MutableTuple<T>> onlyGettables(
+        ServiceReference<T> serviceReference,
+        Consumer<ServiceReference<T>> whenAddedNotGettable,
+        Consumer<ServiceReference<T>> whenLeavingNotGettable) {
+
+        return bundleContext().flatMap(
+            bundleContext -> {
+                T service = null;
+                try {
+                    service = bundleContext.getService(serviceReference);
+                }
+                catch (Exception e){
+                }
+                if (service == null) {
+                    whenAddedNotGettable.accept(serviceReference);
+
+                    return
+                        onClose(
+                            () -> whenLeavingNotGettable.accept(serviceReference)
+                        ).then(
+                            nothing()
+                        );
+                }
+                return
+                    onClose(
+                        () -> bundleContext.ungetService(serviceReference)
+                    ).then(
+                        just(new MutableTuple<>(serviceReference, service)))
+                    ;
+            }
+        );
+    }
+
     public static <T> OSGi<ResourceProvider>
         registerEndpoint(
             ServiceReference<?> serviceReference,

http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/ffc11755/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 4628fb7..d4a4178 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
@@ -17,6 +17,7 @@
 
 package org.apache.aries.jax.rs.whiteboard.internal;
 
+import org.apache.aries.jax.rs.whiteboard.internal.AriesJaxRSServiceRuntime.MutableTuple;
 import org.apache.aries.osgi.functional.OSGi;
 import org.apache.cxf.Bus;
 import org.apache.cxf.bus.extension.ExtensionManagerBus;
@@ -43,6 +44,7 @@ import java.util.concurrent.atomic.AtomicLong;
 
 import static java.lang.String.format;
 import static org.apache.aries.jax.rs.whiteboard.internal.Utils.deployRegistrator;
+import static org.apache.aries.jax.rs.whiteboard.internal.Utils.onlyGettables;
 import static org.apache.aries.jax.rs.whiteboard.internal.Utils.safeRegisterEndpoint;
 import static org.apache.aries.jax.rs.whiteboard.internal.Utils.safeRegisterExtension;
 import static org.apache.aries.jax.rs.whiteboard.internal.Utils.safeRegisterGeneric;
@@ -229,8 +231,12 @@ public class Whiteboard {
         AriesJaxRSServiceRuntime runtime,
         Map<String, ?> configuration) {
 
-        OSGi<ServiceReference<Application>> applicationsForWhiteboard =
-            getApplicationsForWhiteboard(jaxRsRuntimeServiceReference);
+        OSGi<MutableTuple<Application>> applicationsForWhiteboard =
+            getApplicationsForWhiteboard(jaxRsRuntimeServiceReference).
+                flatMap(
+                    sr -> onlyGettables(
+                        sr, runtime::addNotGettable, runtime::removeNotGettable)
+                );
 
         return
             bundleContext().flatMap(
@@ -242,7 +248,7 @@ public class Whiteboard {
 
     private static OSGi<Void> deployApplication(
         Map<String, ?> configuration, BundleContext bundleContext,
-        AriesJaxRSServiceRuntime.MutableTuple<Application> tuple) {
+        MutableTuple<Application> tuple) {
 
         ExtensionManagerBus bus = createBus(bundleContext, configuration);