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/25 15:25:44 UTC

[3/8] aries-jax-rs-whiteboard git commit: Register errored applications

Register errored applications


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

Branch: refs/heads/master
Commit: fe929ae882a46e17f0608a7baa3d0c313339612e
Parents: 7c1fce8
Author: Carlos Sierra <cs...@apache.org>
Authored: Wed Aug 23 14:24:26 2017 +0200
Committer: Carlos Sierra <cs...@apache.org>
Committed: Wed Aug 23 14:24:26 2017 +0200

----------------------------------------------------------------------
 jax-rs.itests/src/main/java/test/JaxrsTest.java | 51 +++++++++++++++++++-
 .../internal/AriesJaxRSServiceRuntime.java      | 44 ++++++++++++-----
 .../aries/jax/rs/whiteboard/internal/Utils.java | 27 +++++++++--
 .../jax/rs/whiteboard/internal/Whiteboard.java  | 37 +++++++-------
 4 files changed, 121 insertions(+), 38 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/fe929ae8/jax-rs.itests/src/main/java/test/JaxrsTest.java
----------------------------------------------------------------------
diff --git a/jax-rs.itests/src/main/java/test/JaxrsTest.java b/jax-rs.itests/src/main/java/test/JaxrsTest.java
index f089eb6..e71f2b4 100644
--- a/jax-rs.itests/src/main/java/test/JaxrsTest.java
+++ b/jax-rs.itests/src/main/java/test/JaxrsTest.java
@@ -22,6 +22,7 @@ import static org.osgi.service.jaxrs.whiteboard.JaxRSWhiteboardConstants.*;
 
 import java.util.Dictionary;
 import java.util.Hashtable;
+import java.util.Set;
 
 import org.junit.After;
 import org.junit.Test;
@@ -32,6 +33,7 @@ import org.osgi.framework.ServiceRegistration;
 
 import org.osgi.service.jaxrs.runtime.JaxRSServiceRuntime;
 import org.osgi.service.jaxrs.runtime.dto.DTOConstants;
+import org.osgi.service.jaxrs.runtime.dto.RuntimeDTO;
 import org.osgi.util.tracker.ServiceTracker;
 import test.types.TestAddon;
 import test.types.TestAddonConflict;
