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:03 UTC

[14/14] aries-jax-rs-whiteboard git commit: Added "gettable" checks

Added "gettable" checks


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

Branch: refs/heads/master
Commit: cabf65d716fc63b3db5aff1d45a3dae5ae135e01
Parents: d369a6a
Author: Carlos Sierra <cs...@apache.org>
Authored: Thu Aug 17 16:13:25 2017 +0200
Committer: Carlos Sierra <cs...@apache.org>
Committed: Fri Aug 18 15:59:21 2017 +0200

----------------------------------------------------------------------
 jax-rs.itests/src/main/java/test/JaxrsTest.java | 542 ++++++++++++-------
 .../internal/AriesJaxRSServiceRuntime.java      |  98 +++-
 .../aries/jax/rs/whiteboard/internal/Utils.java |   2 +-
 .../jax/rs/whiteboard/internal/Whiteboard.java  |  64 ++-
 4 files changed, 480 insertions(+), 226 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/cabf65d7/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 c36f0df..2f1439e 100644
--- a/jax-rs.itests/src/main/java/test/JaxrsTest.java
+++ b/jax-rs.itests/src/main/java/test/JaxrsTest.java
@@ -31,6 +31,7 @@ import org.osgi.framework.ServiceFactory;
 import org.osgi.framework.ServiceRegistration;
 
 import org.osgi.service.jaxrs.runtime.JaxRSServiceRuntime;
+import org.osgi.service.jaxrs.runtime.dto.DTOConstants;
 import org.osgi.util.tracker.ServiceTracker;
 import test.types.TestAddon;
 import test.types.TestAddonConflict;
