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) )))); }