@@ -69,10 +71,10 @@ public class JaxrsTest extends TestHelper {
         try {
             JaxRSServiceRuntime runtime = getJaxRSServiceRuntime();
 
-            assertEquals(1, runtime.getRuntimeDTO().applicationDTOs.length);
-
             assertNotNull(runtime);
 
+            assertEquals(1, runtime.getRuntimeDTO().applicationDTOs.length);
+
             serviceRegistration = registerApplication(
                 new TestApplication());
 
@@ -97,6 +99,51 @@ public class JaxrsTest extends TestHelper {
     }
 
     @Test
+    public void testApplicationWithError() throws InterruptedException {
+        JaxRSServiceRuntime runtime = getJaxRSServiceRuntime();
+
+        assertNotNull(runtime);
+
+        RuntimeDTO runtimeDTO = runtime.getRuntimeDTO();
+
+        assertEquals(1, runtimeDTO.applicationDTOs.length);
+        assertEquals(0, runtimeDTO.failedExtensionDTOs.length);
+
+        ServiceRegistration<?> serviceRegistration = registerApplication(
+            new TestApplication() {
+
+                @Override
+                public Set<Object> getSingletons() {
+                    throw new RuntimeException();
+                }
+
+            });
+
+        runtimeDTO = runtime.getRuntimeDTO();
+
+        assertEquals(1, runtimeDTO.applicationDTOs.length);
+        assertEquals(1, runtimeDTO.failedApplicationDTOs.length);
+        assertEquals(
+            DTOConstants.FAILURE_REASON_UNKNOWN,
+            runtimeDTO.failedApplicationDTOs[0].failureReason);
+
+        Client client = createClient();
+
+        WebTarget webTarget = client.
+            target("http://localhost:8080").
+            path("/test-application");
+
+        assertEquals(404, webTarget.request().get().getStatus());
+
+        serviceRegistration.unregister();
+
+        runtimeDTO = runtime.getRuntimeDTO();
+
+        assertEquals(1, runtimeDTO.applicationDTOs.length);
+        assertEquals(0, runtimeDTO.failedApplicationDTOs.length);
+    }
+
+    @Test
     public void testApplicationConflict() {
         Client client = createClient();
 

http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/fe929ae8/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 da6de71..c556e4f 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,6 +17,7 @@
 
 package org.apache.aries.jax.rs.whiteboard.internal;
 
+import org.apache.aries.jax.rs.whiteboard.internal.Utils.PropertyHolder;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.jaxrs.runtime.JaxRSServiceRuntime;
 import org.osgi.service.jaxrs.runtime.dto.ApplicationDTO;
@@ -37,7 +38,7 @@ import java.util.TreeSet;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Stream;
 
-import static org.apache.aries.jax.rs.whiteboard.internal.Utils.getProperties;
+import static org.apache.aries.jax.rs.whiteboard.internal.Utils.generateApplicationName;
 import static org.osgi.service.jaxrs.whiteboard.JaxRSWhiteboardConstants.JAX_RS_NAME;
 
 public class AriesJaxRSServiceRuntime implements JaxRSServiceRuntime {
@@ -59,9 +60,18 @@ public class AriesJaxRSServiceRuntime implements JaxRSServiceRuntime {
     private Set<ServiceReference<Application>> _shadowedApplications =
         new TreeSet<>();
 
+    private Set<ServiceReference<Application>> _erroredApplications =
+        new TreeSet<>();
+
     private TreeSet<ServiceReference<?>> _ungettableEndpoints = new TreeSet<>();
     private TreeSet<ServiceReference<?>> _ungettableExtensions = new TreeSet<>();
 
+    public void addErroredApplication(
+        ServiceReference<Application> serviceReference) {
+
+        _erroredApplications.add(serviceReference);
+    }
+
     public boolean addNotGettableApplication(
         ServiceReference<Application> serviceReference) {
 
@@ -74,6 +84,12 @@ public class AriesJaxRSServiceRuntime implements JaxRSServiceRuntime {
         _ungettableExtensions.add(serviceReference);
     }
 
+    public void removeErroredApplication(
+        ServiceReference<Application> serviceReference) {
+
+        _erroredApplications.remove(serviceReference);
+    }
+
     public boolean removeNotGettableApplication(
         ServiceReference<Application> serviceReference) {
 
@@ -191,7 +207,9 @@ public class AriesJaxRSServiceRuntime implements JaxRSServiceRuntime {
 
         runtimeDTO.failedApplicationDTOs = Stream.concat(
             shadowedApplicationsDTOStream(),
-            unreferenciableApplicationsDTOStream()
+            Stream.concat(
+                unreferenciableApplicationsDTOStream(),
+                erroredApplicationsDTOStream())
             ).toArray(
                 FailedApplicationDTO[]::new
             );
@@ -213,6 +231,13 @@ public class AriesJaxRSServiceRuntime implements JaxRSServiceRuntime {
         return runtimeDTO;
     }
 
+    private Stream<FailedApplicationDTO> erroredApplicationsDTOStream() {
+        return _erroredApplications.stream().map(
+            sr -> buildFailedApplicationDTO(
+                DTOConstants.FAILURE_REASON_UNKNOWN, sr)
+        );
+    }
+
     private FailedExtensionDTO buildFailedExtensionDTO(
         int reason, ServiceReference<?> serviceReference) {
 
@@ -274,8 +299,8 @@ public class AriesJaxRSServiceRuntime implements JaxRSServiceRuntime {
 
         ApplicationDTO applicationDTO = new ApplicationDTO(){};
 
-        applicationDTO.name = getApplicationName(properties);
-        applicationDTO.base = Whiteboard.getApplicationBase(properties);
+        applicationDTO.name = getApplicationName(properties::get);
+        applicationDTO.base = Whiteboard.getApplicationBase(properties::get);
         applicationDTO.serviceId = (Long)properties.get("service.id");
 
         applicationDTO.resourceDTOs = getApplicationEndpointsStream(
@@ -352,7 +377,7 @@ public class AriesJaxRSServiceRuntime implements JaxRSServiceRuntime {
             JaxRSWhiteboardConstants.JAX_RS_NAME);
 
         failedApplicationDTO.name = nameProperty == null ?
-            generateApplicationName(getProperties(serviceReference)) :
+            generateApplicationName(serviceReference::getProperty) :
             nameProperty.toString();
 
         failedApplicationDTO.failureReason = reason;
@@ -360,7 +385,7 @@ public class AriesJaxRSServiceRuntime implements JaxRSServiceRuntime {
         return failedApplicationDTO;
     }
 
-    public static String getApplicationName(Map<String, Object> properties) {
+    public static String getApplicationName(PropertyHolder properties) {
 
         Object property = properties.get(JAX_RS_NAME);
 
@@ -371,11 +396,4 @@ public class AriesJaxRSServiceRuntime implements JaxRSServiceRuntime {
         return property.toString();
     }
 
-    public static String generateApplicationName(
-        Map<String, Object> properties) {
-
-        return ".jax-rs-application-" +
-            properties.get("service.id").toString();
-    }
-
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/fe929ae8/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 2506be3..411281f 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
@@ -48,6 +48,12 @@ import static org.apache.aries.osgi.functional.OSGi.register;
  */
 public class Utils {
 
+    public static String generateApplicationName(
+        PropertyHolder propertyHolder) {
+
+        return ".generated.for." + propertyHolder.get("service.id");
+    }
+
     public static Map<String, Object> getProperties(ServiceReference<?> sref) {
         String[] propertyKeys = sref.getPropertyKeys();
         Map<String, Object> properties = new HashMap<>(propertyKeys.length);
@@ -77,11 +83,12 @@ public class Utils {
     }
 
     public static OSGi<?> deployRegistrator(
-        Bus bus, Application application, Map<String, Object> props) {
+        Bus bus, ServiceTuple<Application> tuple, Map<String, Object> props,
+        AriesJaxRSServiceRuntime runtime) {
 
         try {
             CXFJaxRsServiceRegistrator registrator =
-                new CXFJaxRsServiceRegistrator(bus, application);
+                new CXFJaxRsServiceRegistrator(bus, tuple.getService());
 
             return
                 onClose(registrator::close).then(
@@ -89,8 +96,16 @@ public class Utils {
             );
         }
         catch (Exception e) {
-            return register(
-                FailedApplicationDTO.class, new FailedApplicationDTO(), props);
+            ServiceReference<Application> serviceReference =
+                tuple.getServiceReference();
+
+            runtime.addErroredApplication(serviceReference);
+
+            return onClose(
+                () -> runtime.removeErroredApplication(serviceReference)
+            ).then(
+                nothing()
+            );
         }
     }
 
@@ -440,4 +455,8 @@ public class Utils {
         }
     }
 
+    public interface PropertyHolder {
+        Object get(String propertyName);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/fe929ae8/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 aaf6220..ffb6379 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.Utils.PropertyHolder;
 import org.apache.aries.jax.rs.whiteboard.internal.Utils.ServiceTuple;
 import org.apache.aries.osgi.functional.OSGi;
 import org.apache.cxf.Bus;
@@ -46,6 +47,7 @@ import java.util.function.Function;
 import static java.lang.String.format;
 import static org.apache.aries.jax.rs.whiteboard.internal.AriesJaxRSServiceRuntime.getApplicationName;
 import static org.apache.aries.jax.rs.whiteboard.internal.Utils.deployRegistrator;
+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.highestPer;
 import static org.apache.aries.jax.rs.whiteboard.internal.Utils.onlyGettables;
@@ -77,7 +79,7 @@ import static org.osgi.service.jaxrs.whiteboard.JaxRSWhiteboardConstants.JAX_RS_
  */
 public class Whiteboard {
 
-    public static final Function<ServiceTuple<Application>, String> APPLICATION_BASE = ((Function<ServiceTuple<Application>, ServiceReference<Application>>) ServiceTuple::getServiceReference).andThen(Utils::getProperties).andThen(Whiteboard::getApplicationBase);
+    public static final Function<ServiceTuple<Application>, String> APPLICATION_BASE = ((Function<ServiceTuple<Application>, ServiceReference<Application>>) ServiceTuple::getServiceReference).andThen(sr -> getApplicationBase(sr::getProperty));
     public static final String DEFAULT_NAME = ".default";
 
     public static OSGi<Void> createWhiteboard(Dictionary<String, ?> configuration) {
@@ -244,7 +246,7 @@ public class Whiteboard {
                 CXFJaxRsServiceRegistrator.class, applicationFilter).
                 flatMap(registratorReference ->
             just(
-                getApplicationName(getProperties(registratorReference))).
+                getApplicationName(registratorReference::getProperty)).
                 flatMap(applicationName ->
             waitForExtensionDependencies(ref,
                 service(registratorReference).flatMap(registrator ->
@@ -272,22 +274,24 @@ public class Whiteboard {
         return
             bundleContext().flatMap(
                 bundleContext -> highestRankedPerPath.flatMap(
-                    ref -> deployApplication(configuration, bundleContext, ref)
+                    tuple -> deployApplication(
+                        configuration, bundleContext, tuple, runtime)
                 ).map(
                     ServiceTuple::getServiceReference
                 ).map(
                     Utils::getProperties
                 ).foreach(
                     p -> runtime.setApplicationForPath(
-                        getApplicationBase(p), p),
-                    p -> runtime.unsetApplicationForPath(getApplicationBase(p))
+                        getApplicationBase(p::get), p),
+                    p -> runtime.unsetApplicationForPath(
+                        getApplicationBase(p::get))
                 )
             );
     }
 
     private static OSGi<ServiceTuple<Application>> deployApplication(
         Map<String, ?> configuration, BundleContext bundleContext,
-        ServiceTuple<Application> tuple) {
+        ServiceTuple<Application> tuple, AriesJaxRSServiceRuntime runtime) {
 
         ExtensionManagerBus bus = createBus(bundleContext, configuration);
 
@@ -297,18 +301,15 @@ public class Whiteboard {
         Map<String, Object> properties = getProperties(serviceReference);
 
         properties.computeIfAbsent(
-            JAX_RS_NAME,
-            (__) -> AriesJaxRSServiceRuntime.generateApplicationName(
-                properties));
+            JAX_RS_NAME, (__) -> generateApplicationName(
+                serviceReference::getProperty));
 
         return
-            all(
-                deployRegistrator(bus, tuple.getService(), properties),
-                registerCXFServletService(
-                    bus, getApplicationBase(properties), properties)).
-            then(
-                just(tuple)
-            );
+            deployRegistrator(bus, tuple, properties, runtime).then(
+            registerCXFServletService(
+                bus, getApplicationBase(properties::get), properties)).then(
+            just(tuple)
+        );
     }
 
     private static OSGi<ServiceReference<Application>>
@@ -438,9 +439,7 @@ public class Whiteboard {
         }
     }
 
-    public static String getApplicationBase(
-        Map<String, Object> properties) {
-
+    public static String getApplicationBase(PropertyHolder properties) {
         return properties.get(JAX_RS_APPLICATION_BASE).toString();
     }