Repository: aries-jax-rs-whiteboard
Updated Branches:
  refs/heads/master e6dfab21c -> c086a9287


Handle errored extensions


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

Branch: refs/heads/master
Commit: 9db4620c9a54c9a7afaf736d53ae8c2883d77f01
Parents: e6dfab2
Author: Carlos Sierra <[email protected]>
Authored: Mon Nov 20 09:05:37 2017 +0100
Committer: Carlos Sierra <[email protected]>
Committed: Mon Nov 20 09:06:46 2017 +0100

----------------------------------------------------------------------
 jax-rs.itests/src/main/java/test/JaxrsTest.java | 24 +++++++++
 .../internal/AriesJaxRSServiceRuntime.java      | 27 +++++++++-
 .../jax/rs/whiteboard/internal/Whiteboard.java  | 57 ++++++++------------
 3 files changed, 73 insertions(+), 35 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/9db4620c/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 8575271..c32d56a 100644
--- a/jax-rs.itests/src/main/java/test/JaxrsTest.java
+++ b/jax-rs.itests/src/main/java/test/JaxrsTest.java
@@ -803,6 +803,30 @@ public class JaxrsTest extends TestHelper {
     }
 
     @Test
+    public void testErroredExtension() {
+        registerApplication(new TestApplication());
+
+        ServiceRegistration<Feature> serviceRegistration = registerExtension(
+            Feature.class,
+            context -> {
+                throw new RuntimeException();
+            },
+            "ErrorFeature",
+            JAX_RS_APPLICATION_SELECT,
+            "(" + JAX_RS_APPLICATION_BASE + "=/test-application)");
+
+        RuntimeDTO runtimeDTO = _runtime.getRuntimeDTO();
+
+        assertEquals(1, runtimeDTO.failedExtensionDTOs.length);
+        assertEquals(
+            serviceRegistration.getReference().getProperty("service.id"),
+            runtimeDTO.failedExtensionDTOs[0].serviceId);
+        assertEquals(
+            DTOConstants.FAILURE_REASON_UNKNOWN,
+            runtimeDTO.failedExtensionDTOs[0].failureReason);
+    }
+
+    @Test
     public void testExtensionRegisterOnlySignalledInterfaces()
         throws InterruptedException {
 

http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/9db4620c/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 b8a0e5a..7bc252d 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
@@ -55,6 +55,19 @@ public class AriesJaxRSServiceRuntime implements 
JaxRSServiceRuntime {
     private static final long serialVersionUID = 1L;
     private static final Logger _LOGGER = LoggerFactory.getLogger(
         Whiteboard.class);
+
+    public void addErroredExtension(
+        CachingServiceReference<?> cachingServiceReference) {
+
+        _erroredExtensions.add(cachingServiceReference);
+    }
+
+    public void removeErroredExtension(
+        CachingServiceReference<?> cachingServiceReference) {
+
+        _erroredExtensions.remove(cachingServiceReference);
+    }
+
     private ConcurrentHashMap<String, Map<String, Object>>
         _applications = new ConcurrentHashMap<>();
     private ConcurrentHashMap<String, Collection<CachingServiceReference<?>>>
@@ -77,6 +90,8 @@ public class AriesJaxRSServiceRuntime implements 
JaxRSServiceRuntime {
         new CopyOnWriteArrayList<>();
     private Collection<CachingServiceReference<?>> _erroredEndpoints =
         new CopyOnWriteArrayList<>();
+    private Collection<CachingServiceReference<?>> _erroredExtensions =
+        new CopyOnWriteArrayList<>();
     private Collection<CachingServiceReference<?>> _ungettableEndpoints =
         new CopyOnWriteArrayList<>();
     private Collection<CachingServiceReference<?>> _ungettableExtensions =
@@ -241,7 +256,9 @@ public class AriesJaxRSServiceRuntime implements 
JaxRSServiceRuntime {
                 unreferenciableExtensionsDTOStream(),
                 Stream.concat(
                     applicationDependentExtensionsDTOStream(),
-                    invalidExtensionsDTOStream())
+                    Stream.concat(
+                        erroredExtensionsDTOStream(),
+                        invalidExtensionsDTOStream()))
             ).toArray(
                 FailedExtensionDTO[]::new
             );
@@ -436,6 +453,14 @@ public class AriesJaxRSServiceRuntime implements 
JaxRSServiceRuntime {
         );
     }
 
+    private Stream<FailedExtensionDTO> erroredExtensionsDTOStream() {
+        return _erroredExtensions.stream().map(
+            sr -> buildFailedExtensionDTO(
+                DTOConstants.FAILURE_REASON_UNKNOWN, sr)
+        );
+    }
+
+
     private Stream<ResourceDTO> getApplicationEndpointsStream(String name) {
         Collection<CachingServiceReference<?>> applicationEndpoints =
             _applicationEndpoints.get(name);

http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/9db4620c/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 724c838..c2c21ec 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
@@ -148,20 +148,13 @@ public class Whiteboard {
         BundleContext bundleContext, Dictionary<String, ?> configuration) {
 
         _bundleContext = bundleContext;
-
         _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()),
@@ -523,35 +516,31 @@ public class Whiteboard {
                 just(serviceReference),
                 _runtime::addNotGettableExtension,
                 _runtime::removeNotGettableExtension
-            ).flatMap(
-                serviceTuple -> {
-                    try {
-                        registrator.addProvider(serviceTuple);
-
-                        _runtime.addApplicationExtension(
-                            applicationName, serviceReference);
-
-                        return
-                            onClose(() -> {
-                                registrator.removeProvider(serviceTuple);
-
-                                _runtime.removeApplicationExtension(
-                                    applicationName, serviceReference);
-                            }).then(
-                            register(
-                                ApplicationExtensionRegistration.class,
-                                new ApplicationExtensionRegistration(){},
-                                properties)
+            ).recoverWith(
+                (t, e) -> {
+                    _runtime.addErroredExtension(
+                        t.getCachingServiceReference());
+
+                    return
+                        onClose(
+                            () -> _runtime.removeErroredExtension(
+                                t.getCachingServiceReference())
+                        ).then(
+                            nothing()
                         );
-                    }
-                    catch(Exception e) {
-                        return nothing();
-                        /*_runtime.addErroredExtension(serviceReference);
-
-                        return onClose(() -> 
_runtime.removeErroredExtension(serviceReference)).then(
-                            nothing());*/
-                    }
                 }
+            ).effects(
+                registrator::addProvider,
+                registrator::removeProvider
+            ).effects(
+                __ -> _runtime.addApplicationExtension(
+                    applicationName, serviceReference),
+                __ -> _runtime.removeApplicationExtension(
+                    applicationName, serviceReference)
+            ).then(
+            register(
+                ApplicationExtensionRegistration.class,
+                new ApplicationExtensionRegistration(){}, properties)
             ))));
     }
 

Reply via email to