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:01:59 UTC

[10/14] aries-jax-rs-whiteboard git commit: Move application clashing handling to the runtime

Move application clashing handling to the runtime


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

Branch: refs/heads/master
Commit: bf5454a394dd36768cad350e5e2dd30c91695e82
Parents: 988a7cb
Author: Carlos Sierra <cs...@apache.org>
Authored: Thu Aug 17 10:50:23 2017 +0200
Committer: Carlos Sierra <cs...@apache.org>
Committed: Fri Aug 18 15:59:21 2017 +0200

----------------------------------------------------------------------
 .../internal/AriesJaxRSServiceRuntime.java      | 161 ++++++++++++++++++-
 .../jax/rs/whiteboard/internal/Whiteboard.java  |  49 +++---
 2 files changed, 185 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/bf5454a3/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 80d99ff..5317b66 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
@@ -17,15 +17,99 @@
 
 package org.apache.aries.jax.rs.whiteboard.internal;
 
+import org.apache.aries.osgi.functional.Event;
+import org.apache.aries.osgi.functional.OSGi;
+import org.osgi.framework.ServiceReference;
 import org.osgi.service.jaxrs.runtime.JaxRSServiceRuntime;
+import org.osgi.service.jaxrs.runtime.dto.ApplicationDTO;
+import org.osgi.service.jaxrs.runtime.dto.DTOConstants;
+import org.osgi.service.jaxrs.runtime.dto.FailedApplicationDTO;
 import org.osgi.service.jaxrs.runtime.dto.RequestInfoDTO;
 import org.osgi.service.jaxrs.runtime.dto.RuntimeDTO;
