Calculate needed extensions per application
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/00057c9e Tree: http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/tree/00057c9e Diff: http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/diff/00057c9e Branch: refs/heads/master Commit: 00057c9ea2891defbc7adc54bd950b8dce97a6d7 Parents: fe929ae Author: Carlos Sierra <[email protected]> Authored: Thu Aug 24 12:58:10 2017 +0200 Committer: Carlos Sierra <[email protected]> Committed: Thu Aug 24 12:58:10 2017 +0200 ---------------------------------------------------------------------- jax-rs.itests/src/main/java/test/JaxrsTest.java | 7 ++- .../internal/AriesJaxRSServiceRuntime.java | 2 +- .../aries/jax/rs/whiteboard/internal/Utils.java | 24 +++++++-- .../jax/rs/whiteboard/internal/Whiteboard.java | 53 +++++++++++++------- 4 files changed, 61 insertions(+), 25 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/00057c9e/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 e71f2b4..6491ec3 100644 --- a/jax-rs.itests/src/main/java/test/JaxrsTest.java +++ b/jax-rs.itests/src/main/java/test/JaxrsTest.java @@ -25,6 +25,7 @@ import java.util.Hashtable; import java.util.Set; import org.junit.After; +import org.junit.Ignore; import org.junit.Test; import org.osgi.framework.Bundle; import org.osgi.framework.PrototypeServiceFactory; @@ -836,8 +837,7 @@ public class JaxrsTest extends TestHelper { try { serviceRegistration = registerAddon(new TestAddon()); - filterRegistration = registerExtension( - "Filter", JAX_RS_EXTENSION, "test-filter"); + filterRegistration = registerExtension("Filter"); Response response = webTarget.request().get(); @@ -881,8 +881,7 @@ public class JaxrsTest extends TestHelper { assertNull(response.getHeaders().getFirst("Filtered")); - filterRegistration = registerExtension( - "Filter", JAX_RS_EXTENSION, "test-filter"); + filterRegistration = registerExtension("Filter"); response = webTarget.request().get(); http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/00057c9e/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 c556e4f..c680f3c 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 @@ -351,7 +351,7 @@ public class AriesJaxRSServiceRuntime implements JaxRSServiceRuntime { private static ResourceDTO populateResourceDTO( ResourceDTO resourceDTO, ServiceReference<?> serviceReference) { - resourceDTO.name = serviceReference.getProperty(JAX_RS_NAME).toString(); + resourceDTO.name = getApplicationName(serviceReference::getProperty); resourceDTO.serviceId = (Long)serviceReference.getProperty( "service.id"); http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/00057c9e/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 411281f..dd7530b 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 @@ -24,7 +24,7 @@ import org.apache.cxf.jaxrs.lifecycle.ResourceProvider; import org.apache.cxf.message.Message; import org.osgi.framework.ServiceObjects; import org.osgi.framework.ServiceReference; -import org.osgi.service.jaxrs.runtime.dto.FailedApplicationDTO; +import org.osgi.service.jaxrs.whiteboard.JaxRSWhiteboardConstants; import javax.ws.rs.core.Application; import java.util.Comparator; @@ -36,6 +36,7 @@ import java.util.TreeSet; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Consumer; import java.util.function.Function; +import java.util.function.Supplier; import static org.apache.aries.osgi.functional.OSGi.bundleContext; import static org.apache.aries.osgi.functional.OSGi.just; @@ -136,10 +137,21 @@ public class Utils { } public static OSGi<?> safeRegisterExtension( - ServiceReference<?> serviceReference, - String applicationName, CXFJaxRsServiceRegistrator registrator, + ServiceReference<?> serviceReference, String applicationName, + CXFJaxRsServiceRegistrator registrator, AriesJaxRSServiceRuntime runtime) { + Map<String, Object> properties = getProperties(serviceReference); + + properties.put( + JaxRSWhiteboardConstants.JAX_RS_NAME, applicationName); + properties.put( + "original.objectClass", + serviceReference.getProperty("objectClass")); + + properties.remove(JaxRSWhiteboardConstants.JAX_RS_EXTENSION); + properties.remove(JaxRSWhiteboardConstants.JAX_RS_RESOURCE); + return onlyGettables( just(serviceReference), @@ -153,6 +165,10 @@ public class Utils { applicationName, serviceReference), __ -> runtime.removeApplicationExtension( applicationName, serviceReference) + ).then( + register( + ApplicationExtensionRegistration.class, + new ApplicationExtensionRegistration(){}, properties) ); } @@ -459,4 +475,6 @@ public class Utils { Object get(String propertyName); } + public interface ApplicationExtensionRegistration {} + } http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/00057c9e/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 ffb6379..d53985e 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.ApplicationExtensionRegistration; 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; @@ -79,7 +80,12 @@ 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(sr -> getApplicationBase(sr::getProperty)); + 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) { @@ -118,7 +124,11 @@ public class Whiteboard { } private static String buildExtensionFilter(String filter) { - return String.format("(&%s%s)", getExtensionFilter(), filter); + filter = filter.replace("(objectClass=", "(original.objectClass="); + + return String.format( + "(&(objectClass=%s)%s)", + ApplicationExtensionRegistration.class.getName(), filter); } private static String[] canonicalize(Object propertyValue) { @@ -174,11 +184,11 @@ public class Whiteboard { return format("(%s=*)", JAX_RS_APPLICATION_BASE); } - private static String getExtensionFilter() { - return format("(%s=*)", JAX_RS_EXTENSION); + private static String getExtensionsFilter() { + return format("(%s=true)", JAX_RS_EXTENSION); } - private static String getSingletonsFilter() { + private static String getResourcesFilter() { return format("(%s=true)", JAX_RS_RESOURCE); } @@ -219,7 +229,8 @@ public class Whiteboard { } private static OSGi<?> waitForExtensionDependencies( - ServiceReference<?> serviceReference, OSGi<?> program) { + ServiceReference<?> serviceReference, AriesJaxRSServiceRuntime runtime, + OSGi<?> program) { String[] extensionDependencies = canonicalize( serviceReference.getProperty(JAX_RS_EXTENSION_SELECT)); @@ -237,10 +248,12 @@ public class Whiteboard { ServiceReference<?> jaxRsRuntimeServiceReference, AriesJaxRSServiceRuntime runtime) { return - serviceReferences(format("(%s=*)", JAX_RS_APPLICATION_SELECT)). + serviceReferences(getApplicationSingletonsFilter()). filter(new TargetFilter<>(jaxRsRuntimeServiceReference)). - flatMap(ref -> - just(ref.getProperty(JAX_RS_APPLICATION_SELECT).toString()). + flatMap(endpointReference -> + just(endpointReference. + getProperty(JAX_RS_APPLICATION_SELECT). + toString()). flatMap(applicationFilter -> serviceReferences( CXFJaxRsServiceRegistrator.class, applicationFilter). @@ -248,12 +261,19 @@ public class Whiteboard { just( getApplicationName(registratorReference::getProperty)). flatMap(applicationName -> - waitForExtensionDependencies(ref, + waitForExtensionDependencies(endpointReference, runtime, service(registratorReference).flatMap(registrator -> - safeRegisterGeneric(ref, applicationName, registrator, runtime) + safeRegisterGeneric( + endpointReference, applicationName, registrator, runtime) )))))); } + private static String getApplicationSingletonsFilter() { + return format( + "(&(|%s%s)(%s=*))", getExtensionsFilter(), getResourcesFilter(), + JAX_RS_APPLICATION_SELECT); + } + private static OSGi<?> whiteboardApplications( ServiceReference<?> jaxRsRuntimeServiceReference, AriesJaxRSServiceRuntime runtime, @@ -327,10 +347,10 @@ public class Whiteboard { AriesJaxRSServiceRuntime runtime) { return - serviceReferences(getExtensionFilter()). + serviceReferences(getExtensionsFilter()). filter(new TargetFilter<>(jaxRsRuntimeServiceReference)). flatMap(ref -> - waitForExtensionDependencies(ref, + waitForExtensionDependencies(ref, runtime, safeRegisterExtension( ref, DEFAULT_NAME, defaultServiceRegistrator, runtime) ).foreach( @@ -346,14 +366,13 @@ public class Whiteboard { AriesJaxRSServiceRuntime runtime) { return - serviceReferences(getSingletonsFilter()). + serviceReferences(getResourcesFilter()). filter(new TargetFilter<>(jaxRsRuntimeServiceReference)). flatMap(ref -> waitForExtensionDependencies( - ref, + ref, runtime, safeRegisterEndpoint( - ref, DEFAULT_NAME, defaultServiceRegistrator, - runtime) + ref, DEFAULT_NAME, defaultServiceRegistrator, runtime) ).foreach( __ -> runtime.addApplicationEndpoint(DEFAULT_NAME, ref), __ -> runtime.removeApplicationExtension(DEFAULT_NAME, ref)