@@ -54,6 +55,13 @@ public class JaxrsTest extends TestHelper {
 
     private ServiceTracker<JaxRSServiceRuntime, JaxRSServiceRuntime> _runtimeTracker;
 
+    @After
+    public void tearDown() {
+        if (_runtimeTracker != null) {
+            _runtimeTracker.close();
+        }
+    }
+
     @Test
     public void testApplication() throws InterruptedException {
         ServiceRegistration<?> serviceRegistration = null;
@@ -88,15 +96,6 @@ public class JaxrsTest extends TestHelper {
         }
     }
 
-    private JaxRSServiceRuntime getJaxRSServiceRuntime() throws InterruptedException {
-        _runtimeTracker = new ServiceTracker<>(
-            bundleContext, JaxRSServiceRuntime.class, null);
-
-        _runtimeTracker.open();
-
-        return _runtimeTracker.waitForService(5000);
-    }
-
     @Test
     public void testApplicationConflict() {
         Client client = createClient();
@@ -144,108 +143,6 @@ public class JaxrsTest extends TestHelper {
     }
 
     @Test
-    public void testApplicationOverride() throws InterruptedException {
-        Client client = createClient();
-
-        WebTarget webTarget = client.
-            target("http://localhost:8080").
-            path("test-application");
-
-        JaxRSServiceRuntime runtime = getJaxRSServiceRuntime();
-
-        ServiceRegistration<?> serviceRegistration = null;
-        ServiceRegistration<?> serviceRegistration2;
-
-        try {
-            assertEquals(0, runtime.getRuntimeDTO().applicationDTOs.length);
-            assertEquals(0, runtime.getRuntimeDTO().failedApplicationDTOs.length);
-
-            serviceRegistration = registerApplication(new TestApplication());
-
-            assertEquals(1, runtime.getRuntimeDTO().applicationDTOs.length);
-            assertEquals(0, runtime.getRuntimeDTO().failedApplicationDTOs.length);
-
-            Response response = webTarget.request().get();
-
-            assertEquals(
-                "Hello application",
-                response.readEntity(String.class));
-
-            serviceRegistration2 = registerApplication(
-                new TestApplicationConflict(), "service.ranking", 1);
-
-            assertEquals(1, runtime.getRuntimeDTO().applicationDTOs.length);
-            assertEquals(1, runtime.getRuntimeDTO().failedApplicationDTOs.length);
-
-            response = webTarget.request().get();
-
-            assertEquals(
-                "Hello application conflict",
-                response.readEntity(String.class));
-
-            assertEquals(
-                "conflict",
-                webTarget.path("conflict").request().get(String.class));
-
-            serviceRegistration2.unregister();
-
-            assertEquals(1, runtime.getRuntimeDTO().applicationDTOs.length);
-            assertEquals(0, runtime.getRuntimeDTO().failedApplicationDTOs.length);
-
-            response = webTarget.request().get();
-
-            assertEquals(
-                "Hello application", response.readEntity(String.class));
-        }
-        finally {
-            if (serviceRegistration != null) {
-                serviceRegistration.unregister();
-            }
-        }
-    }
-
-    @Test
-    public void testApplicationReadd() throws InterruptedException {
-        Client client = createClient();
-
-        WebTarget webTarget = client.
-            target("http://localhost:8080").
-            path("/test-application");
-
-        JaxRSServiceRuntime runtime = getJaxRSServiceRuntime();
-
-        Runnable testCase = () -> {
-            assertEquals(0, runtime.getRuntimeDTO().applicationDTOs.length);
-
-            assertEquals(404, webTarget.request().get().getStatus());
-
-            ServiceRegistration<?> serviceRegistration = null;
-
-            try {
-                serviceRegistration = registerApplication(new TestApplication());
-
-                assertEquals(
-                    "Hello application",
-                    webTarget.
-                        request().
-                        get().
-                        readEntity(String.class));
-
-                assertEquals(1, runtime.getRuntimeDTO().applicationDTOs.length);
-            }
-            finally {
-                if (serviceRegistration != null) {
-                    serviceRegistration.unregister();
-                }
-            }
-        };
-
-        testCase.run();
-
-        testCase.run();
-    }
-
-    @Test
     public void testApplicationEndpointExtension() {
         Client client = createClient();
 
@@ -333,6 +230,67 @@ public class JaxrsTest extends TestHelper {
     }
 
     @Test
+    public void testApplicationOverride() throws InterruptedException {
+        Client client = createClient();
+
+        WebTarget webTarget = client.
+            target("http://localhost:8080").
+            path("test-application");
+
+        JaxRSServiceRuntime runtime = getJaxRSServiceRuntime();
+
+        ServiceRegistration<?> serviceRegistration = null;
+        ServiceRegistration<?> serviceRegistration2;
+
+        try {
+            assertEquals(0, runtime.getRuntimeDTO().applicationDTOs.length);
+            assertEquals(0, runtime.getRuntimeDTO().failedApplicationDTOs.length);
+
+            serviceRegistration = registerApplication(new TestApplication());
+
+            assertEquals(1, runtime.getRuntimeDTO().applicationDTOs.length);
+            assertEquals(0, runtime.getRuntimeDTO().failedApplicationDTOs.length);
+
+            Response response = webTarget.request().get();
+
+            assertEquals(
+                "Hello application",
+                response.readEntity(String.class));
+
+            serviceRegistration2 = registerApplication(
+                new TestApplicationConflict(), "service.ranking", 1);
+
+            assertEquals(1, runtime.getRuntimeDTO().applicationDTOs.length);
+            assertEquals(1, runtime.getRuntimeDTO().failedApplicationDTOs.length);
+
+            response = webTarget.request().get();
+
+            assertEquals(
+                "Hello application conflict",
+                response.readEntity(String.class));
+
+            assertEquals(
+                "conflict",
+                webTarget.path("conflict").request().get(String.class));
+
+            serviceRegistration2.unregister();
+
+            assertEquals(1, runtime.getRuntimeDTO().applicationDTOs.length);
+            assertEquals(0, runtime.getRuntimeDTO().failedApplicationDTOs.length);
+
+            response = webTarget.request().get();
+
+            assertEquals(
+                "Hello application", response.readEntity(String.class));
+        }
+        finally {
+            if (serviceRegistration != null) {
+                serviceRegistration.unregister();
+            }
+        }
+    }
+
+    @Test
     public void testApplicationProviderExtension() {
         Client client = createClient();
 
@@ -388,7 +346,7 @@ public class JaxrsTest extends TestHelper {
                 "Hello application",
                 webTarget.request().get().readEntity(String.class));
 
-            Runnable testCase = () ->  {
+            Runnable testCase = () -> {
                 Response response = webTarget.request().get();
 
                 assertNull(response.getHeaders().getFirst("Filtered"));
@@ -426,6 +384,47 @@ public class JaxrsTest extends TestHelper {
     }
 
     @Test
+    public void testApplicationReadd() throws InterruptedException {
+        Client client = createClient();
+
+        WebTarget webTarget = client.
+            target("http://localhost:8080").
+            path("/test-application");
+
+        JaxRSServiceRuntime runtime = getJaxRSServiceRuntime();
+
+        Runnable testCase = () -> {
+            assertEquals(0, runtime.getRuntimeDTO().applicationDTOs.length);
+
+            assertEquals(404, webTarget.request().get().getStatus());
+
+            ServiceRegistration<?> serviceRegistration = null;
+
+            try {
+                serviceRegistration = registerApplication(new TestApplication());
+
+                assertEquals(
+                    "Hello application",
+                    webTarget.
+                        request().
+                        get().
+                        readEntity(String.class));
+
+                assertEquals(1, runtime.getRuntimeDTO().applicationDTOs.length);
+            }
+            finally {
+                if (serviceRegistration != null) {
+                    serviceRegistration.unregister();
+                }
+            }
+        };
+
+        testCase.run();
+
+        testCase.run();
+    }
+
+    @Test
     public void testEndpointsOverride() {
         Client client = createClient();
 
@@ -475,6 +474,131 @@ public class JaxrsTest extends TestHelper {
     }
 
     @Test
+    public void testGettableAndNotGettableApplication() throws InterruptedException {
+        Client client = createClient();
+
+        WebTarget webTarget = client.
+            target("http://localhost:8080").
+            path("test-application");
+
+        JaxRSServiceRuntime runtime = getJaxRSServiceRuntime();
+
+        assertEquals(0, runtime.getRuntimeDTO().applicationDTOs.length);
+        assertEquals(0, runtime.getRuntimeDTO().failedApplicationDTOs.length);
+
+        ServiceRegistration<Application> serviceRegistration =
+            registerApplication(new TestApplication());
+
+        assertEquals(1, runtime.getRuntimeDTO().applicationDTOs.length);
+        assertEquals(0, runtime.getRuntimeDTO().failedApplicationDTOs.length);
+
+        assertEquals(
+            "Hello application",
+            webTarget.request().get().readEntity(String.class));
+
+        ServiceRegistration<Application> ungettableServiceRegistration =
+            registerUngettableApplication("service.ranking", 1);
+
+        assertEquals(1, runtime.getRuntimeDTO().applicationDTOs.length);
+        assertEquals(1, runtime.getRuntimeDTO().failedApplicationDTOs.length);
+
+        assertEquals(
+            DTOConstants.FAILURE_REASON_SERVICE_NOT_GETTABLE,
+            runtime.getRuntimeDTO().failedApplicationDTOs[0].failureReason);
+
+        assertEquals(
+            "Hello application",
+            webTarget.request().get().readEntity(String.class));
+
+        serviceRegistration.unregister();
+
+        assertEquals(0, runtime.getRuntimeDTO().applicationDTOs.length);
+        assertEquals(1, runtime.getRuntimeDTO().failedApplicationDTOs.length);
+
+        assertEquals(404, webTarget.request().get().getStatus());
+
+        ungettableServiceRegistration.unregister();
+
+        assertEquals(0, runtime.getRuntimeDTO().applicationDTOs.length);
+        assertEquals(0, runtime.getRuntimeDTO().failedApplicationDTOs.length);
+    }
+
+    @Test
+    public void testGettableAndShadowedNotGettableApplication()
+        throws InterruptedException {
+
+        Client client = createClient();
+
+        WebTarget webTarget = client.
+            target("http://localhost:8080").
+            path("test-application");
+
+        JaxRSServiceRuntime runtime = getJaxRSServiceRuntime();
+
+        assertEquals(0, runtime.getRuntimeDTO().applicationDTOs.length);
+        assertEquals(0, runtime.getRuntimeDTO().failedApplicationDTOs.length);
+
+        ServiceRegistration<Application> serviceRegistration =
+            registerApplication(new TestApplication());
+
+        assertEquals(1, runtime.getRuntimeDTO().applicationDTOs.length);
+        assertEquals(0, runtime.getRuntimeDTO().failedApplicationDTOs.length);
+
+        assertEquals(
+            "Hello application",
+            webTarget.request().get().readEntity(String.class));
+
+        ServiceRegistration<Application> ungettableServiceRegistration =
+            registerUngettableApplication("service.ranking", -1);
+
+        assertEquals(1, runtime.getRuntimeDTO().applicationDTOs.length);
+        assertEquals(1, runtime.getRuntimeDTO().failedApplicationDTOs.length);
+
+        assertEquals(
+            DTOConstants.FAILURE_REASON_SERVICE_NOT_GETTABLE,
+            runtime.getRuntimeDTO().failedApplicationDTOs[0].failureReason);
+
+        assertEquals(
+            "Hello application",
+            webTarget.request().get().readEntity(String.class));
+
+        serviceRegistration.unregister();
+
+        assertEquals(0, runtime.getRuntimeDTO().applicationDTOs.length);
+        assertEquals(1, runtime.getRuntimeDTO().failedApplicationDTOs.length);
+
+        assertEquals(404, webTarget.request().get().getStatus());
+
+        ungettableServiceRegistration.unregister();
+
+        assertEquals(0, runtime.getRuntimeDTO().applicationDTOs.length);
+        assertEquals(0, runtime.getRuntimeDTO().failedApplicationDTOs.length);
+    }
+
+    @Test
+    public void testNotGettableApplication() throws InterruptedException {
+        JaxRSServiceRuntime runtime = getJaxRSServiceRuntime();
+
+        assertEquals(0, runtime.getRuntimeDTO().applicationDTOs.length);
+        assertEquals(0, runtime.getRuntimeDTO().failedApplicationDTOs.length);
+
+        ServiceRegistration<Application> serviceRegistration =
+            registerUngettableApplication();
+
+        assertEquals(0, runtime.getRuntimeDTO().applicationDTOs.length);
+        assertEquals(1, runtime.getRuntimeDTO().failedApplicationDTOs.length);
+
+        assertEquals(
+            DTOConstants.FAILURE_REASON_SERVICE_NOT_GETTABLE,
+            runtime.getRuntimeDTO().failedApplicationDTOs[0].failureReason);
+
+        serviceRegistration.unregister();
+
+        assertEquals(0, runtime.getRuntimeDTO().applicationDTOs.length);
+        assertEquals(0, runtime.getRuntimeDTO().failedApplicationDTOs.length);
+    }
+
+    @Test
     public void testStandaloneEndPoint() {
         Client client = createClient();
 
@@ -500,6 +624,32 @@ public class JaxrsTest extends TestHelper {
         }
     }
 
+    @Test
+    public void testStandaloneEndPointPrototypeLifecycle() {
+        Client client = createClient();
+
+        WebTarget webTarget = client.
+            target("http://localhost:8080").
+            path("/test-addon-lifecycle");
+
+        ServiceRegistration<?> serviceRegistration = null;
+
+        try {
+            serviceRegistration = registerAddonLifecycle(
+                false, JAX_RS_RESOURCE, "true");
+
+            String first = webTarget.request().get().readEntity(String.class);
+
+            String second = webTarget.request().get().readEntity(String.class);
+
+            assertNotEquals("This should be different", first, second);
+        }
+        finally {
+            if (serviceRegistration != null) {
+                serviceRegistration.unregister();
+            }
+        }
+    }
 
     @Test
     public void testStandaloneEndPointReadd() {
@@ -561,24 +711,57 @@ public class JaxrsTest extends TestHelper {
     }
 
     @Test
-    public void testStandaloneEndPointPrototypeLifecycle() {
+    public void testStandaloneEndpointWithExtensionsDependencies() {
         Client client = createClient();
 
         WebTarget webTarget = client.
             target("http://localhost:8080").
-            path("/test-addon-lifecycle");
+            path("test");
 
         ServiceRegistration<?> serviceRegistration = null;
+        ServiceRegistration<?> extensionRegistration1;
+        ServiceRegistration<?> extensionRegistration2;
 
         try {
-            serviceRegistration = registerAddonLifecycle(
-                false, JAX_RS_RESOURCE, "true");
+            serviceRegistration = registerAddon(
+                new TestAddon(),
+                JAX_RS_EXTENSION_SELECT, new String[]{
+                    "(property one=one)",
+                    "(property two=two)",
+                });
 
-            String first = webTarget.request().get().readEntity(String.class);
+            assertEquals(404, webTarget.request().get().getStatus());
 
-            String second = webTarget.request().get().readEntity(String.class);
+            extensionRegistration1 = registerExtension(
+                "aExtension", "property one", "one");
 
-            assertNotEquals("This should be different", first, second);
+            assertEquals(404, webTarget.request().get().getStatus());
+
+            extensionRegistration2 = registerExtension(
+                "anotherExtension", "property two", "two");
+
+            Response response = webTarget.request().get();
+
+            assertEquals(
+                "This should say hello", "Hello test",
+                response.readEntity(String.class));
+
+            extensionRegistration1.unregister();
+
+            assertEquals(404, webTarget.request().get().getStatus());
+
+            extensionRegistration1 = registerExtension(
+                "aExtension", "property one", "one");
+
+            assertEquals(
+                "This should say hello", "Hello test",
+                response.readEntity(String.class));
+
+            extensionRegistration2.unregister();
+
+            assertEquals(404, webTarget.request().get().getStatus());
+
+            extensionRegistration1.unregister();
         }
         finally {
             if (serviceRegistration != null) {
@@ -677,67 +860,16 @@ public class JaxrsTest extends TestHelper {
         }
     }
 
-    @Test
-    public void testStandaloneEndpointWithExtensionsDependencies() {
-        Client client = createClient();
-
-        WebTarget webTarget = client.
-            target("http://localhost:8080").
-            path("test");
-
-        ServiceRegistration<?> serviceRegistration = null;
-        ServiceRegistration<?> extensionRegistration1;
-        ServiceRegistration<?> extensionRegistration2;
-
-        try {
-            serviceRegistration = registerAddon(
-                new TestAddon(),
-                JAX_RS_EXTENSION_SELECT, new String[]{
-                    "(property one=one)",
-                    "(property two=two)",
-                });
-
-            assertEquals(404, webTarget.request().get().getStatus());
-
-            extensionRegistration1 = registerExtension(
-                "aExtension", "property one", "one");
-
-            assertEquals(404, webTarget.request().get().getStatus());
-
-            extensionRegistration2 = registerExtension(
-                "anotherExtension", "property two", "two");
-
-            Response response = webTarget.request().get();
-
-            assertEquals(
-                "This should say hello", "Hello test",
-                response.readEntity(String.class));
-
-            extensionRegistration1.unregister();
-
-            assertEquals(404, webTarget.request().get().getStatus());
-
-            extensionRegistration1 = registerExtension(
-                "aExtension", "property one", "one");
-
-            assertEquals(
-                "This should say hello", "Hello test",
-                response.readEntity(String.class));
-
-            extensionRegistration2.unregister();
+    private JaxRSServiceRuntime getJaxRSServiceRuntime() throws InterruptedException {
+        _runtimeTracker = new ServiceTracker<>(
+            bundleContext, JaxRSServiceRuntime.class, null);
 
-            assertEquals(404, webTarget.request().get().getStatus());
+        _runtimeTracker.open();
 
-            extensionRegistration1.unregister();
-        }
-        finally {
-            if (serviceRegistration != null) {
-                serviceRegistration.unregister();
-            }
-        }
+        return _runtimeTracker.waitForService(5000);
     }
 
-    private ServiceRegistration<?> registerAddon(Object instance, Object ... keyValues) {
+    private ServiceRegistration<?> registerAddon(Object instance, Object... keyValues) {
         Dictionary<String, Object> properties = new Hashtable<>();
 
         properties.put(JAX_RS_RESOURCE, "true");
@@ -751,7 +883,7 @@ public class JaxrsTest extends TestHelper {
     }
 
     private ServiceRegistration<?> registerAddonLifecycle(
-        boolean singleton, Object ... keyValues) {
+        boolean singleton, Object... keyValues) {
 
         Dictionary<String, Object> properties = new Hashtable<>();
 
@@ -762,8 +894,7 @@ public class JaxrsTest extends TestHelper {
         if (singleton) {
             return bundleContext.registerService(
                 Object.class, new TestAddonLifecycle(), properties);
-        }
-        else {
+        } else {
             PrototypeServiceFactory<Object> prototypeServiceFactory =
                 new PrototypeServiceFactory<Object>() {
                     @Override
@@ -782,13 +913,13 @@ public class JaxrsTest extends TestHelper {
                 };
 
             return bundleContext.registerService(
-                Object.class, (ServiceFactory<?>)prototypeServiceFactory,
+                Object.class, (ServiceFactory<?>) prototypeServiceFactory,
                 properties);
         }
     }
 
     private ServiceRegistration<Application> registerApplication(
-        Application application, Object ... keyValues) {
+        Application application, Object... keyValues) {
 
         Dictionary<String, Object> properties = new Hashtable<>();
 
@@ -802,22 +933,23 @@ public class JaxrsTest extends TestHelper {
             Application.class, application, properties);
     }
 
-    private ServiceRegistration<?> registerFilter(Object ... keyValues) {
-
-        TestFilter testFilter = new TestFilter();
+    private ServiceRegistration<Application> registerApplication(
+        ServiceFactory<Application> serviceFactory, Object... keyValues) {
 
         Dictionary<String, Object> properties = new Hashtable<>();
 
+        properties.put(JAX_RS_APPLICATION_BASE, "/test-application");
+
         for (int i = 0; i < keyValues.length; i = i + 2) {
             properties.put(keyValues[i].toString(), keyValues[i + 1]);
         }
 
         return bundleContext.registerService(
-            Object.class, testFilter, properties);
+            Application.class, serviceFactory, properties);
     }
 
     private ServiceRegistration<?> registerExtension(
-        String name, Object ... keyValues) {
+        String name, Object... keyValues) {
 
         TestFilter testFilter = new TestFilter();
 
@@ -833,11 +965,41 @@ public class JaxrsTest extends TestHelper {
             Object.class, testFilter, properties);
     }
 
-    @After
-    public void tearDown() {
-        if (_runtimeTracker != null) {
-            _runtimeTracker.close();
+    private ServiceRegistration<?> registerFilter(Object... keyValues) {
+
+        TestFilter testFilter = new TestFilter();
+
+        Dictionary<String, Object> properties = new Hashtable<>();
+
+        for (int i = 0; i < keyValues.length; i = i + 2) {
+            properties.put(keyValues[i].toString(), keyValues[i + 1]);
         }
+
+        return bundleContext.registerService(
+            Object.class, testFilter, properties);
+    }
+
+    private ServiceRegistration<Application> registerUngettableApplication(
+        Object... keyValues) {
+
+        return registerApplication(
+            new ServiceFactory<Application>() {
+                @Override
+                public Application getService(
+                    Bundle bundle,
+                    ServiceRegistration<Application> serviceRegistration) {
+
+                    return null;
+                }
+
+                @Override
+                public void ungetService(
+                    Bundle bundle,
+                    ServiceRegistration<Application> serviceRegistration,
+                    Application application) {
+
+                }
+            }, keyValues);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/cabf65d7/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 5317b66..e312432 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
@@ -19,6 +19,7 @@ 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.BundleContext;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.jaxrs.runtime.JaxRSServiceRuntime;
 import org.osgi.service.jaxrs.runtime.dto.ApplicationDTO;
@@ -29,6 +30,7 @@ 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;
@@ -45,12 +47,20 @@ public class AriesJaxRSServiceRuntime implements JaxRSServiceRuntime {
     private ConcurrentHashMap<String, TreeSet<Event<ServiceReference<Application>>>> _applications =
         new ConcurrentHashMap<>();
 
+    private Collection<Event<ServiceReference<Application>>>
+        _ungettableApplications;
+
     private Comparator<Event<ServiceReference<Application>>> _applicationComparator;
+    private BundleContext _bundleContext;
+
+    public AriesJaxRSServiceRuntime(BundleContext bundleContext) {
+        _bundleContext = bundleContext;
 
-    public AriesJaxRSServiceRuntime() {
         _applicationComparator = Comparator.comparing(Event::getContent);
 
         _applicationComparator = _applicationComparator.reversed();
+
+        _ungettableApplications = new TreeSet<>(_applicationComparator);
     }
 
     public OSGi<ServiceReference<Application>> processApplications(
@@ -61,6 +71,12 @@ public class AriesJaxRSServiceRuntime implements JaxRSServiceRuntime {
                 ServiceReference<Application> serviceReference =
                     event.getContent();
 
+                if (!checkGettable(serviceReference))  {
+                    _ungettableApplications.add(event);
+
+                    return;
+                }
+
                 String path = serviceReference.getProperty(JAX_RS_APPLICATION_BASE).
                     toString();
 
@@ -86,6 +102,13 @@ public class AriesJaxRSServiceRuntime implements JaxRSServiceRuntime {
                 ServiceReference<Application> serviceReference =
                     event.getContent();
 
+                boolean ungettable = _ungettableApplications.removeIf(
+                    t -> t.getContent().equals(serviceReference));
+
+                if (ungettable) {
+                    return;
+                }
+
                 String path = serviceReference.getProperty(JAX_RS_APPLICATION_BASE).
                     toString();
 
@@ -112,6 +135,28 @@ public class AriesJaxRSServiceRuntime implements JaxRSServiceRuntime {
         });
     }
 
+    private boolean checkGettable(
+        ServiceReference<Application> serviceReference) {
+
+        Application application = null;
+
+        try {
+            application = _bundleContext.getService(
+                serviceReference);
+        }
+        catch (Exception e) {
+        }
+
+        if (application == null) {
+            return false;
+        }
+        else {
+            _bundleContext.ungetService(serviceReference);
+        }
+
+        return true;
+    }
+
     @Override
     public RequestInfoDTO calculateRequestInfoDTO(String path) {
         return null;
@@ -121,7 +166,23 @@ public class AriesJaxRSServiceRuntime implements JaxRSServiceRuntime {
     public RuntimeDTO getRuntimeDTO() {
         RuntimeDTO runtimeDTO = new RuntimeDTO();
 
-        runtimeDTO.applicationDTOs = _applications.values().stream().
+        runtimeDTO.applicationDTOs = applicationDTOStream().
+            toArray(
+                ApplicationDTO[]::new
+            );
+
+        runtimeDTO.failedApplicationDTOs = Stream.concat(
+            shadowedApplications(),
+            unreferenciableApplications()
+            ).toArray(
+                FailedApplicationDTO[]::new
+            );
+
+        return runtimeDTO;
+    }
+
+    private Stream<ApplicationDTO> applicationDTOStream() {
+        return _applications.values().stream().
             flatMap(
                 tree -> tree.size() > 0 ? Stream.of(tree.first()) : Stream.empty()
             ).filter(
@@ -130,25 +191,32 @@ public class AriesJaxRSServiceRuntime implements JaxRSServiceRuntime {
                 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(
+    private Stream<FailedApplicationDTO> unreferenciableApplications() {
+        return _ungettableApplications.stream().
+            map(
                 Event::getContent
             ).map(
                 sr -> buildFailedApplicationDTO(
-                    DTOConstants.FAILURE_REASON_SHADOWED_BY_OTHER_SERVICE, sr)
-            ).toArray(
-                FailedApplicationDTO[]::new
-            );
+                    DTOConstants.FAILURE_REASON_SERVICE_NOT_GETTABLE,
+                    sr)
+        );
+    }
 
-        return runtimeDTO;
+    private Stream<FailedApplicationDTO> shadowedApplications() {
+        return _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)
+        );
     }
 
     private static ApplicationDTO buildApplicationDTO(

http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/cabf65d7/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 58f7421..2fb2854 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
@@ -61,7 +61,7 @@ public class Utils {
         );
     }
 
-    public static OSGi<?> cxfRegistrator(
+    public static OSGi<?> deployRegistrator(
         Bus bus, Application application, Map<String, Object> props) {
 
         try {

http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/cabf65d7/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 33284a5..aaee9ac 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
@@ -42,7 +42,7 @@ import java.util.Map;
 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.deployRegistrator;
 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;
@@ -72,10 +72,11 @@ 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 ->
+            just(new AriesJaxRSServiceRuntime(bundleContext)).flatMap(runtime ->
             registerJaxRSServiceRuntime(runtime, bundleContext, Maps.from(configuration)).flatMap(runtimeResgistration ->
             createDefaultJaxRsServiceRegistrator(Maps.from(configuration)).flatMap(defaultServiceRegistrator ->
             just(new ServiceRegistrationChangeCounter(runtimeResgistration)).flatMap(counter ->
@@ -85,7 +86,7 @@ public class Whiteboard {
                     countChanges(whiteBoardApplicationSingletons(reference), counter),
                     countChanges(whiteboardExtensions(reference, defaultServiceRegistrator), counter),
                     countChanges(whiteboardSingletons(reference, defaultServiceRegistrator), counter)
-            ))))));
+            )))))));
     }
 
     private static OSGi<Collection<String>> bestEffortCalculationOfEnpoints(Filter filter) {
@@ -229,28 +230,51 @@ public class Whiteboard {
         AriesJaxRSServiceRuntime runtime,
         Map<String, ?> configuration) {
 
+        OSGi<ServiceReference<Application>> applicationsForWhiteboard =
+            getApplicationsForWhiteboard(jaxRsRuntimeServiceReference);
+
         return
             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)
-                        )
-                )))));
+                bundleContext ->
+                    runtime.processApplications(applicationsForWhiteboard).flatMap(
+                        ref -> deployApplication(
+                            configuration, bundleContext, ref)));
+    }
+
+    private static OSGi<Void> deployApplication(
+        Map<String, ?> configuration, BundleContext bundleContext,
+        ServiceReference<Application> ref) {
+
+        ExtensionManagerBus bus = createBus(bundleContext, configuration);
+        Map<String, Object> properties =
+            CXFJaxRsServiceRegistrator.getProperties(
+                ref, JAX_RS_APPLICATION_BASE);
+
+        return service(ref).flatMap(
+            application ->
+                all(
+                    deployRegistrator(bus, application, properties),
+                    registerCXFServletService(
+                        bus, ref.getProperty(JAX_RS_APPLICATION_BASE).toString(),
+                        properties)
+                )
+            );
+    }
+
+    private static OSGi<ServiceReference<Application>>
+        getApplicationsForWhiteboard(
+            ServiceReference<?> jaxRsRuntimeServiceReference) {
+
+        return
+            serviceReferences(
+                Application.class, getApplicationFilter()).
+            filter(
+                new TargetFilter<>(jaxRsRuntimeServiceReference));
     }
 
     private static OSGi<?> whiteboardExtensions(
-        ServiceReference<?> jaxRsRuntimeServiceReference, CXFJaxRsServiceRegistrator defaultServiceRegistrator) {
+        ServiceReference<?> jaxRsRuntimeServiceReference,
+        CXFJaxRsServiceRegistrator defaultServiceRegistrator) {
 
         return
             serviceReferences(getExtensionFilter()).