+import org.osgi.service.jaxrs.whiteboard.JaxRSWhiteboardConstants;
+
+import javax.ws.rs.core.Application;
+import java.util.Comparator;
+import java.util.Objects;
+import java.util.TreeSet;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Stream;
+
+import static org.osgi.service.jaxrs.whiteboard.JaxRSWhiteboardConstants.JAX_RS_APPLICATION_BASE;
+import static org.osgi.service.jaxrs.whiteboard.JaxRSWhiteboardConstants.JAX_RS_NAME;
 
 public class AriesJaxRSServiceRuntime implements JaxRSServiceRuntime {
 
     private static final long serialVersionUID = 1L;
 
+    private ConcurrentHashMap<String, TreeSet<Event<ServiceReference<Application>>>> _applications =
+        new ConcurrentHashMap<>();
+
+    private Comparator<Event<ServiceReference<Application>>> _applicationComparator;
+
     public AriesJaxRSServiceRuntime() {
+        _applicationComparator = Comparator.comparing(Event::getContent);
+
+        _applicationComparator = _applicationComparator.reversed();
+    }
+
+    public OSGi<ServiceReference<Application>> processApplications(
+        OSGi<ServiceReference<Application>> source) {
+
+        return source.route(router -> {
+            router.onIncoming(event -> {
+                ServiceReference<Application> serviceReference =
+                    event.getContent();
+
+                String path = serviceReference.getProperty(JAX_RS_APPLICATION_BASE).
+                    toString();
+
+                TreeSet<Event<ServiceReference<Application>>> applicationReferences =
+                    _applications.computeIfAbsent(
+                        path, __ -> new TreeSet<>(_applicationComparator));
+
+                Event<ServiceReference<Application>> first =
+                    applicationReferences.size() > 0 ?
+                        applicationReferences.first() : null;
+
+                if (first == null || _applicationComparator.compare(event, first) < 0) {
+                    if (first != null) {
+                        router.signalLeave(first);
+                    }
+
+                    router.signalAdd(event);
+                }
+
+                applicationReferences.add(event);
+            });
+            router.onLeaving(event -> {
+                ServiceReference<Application> serviceReference =
+                    event.getContent();
+
+                String path = serviceReference.getProperty(JAX_RS_APPLICATION_BASE).
+                    toString();
+
+                TreeSet<Event<ServiceReference<Application>>>
+                    applicationReferences = _applications.get(path);
+
+                Event<ServiceReference<Application>> first =
+                    applicationReferences.first();
+
+                if (serviceReference.equals(first.getContent())) {
+                    router.signalLeave(first);
+
+                    Event<ServiceReference<Application>> second =
+                        applicationReferences.higher(first);
+
+                    if (second != null) {
+                        router.signalAdd(second);
+                    }
+                }
+
+                applicationReferences.removeIf(
+                    t -> t.getContent().equals(serviceReference));
+            });
+        });
     }
 
     @Override
@@ -35,7 +119,82 @@ public class AriesJaxRSServiceRuntime implements JaxRSServiceRuntime {
 
     @Override
     public RuntimeDTO getRuntimeDTO() {
-        return null;
+        RuntimeDTO runtimeDTO = new RuntimeDTO();
+
+        runtimeDTO.applicationDTOs = _applications.values().stream().
+            flatMap(
+                tree -> tree.size() > 0 ? Stream.of(tree.first()) : Stream.empty()
+            ).filter(
+                Objects::nonNull
+            ).map(
+                Event::getContent
+            ).map(
+                AriesJaxRSServiceRuntime::buildApplicationDTO
+            ).toArray(
+                ApplicationDTO[]::new
+            );
+
+        runtimeDTO.failedApplicationDTOs = _applications.values().stream().
+            flatMap(
+                tree -> tree.size() > 0 ? tree.tailSet(tree.first(), false).stream() : Stream.empty()
+            ).filter(
+                Objects::nonNull
+            ).map(
+                Event::getContent
+            ).map(
+                sr -> buildFailedApplicationDTO(
+                    DTOConstants.FAILURE_REASON_SHADOWED_BY_OTHER_SERVICE, sr)
+            ).toArray(
+                FailedApplicationDTO[]::new
+            );
+
+        return runtimeDTO;
+    }
+
+    private static ApplicationDTO buildApplicationDTO(
+        ServiceReference<Application> serviceReference) {
+
+        ApplicationDTO applicationDTO = new ApplicationDTO(){};
+
+        applicationDTO.name = getApplicationName(serviceReference);
+
+        return applicationDTO;
+    }
+
+    private static FailedApplicationDTO buildFailedApplicationDTO(
+        int reason, ServiceReference<Application> serviceReference) {
+
+        FailedApplicationDTO failedApplicationDTO = new FailedApplicationDTO();
+
+        Object nameProperty = serviceReference.getProperty(
+            JaxRSWhiteboardConstants.JAX_RS_NAME);
+
+        failedApplicationDTO.name = nameProperty == null ?
+            generateApplicationName(serviceReference) :
+            nameProperty.toString();
+
+        failedApplicationDTO.failureReason = reason;
+
+        return failedApplicationDTO;
+    }
+
+    private static String getApplicationName(
+        ServiceReference<Application> serviceReference) {
+
+        Object property = serviceReference.getProperty(JAX_RS_NAME);
+
+        if (property == null) {
+            return generateApplicationName(serviceReference);
+        }
+
+        return property.toString();
+    }
+
+    private static String generateApplicationName(
+        ServiceReference<Application> serviceReference) {
+
+        return "jax-rs-application-" +
+            serviceReference.getProperty("service.id").toString();
     }
 
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/bf5454a3/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 ca404a8..33284a5 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
@@ -43,7 +43,6 @@ import java.util.concurrent.atomic.AtomicLong;
 
 import static java.lang.String.format;
 import static org.apache.aries.jax.rs.whiteboard.internal.Utils.cxfRegistrator;
-import static org.apache.aries.jax.rs.whiteboard.internal.Utils.repeatInOrder;
 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;
@@ -73,14 +72,16 @@ import static org.osgi.service.jaxrs.whiteboard.JaxRSWhiteboardConstants.JAX_RS_
  */
 public class Whiteboard {
     public static OSGi<Void> createWhiteboard(Dictionary<String, ?> configuration) {
+        AriesJaxRSServiceRuntime runtime = new AriesJaxRSServiceRuntime();
+
         return
             bundleContext().flatMap(bundleContext ->
-            registerJaxRSServiceRuntime(bundleContext, Maps.from(configuration)).flatMap(registratorRegistration ->
+            registerJaxRSServiceRuntime(runtime, bundleContext, Maps.from(configuration)).flatMap(runtimeResgistration ->
             createDefaultJaxRsServiceRegistrator(Maps.from(configuration)).flatMap(defaultServiceRegistrator ->
-            just(new ServiceRegistrationChangeCounter(registratorRegistration)).flatMap(counter ->
-            just(registratorRegistration.getReference()).flatMap(reference ->
+            just(new ServiceRegistrationChangeCounter(runtimeResgistration)).flatMap(counter ->
+            just(runtimeResgistration.getReference()).flatMap(reference ->
                 all(
-                    countChanges(whiteboardApplications(reference, Maps.from(configuration)), counter),
+                    countChanges(whiteboardApplications(reference, runtime, Maps.from(configuration)), counter),
                     countChanges(whiteBoardApplicationSingletons(reference), counter),
                     countChanges(whiteboardExtensions(reference, defaultServiceRegistrator), counter),
                     countChanges(whiteboardSingletons(reference, defaultServiceRegistrator), counter)
@@ -161,6 +162,7 @@ public class Whiteboard {
 
     private static OSGi<ServiceRegistration<?>>
         registerJaxRSServiceRuntime(
+            JaxRSServiceRuntime runtime,
             BundleContext bundleContext, Map<String, ?> configuration) {
 
         Map<String, Object> properties = new HashMap<>(configuration);
@@ -189,9 +191,7 @@ public class Whiteboard {
             bestEffortCalculationOfEnpoints(filter).flatMap(endpoints -> {
                 properties.put(JAX_RS_SERVICE_ENDPOINT, endpoints);
 
-                return register(
-                    new String[]{JaxRSServiceRuntime.class.getName()},
-                    new AriesJaxRSServiceRuntime(), properties);
+                return register(JaxRSServiceRuntime.class, runtime, properties);
             }
         );
     }
@@ -226,26 +226,27 @@ public class Whiteboard {
 
     private static OSGi<?> whiteboardApplications(
         ServiceReference<?> jaxRsRuntimeServiceReference,
+        AriesJaxRSServiceRuntime runtime,
         Map<String, ?> configuration) {
 
         return
-            bundleContext().flatMap(bundleContext ->
-            repeatInOrder(
+            bundleContext().flatMap(
+                bundleContext -> runtime.processApplications(
                 serviceReferences(Application.class, getApplicationFilter()).
-                    filter(new TargetFilter<>(jaxRsRuntimeServiceReference))).
-                flatMap(ref ->
-            just(createBus(bundleContext, configuration)).
-                flatMap(bus ->
-            just(CXFJaxRsServiceRegistrator.getProperties(ref, JAX_RS_APPLICATION_BASE)).
-                flatMap(properties ->
-            service(ref).flatMap(application ->
-                all(
-                    cxfRegistrator(bus, application, properties),
-                    registerCXFServletService(
-                        bus, ref.getProperty(JAX_RS_APPLICATION_BASE).toString(),
-                        properties)
-                )
-        )))));
+                filter(new TargetFilter<>(jaxRsRuntimeServiceReference))).flatMap(
+                ref ->
+                    just(createBus(bundleContext, configuration)).
+                        flatMap(bus ->
+                    just(CXFJaxRsServiceRegistrator.getProperties(ref, JAX_RS_APPLICATION_BASE)).
+                        flatMap(properties ->
+                    service(ref).flatMap(application ->
+                        all(
+                            cxfRegistrator(bus, application, properties),
+                            registerCXFServletService(
+                                bus, ref.getProperty(JAX_RS_APPLICATION_BASE).toString(),
+                                properties)
+                        )
+                )))));
     }
 
     private static OSGi<?> whiteboardExtensions(