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 16:38:32 UTC
[2/4] aries-jax-rs-whiteboard git commit: Reorganize Utils and
Whiteboard methods
Reorganize Utils and Whiteboard methods
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/8a076268
Tree: http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/tree/8a076268
Diff: http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/diff/8a076268
Branch: refs/heads/master
Commit: 8a076268716d7096423251bca36a319f7ce00a3c
Parents: 72ea289
Author: Carlos Sierra <cs...@apache.org>
Authored: Fri Aug 25 17:56:34 2017 +0200
Committer: Carlos Sierra <cs...@apache.org>
Committed: Fri Aug 25 18:04:43 2017 +0200
----------------------------------------------------------------------
.../aries/jax/rs/whiteboard/internal/Utils.java | 319 ++++----------
.../jax/rs/whiteboard/internal/Whiteboard.java | 424 ++++++++++++-------
2 files changed, 344 insertions(+), 399 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/8a076268/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 e013c14..29dead9 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
@@ -19,19 +19,15 @@ package org.apache.aries.jax.rs.whiteboard.internal;
import org.apache.aries.osgi.functional.Event;
import org.apache.aries.osgi.functional.OSGi;
-import org.apache.cxf.Bus;
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.whiteboard.JaxRSWhiteboardConstants;
-import javax.ws.rs.core.Application;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.NavigableSet;
-import java.util.SortedSet;
import java.util.TreeSet;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Consumer;
@@ -41,7 +37,6 @@ import static org.apache.aries.osgi.functional.OSGi.bundleContext;
import static org.apache.aries.osgi.functional.OSGi.just;
import static org.apache.aries.osgi.functional.OSGi.nothing;
import static org.apache.aries.osgi.functional.OSGi.onClose;
-import static org.apache.aries.osgi.functional.OSGi.register;
/**
* @author Carlos Sierra Andrés
@@ -75,168 +70,6 @@ public class Utils {
return properties;
}
- public static <T> OSGi<T> service(ServiceReference<T> serviceReference) {
- return
- bundleContext().flatMap(bundleContext ->
- onClose(() -> bundleContext.ungetService(serviceReference)).then(
- just(bundleContext.getService(serviceReference))
- ));
- }
-
- public static <T> OSGi<ServiceObjects<T>> serviceObjects(
- ServiceReference<T> serviceReference) {
-
- return
- bundleContext().flatMap(bundleContext ->
- just(bundleContext.getServiceObjects(serviceReference))
- );
- }
-
- public static OSGi<?> deployRegistrator(
- Bus bus, ServiceTuple<Application> tuple, Map<String, Object> props,
- AriesJaxRSServiceRuntime runtime) {
-
- try {
- CXFJaxRsServiceRegistrator registrator =
- new CXFJaxRsServiceRegistrator(bus, tuple.getService());
-
- return
- onClose(registrator::close).then(
- register(CXFJaxRsServiceRegistrator.class, registrator, props)
- );
- }
- catch (Exception e) {
- ServiceReference<Application> serviceReference =
- tuple.getServiceReference();
-
- runtime.addErroredApplication(serviceReference);
-
- return onClose(
- () -> runtime.removeErroredApplication(serviceReference)
- ).then(
- nothing()
- );
- }
- }
-
- public static OSGi<?> safeRegisterExtension(
- 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"));
-
- return
- onlyGettables(
- just(serviceReference),
- runtime::addNotGettableExtension,
- runtime::removeNotGettableExtension
- ).foreach(
- registrator::addProvider,
- registrator::removeProvider
- ).foreach(
- __ -> runtime.addApplicationExtension(
- applicationName, serviceReference),
- __ -> runtime.removeApplicationExtension(
- applicationName, serviceReference)
- ).then(
- register(
- ApplicationExtensionRegistration.class,
- new ApplicationExtensionRegistration(){}, properties)
- );
- }
-
- public static <T> OSGi<?> safeRegisterEndpoint(
- ServiceReference<T> serviceReference,
- String applicationName,
- CXFJaxRsServiceRegistrator registrator,
- AriesJaxRSServiceRuntime runtime) {
-
- return
- onlyGettables(
- just(serviceReference),
- runtime::addNotGettableEndpoint,
- runtime::removeNotGettableEndpoint
- ).flatMap(
- tuple -> serviceObjects(serviceReference).flatMap(
- serviceObjects -> registerEndpoint(
- registrator, serviceObjects).flatMap(
- resourceProvider ->
- onClose(
- () -> unregisterEndpoint(
- registrator, resourceProvider)
- )
- )
- )
- ).foreach(
- __ -> runtime.addApplicationEndpoint(
- applicationName, serviceReference),
- __ -> runtime.removeApplicationEndpoint(
- applicationName, serviceReference)
- );
- }
-
- public static <T extends Comparable<? super T>> OSGi<T> repeatInOrder(
- OSGi<T> program) {
-
- return program.route(new RepeatInOrderRouter<>());
- }
-
- public static <T> OSGi<ServiceTuple<T>> onlyGettables(
- OSGi<ServiceReference<T>> program,
- Consumer<ServiceReference<T>> whenAddedNotGettable,
- Consumer<ServiceReference<T>> whenLeavingNotGettable) {
-
- return bundleContext().flatMap(bundleContext ->
- program.flatMap(serviceReference -> {
- T service = null;
-
- try {
- service = bundleContext.getService(serviceReference);
- }
- catch (Exception e){
- }
- if (service == null) {
- whenAddedNotGettable.accept(serviceReference);
-
- return
- onClose(
- () -> whenLeavingNotGettable.accept(
- serviceReference)
- ).then(
- nothing()
- );
- }
- return
- onClose(
- () -> bundleContext.ungetService(serviceReference)
- ).then(
- just(new ServiceTuple<>(serviceReference, service))
- );
- }
- ));
- }
-
- public static <T> OSGi<ResourceProvider>
- registerEndpoint(
- CXFJaxRsServiceRegistrator registrator,
- ServiceObjects<T> serviceObjects) {
-
- ResourceProvider resourceProvider = getResourceProvider(serviceObjects);
- registrator.add(resourceProvider);
- return just(resourceProvider);
- }
-
- public static String safeToString(Object object) {
- return object == null ? "" : object.toString();
- }
-
public static <T> ResourceProvider getResourceProvider(
ServiceObjects<T> serviceObjects) {
@@ -245,56 +78,6 @@ public class Utils {
return new ComparableResourceProvider(serviceReference, serviceObjects);
}
- public static void unregisterEndpoint(
- CXFJaxRsServiceRegistrator registrator,
- ResourceProvider resourceProvider) {
-
- registrator.remove(resourceProvider);
- }
-
- private static class RepeatInOrderRouter<T extends Comparable<? super T>>
- implements Consumer<OSGi.Router<T>> {
-
- private final TreeSet<Event<T>> _treeSet;
-
- public RepeatInOrderRouter() {
- Comparator<Event<T>> comparing = Comparator.comparing(
- Event::getContent);
-
- _treeSet = new TreeSet<>(comparing.reversed());
- }
-
- @Override
- public void accept(OSGi.Router<T> router) {
- router.onIncoming(ev -> {
- _treeSet.add(ev);
-
- SortedSet<Event<T>> events = _treeSet.tailSet(ev, false);
- events.forEach(router::signalLeave);
-
- router.signalAdd(ev);
-
- events.forEach(router::signalAdd);
- });
- router.onLeaving(ev -> {
- _treeSet.remove(ev);
-
- SortedSet<Event<T>> events = _treeSet.tailSet(ev, false);
- events.forEach(router::signalLeave);
-
- router.signalLeave(ev);
-
- events.forEach(router::signalAdd);
- });
- router.onClose(() -> {
- _treeSet.forEach(router::signalLeave);
-
- _treeSet.clear();
- });
- }
-
- }
-
public static <K, T extends Comparable<? super T>> OSGi<T> highestPer(
Function<T, K> keySupplier, OSGi<T> program,
Consumer<T> onAddingShadowed, Consumer<T> onRemovedShadowed) {
@@ -362,11 +145,80 @@ public class Utils {
);
}
+ public static <T> OSGi<ServiceTuple<T>> onlyGettables(
+ OSGi<ServiceReference<T>> program,
+ Consumer<ServiceReference<T>> whenAddedNotGettable,
+ Consumer<ServiceReference<T>> whenLeavingNotGettable) {
+
+ return bundleContext().flatMap(bundleContext ->
+ program.flatMap(serviceReference -> {
+ T service = null;
+
+ try {
+ service = bundleContext.getService(serviceReference);
+ }
+ catch (Exception e){
+ }
+ if (service == null) {
+ whenAddedNotGettable.accept(serviceReference);
+
+ return
+ onClose(
+ () -> whenLeavingNotGettable.accept(
+ serviceReference)
+ ).then(
+ nothing()
+ );
+ }
+ return
+ onClose(
+ () -> bundleContext.ungetService(serviceReference)
+ ).then(
+ just(new ServiceTuple<>(serviceReference, service))
+ );
+ }
+ ));
+ }
+
+ public static <T> OSGi<T> service(ServiceReference<T> serviceReference) {
+ return
+ bundleContext().flatMap(bundleContext ->
+ onClose(() -> bundleContext.ungetService(serviceReference)).then(
+ just(bundleContext.getService(serviceReference))
+ ));
+ }
+
+ public static <T> OSGi<ServiceObjects<T>> serviceObjects(
+ ServiceReference<T> serviceReference) {
+
+ return
+ bundleContext().flatMap(bundleContext ->
+ just(bundleContext.getServiceObjects(serviceReference))
+ );
+ }
+
+ public static void unregisterEndpoint(
+ CXFJaxRsServiceRegistrator registrator,
+ ResourceProvider resourceProvider) {
+
+ registrator.remove(resourceProvider);
+ }
+
+ static OSGi<Void> ignore(OSGi<?> program) {
+ return program.map(t -> null);
+ }
+
+ public interface PropertyHolder {
+ Object get(String propertyName);
+ }
+
+ public interface ApplicationExtensionRegistration {}
+
public static class ComparableResourceProvider
implements ResourceProvider, Comparable<ComparableResourceProvider> {
- private ServiceReference<?> _serviceReference;
private final ServiceObjects<?> _serviceObjects;
+ private ServiceReference<?> _serviceReference;
public ComparableResourceProvider(
ServiceReference<?> serviceReference,
@@ -422,19 +274,17 @@ public class Utils {
_service = service;
}
+ public T getService() {
+ return _service;
+ }
+
@Override
public int compareTo(ServiceTuple<T> o) {
return _serviceReference.compareTo(o._serviceReference);
}
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
-
- ServiceTuple<?> that = (ServiceTuple<?>) o;
-
- return _serviceReference.equals(that._serviceReference);
+ public ServiceReference<T> getServiceReference() {
+ return _serviceReference;
}
@Override
@@ -442,19 +292,16 @@ public class Utils {
return _serviceReference.hashCode();
}
- public ServiceReference<T> getServiceReference() {
- return _serviceReference;
- }
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
- public T getService() {
- return _service;
+ ServiceTuple<?> that = (ServiceTuple<?>) o;
+
+ return _serviceReference.equals(that._serviceReference);
}
- }
- public interface PropertyHolder {
- Object get(String propertyName);
}
- public interface ApplicationExtensionRegistration {}
-
}
http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/8a076268/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 a2f5b25..3b6abef 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
@@ -23,11 +23,13 @@ import org.apache.aries.jax.rs.whiteboard.internal.Utils.ServiceTuple;
import org.apache.aries.osgi.functional.OSGi;
import org.apache.cxf.Bus;
import org.apache.cxf.bus.extension.ExtensionManagerBus;
+import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;
import org.apache.cxf.transport.servlet.CXFNonSpringServlet;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.osgi.framework.Filter;
import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceObjects;
import org.osgi.framework.ServiceReference;
import org.osgi.framework.ServiceRegistration;
import org.osgi.framework.wiring.BundleWiring;
@@ -62,14 +64,14 @@ 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.canonicalize;
-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.getResourceProvider;
import static org.apache.aries.jax.rs.whiteboard.internal.Utils.highestPer;
+import static org.apache.aries.jax.rs.whiteboard.internal.Utils.ignore;
import static org.apache.aries.jax.rs.whiteboard.internal.Utils.onlyGettables;
-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.service;
+import static org.apache.aries.jax.rs.whiteboard.internal.Utils.serviceObjects;
import static org.apache.aries.osgi.functional.OSGi.all;
import static org.apache.aries.osgi.functional.OSGi.bundleContext;
import static org.apache.aries.osgi.functional.OSGi.just;
@@ -119,6 +121,17 @@ public class Whiteboard {
public static final String DEFAULT_NAME = ".default";
+ public static OSGi<ApplicationReference> allApplicationReferences() {
+ return
+ serviceReferences(CXFJaxRsServiceRegistrator.class).
+ flatMap(registratorReference ->
+ just(getApplicationName(registratorReference::getProperty)).
+ flatMap(applicationName ->
+ service(registratorReference).flatMap(registrator ->
+ just(new ApplicationReference(applicationName, registrator))
+ )));
+ }
+
public static OSGi<?> createWhiteboard(Dictionary<String, ?> configuration) {
AriesJaxRSServiceRuntime runtime = new AriesJaxRSServiceRuntime();
@@ -148,8 +161,108 @@ public class Whiteboard {
))))));
}
- private static OSGi<Void> ignore(OSGi<?> program) {
- return program.map(t -> null);
+ public static OSGi<?> deployRegistrator(
+ Bus bus, ServiceTuple<Application> tuple, Map<String, Object> props,
+ AriesJaxRSServiceRuntime runtime) {
+
+ try {
+ CXFJaxRsServiceRegistrator registrator =
+ new CXFJaxRsServiceRegistrator(bus, tuple.getService());
+
+ return
+ onClose(registrator::close).then(
+ register(CXFJaxRsServiceRegistrator.class, registrator, props)
+ );
+ }
+ catch (Exception e) {
+ ServiceReference<Application> serviceReference =
+ tuple.getServiceReference();
+
+ runtime.addErroredApplication(serviceReference);
+
+ return onClose(
+ () -> runtime.removeErroredApplication(serviceReference)
+ ).then(
+ nothing()
+ );
+ }
+ }
+
+ public static String getApplicationBase(PropertyHolder properties) {
+ return properties.get(JAX_RS_APPLICATION_BASE).toString();
+ }
+
+ public static <T> OSGi<ResourceProvider>
+ registerEndpoint(
+ CXFJaxRsServiceRegistrator registrator,
+ ServiceObjects<T> serviceObjects) {
+
+ ResourceProvider resourceProvider = getResourceProvider(serviceObjects);
+ registrator.add(resourceProvider);
+ return just(resourceProvider);
+ }
+
+ public static <T> OSGi<?> safeRegisterEndpoint(
+ ServiceReference<T> serviceReference,
+ String applicationName,
+ CXFJaxRsServiceRegistrator registrator,
+ AriesJaxRSServiceRuntime runtime) {
+
+ return
+ onlyGettables(
+ just(serviceReference),
+ runtime::addNotGettableEndpoint,
+ runtime::removeNotGettableEndpoint
+ ).flatMap(
+ tuple -> serviceObjects(serviceReference).flatMap(
+ serviceObjects -> registerEndpoint(
+ registrator, serviceObjects).flatMap(
+ resourceProvider ->
+ onClose(
+ () -> Utils.unregisterEndpoint(
+ registrator, resourceProvider)
+ )
+ )
+ )
+ ).foreach(
+ __ -> runtime.addApplicationEndpoint(
+ applicationName, serviceReference),
+ __ -> runtime.removeApplicationEndpoint(
+ applicationName, serviceReference)
+ );
+ }
+
+ public static OSGi<?> safeRegisterExtension(
+ ServiceReference<?> serviceReference, String applicationName,
+ CXFJaxRsServiceRegistrator registrator,
+ AriesJaxRSServiceRuntime runtime) {
+
+ Map<String, Object> properties = getProperties(serviceReference);
+
+ properties.put(
+ JAX_RS_NAME, applicationName);
+ properties.put(
+ "original.objectClass",
+ serviceReference.getProperty("objectClass"));
+
+ return
+ onlyGettables(
+ just(serviceReference),
+ runtime::addNotGettableExtension,
+ runtime::removeNotGettableExtension
+ ).foreach(
+ registrator::addProvider,
+ registrator::removeProvider
+ ).foreach(
+ __ -> runtime.addApplicationExtension(
+ applicationName, serviceReference),
+ __ -> runtime.removeApplicationExtension(
+ applicationName, serviceReference)
+ ).then(
+ register(
+ ApplicationExtensionRegistration.class,
+ new ApplicationExtensionRegistration(){}, properties)
+ );
}
private static OSGi<Collection<String>> bestEffortCalculationOfEnpoints(Filter filter) {
@@ -168,6 +281,35 @@ public class Whiteboard {
);
}
+ private static OSGi<ApplicationReference> chooseApplication(
+ ServiceReference<?> serviceReference, OSGi<ApplicationReference> theDefault) {
+
+ Object applicationSelectProperty = serviceReference.getProperty(
+ JAX_RS_APPLICATION_SELECT);
+
+ if (applicationSelectProperty == null) {
+ return theDefault;
+ }
+
+ String applicationName = getApplicationName(
+ serviceReference::getProperty);
+
+ return
+ serviceReferences(
+ CXFJaxRsServiceRegistrator.class,
+ applicationSelectProperty.toString()).
+ flatMap(registratorReference ->
+ service(registratorReference).flatMap(registrator ->
+ just(new ApplicationReference(applicationName, registrator))
+ ));
+ }
+
+ private static <T> OSGi<T> countChanges(
+ OSGi<T> program, ChangeCounter counter) {
+
+ return program.map(t -> {counter.inc(); return t;});
+ }
+
private static ExtensionManagerBus createBus(
BundleContext bundleContext, Map<String, ?> configuration) {
@@ -188,6 +330,12 @@ public class Whiteboard {
return bus;
}
+ private static CXFNonSpringServlet createCXFServlet(Bus bus) {
+ CXFNonSpringServlet cxfNonSpringServlet = new CXFNonSpringServlet();
+ cxfNonSpringServlet.setBus(bus);
+ return cxfNonSpringServlet;
+ }
+
private static OSGi<ApplicationReference>
createDefaultJaxRsServiceRegistrator(
Map<String, ?> configuration, AriesJaxRSServiceRuntime runtime) {
@@ -209,10 +357,49 @@ public class Whiteboard {
))));
}
+ private static OSGi<ServiceTuple<Application>> deployApplication(
+ Map<String, ?> configuration, BundleContext bundleContext,
+ ServiceTuple<Application> tuple, AriesJaxRSServiceRuntime runtime) {
+
+ ExtensionManagerBus bus = createBus(bundleContext, configuration);
+
+ ServiceReference<Application> serviceReference =
+ tuple.getServiceReference();
+
+ Map<String, Object> properties = getProperties(serviceReference);
+
+ properties.computeIfAbsent(
+ JAX_RS_NAME, (__) -> generateApplicationName(
+ serviceReference::getProperty));
+
+ return
+ deployRegistrator(bus, tuple, properties, runtime).then(
+ registerCXFServletService(
+ bus, getApplicationBase(properties::get), properties)).then(
+ just(tuple)
+ );
+ }
+
+ private static String getApplicationExtensionsFilter() {
+ return format(
+ "(&(!(objectClass=%s))(%s=%s)%s)",
+ ApplicationExtensionRegistration.class.getName(),
+ JAX_RS_EXTENSION, true, getExtensionsFilter());
+ }
+
private static String getApplicationFilter() {
return format("(%s=*)", JAX_RS_APPLICATION_BASE);
}
+ private static OSGi<ServiceReference<Application>>
+ getApplicationsForWhiteboard(
+ ServiceReference<?> jaxRsRuntimeServiceReference) {
+
+ return
+ serviceReferences(Application.class, getApplicationFilter()).
+ filter(new TargetFilter<>(jaxRsRuntimeServiceReference));
+ }
+
private static String getExtensionsFilter() {
return format("(%s=true)", JAX_RS_EXTENSION);
}
@@ -221,6 +408,45 @@ public class Whiteboard {
return format("(%s=true)", JAX_RS_RESOURCE);
}
+ private static OSGi<ServiceReference<Object>> onlySupportedInterfaces(
+ OSGi<ServiceReference<Object>> program,
+ Consumer<ServiceReference<?>> onInvalidAdded,
+ Consumer<ServiceReference<?>> onInvalidRemoved) {
+
+ return program.flatMap(sr -> {
+ if (signalsValidInterface(sr)) {
+ return just(sr);
+ }
+ else {
+ onInvalidAdded.accept(sr);
+ return
+ onClose(() -> onInvalidRemoved.accept(sr)).then(nothing());
+ }
+ });
+ }
+
+ private static OSGi<ServiceRegistration<Servlet>> registerCXFServletService(
+ Bus bus, String address, Map<String, ?> configuration) {
+
+ Map<String, Object> properties = new HashMap<>(configuration);
+
+ properties.putIfAbsent(
+ HTTP_WHITEBOARD_TARGET, "(osgi.http.endpoint=*)");
+
+ properties.putIfAbsent(
+ HTTP_WHITEBOARD_CONTEXT_SELECT,
+ format(
+ "(%s=%s)",
+ HTTP_WHITEBOARD_CONTEXT_NAME,
+ HTTP_WHITEBOARD_DEFAULT_CONTEXT_NAME));
+
+ properties.putIfAbsent(HTTP_WHITEBOARD_SERVLET_PATTERN, address + "/*");
+
+ CXFNonSpringServlet cxfNonSpringServlet = createCXFServlet(bus);
+
+ return register(Servlet.class, cxfNonSpringServlet, properties);
+ }
+
private static OSGi<ServiceRegistration<?>>
registerJaxRSServiceRuntime(
JaxRSServiceRuntime runtime,
@@ -257,6 +483,16 @@ public class Whiteboard {
);
}
+ private static boolean signalsValidInterface(
+ ServiceReference<Object> serviceReference) {
+
+ String[] objectClasses = canonicalize(serviceReference.getProperty(
+ "objectClass"));
+
+ return Arrays.stream(objectClasses).
+ anyMatch(SUPPORTED_EXTENSION_INTERFACES::contains);
+ }
+
private static OSGi<?> waitForExtensionDependencies(
BundleContext bundleContext,
ServiceReference<?> serviceReference,
@@ -293,7 +529,7 @@ public class Whiteboard {
then(program);
}
catch (InvalidSyntaxException e) {
-
+
}
}
@@ -304,28 +540,6 @@ public class Whiteboard {
return program;
}
- private static OSGi<?> whiteBoardApplicationResources(
- BundleContext bundleContext,
- ServiceReference<?> jaxRsRuntimeServiceReference,
- ApplicationReference defaultApplicationReference,
- AriesJaxRSServiceRuntime runtime) {
- return
- serviceReferences(getResourcesFilter()).
- filter(new TargetFilter<>(jaxRsRuntimeServiceReference)).
- flatMap(resourceReference ->
- chooseApplication(
- resourceReference, just(defaultApplicationReference)).
- flatMap(applicationReference ->
- waitForExtensionDependencies(
- bundleContext, resourceReference, applicationReference,
- runtime,
- safeRegisterEndpoint(
- resourceReference,
- applicationReference.getApplicationName(),
- applicationReference.getRegistrator(), runtime)
- )));
- }
-
private static OSGi<?> whiteBoardApplicationExtensions(
BundleContext bundleContext,
ServiceReference<?> jaxRsRuntimeServiceReference,
@@ -352,74 +566,28 @@ public class Whiteboard {
)));
}
- private static OSGi<ServiceReference<Object>> onlySupportedInterfaces(
- OSGi<ServiceReference<Object>> program,
- Consumer<ServiceReference<?>> onInvalidAdded,
- Consumer<ServiceReference<?>> onInvalidRemoved) {
-
- return program.flatMap(sr -> {
- if (signalsValidInterface(sr)) {
- return just(sr);
- }
- else {
- onInvalidAdded.accept(sr);
- return
- onClose(() -> onInvalidRemoved.accept(sr)).then(nothing());
- }
- });
- }
-
- private static boolean signalsValidInterface(
- ServiceReference<Object> serviceReference) {
-
- String[] objectClasses = canonicalize(serviceReference.getProperty(
- "objectClass"));
-
- return Arrays.stream(objectClasses).
- anyMatch(SUPPORTED_EXTENSION_INTERFACES::contains);
- }
-
- private static OSGi<ApplicationReference> chooseApplication(
- ServiceReference<?> serviceReference, OSGi<ApplicationReference> theDefault) {
-
- Object applicationSelectProperty = serviceReference.getProperty(
- JAX_RS_APPLICATION_SELECT);
-
- if (applicationSelectProperty == null) {
- return theDefault;
- }
-
- String applicationName = getApplicationName(
- serviceReference::getProperty);
-
- return
- serviceReferences(
- CXFJaxRsServiceRegistrator.class,
- applicationSelectProperty.toString()).
- flatMap(registratorReference ->
- service(registratorReference).flatMap(registrator ->
- just(new ApplicationReference(applicationName, registrator))
- ));
- }
-
- public static OSGi<ApplicationReference> allApplicationReferences() {
+ private static OSGi<?> whiteBoardApplicationResources(
+ BundleContext bundleContext,
+ ServiceReference<?> jaxRsRuntimeServiceReference,
+ ApplicationReference defaultApplicationReference,
+ AriesJaxRSServiceRuntime runtime) {
return
- serviceReferences(CXFJaxRsServiceRegistrator.class).
- flatMap(registratorReference ->
- just(getApplicationName(registratorReference::getProperty)).
- flatMap(applicationName ->
- service(registratorReference).flatMap(registrator ->
- just(new ApplicationReference(applicationName, registrator))
+ serviceReferences(getResourcesFilter()).
+ filter(new TargetFilter<>(jaxRsRuntimeServiceReference)).
+ flatMap(resourceReference ->
+ chooseApplication(
+ resourceReference, just(defaultApplicationReference)).
+ flatMap(applicationReference ->
+ waitForExtensionDependencies(
+ bundleContext, resourceReference, applicationReference,
+ runtime,
+ safeRegisterEndpoint(
+ resourceReference,
+ applicationReference.getApplicationName(),
+ applicationReference.getRegistrator(), runtime)
)));
}
- private static String getApplicationExtensionsFilter() {
- return format(
- "(&(!(objectClass=%s))(%s=%s)%s)",
- ApplicationExtensionRegistration.class.getName(),
- JAX_RS_EXTENSION, true, getExtensionsFilter());
- }
-
private static OSGi<?> whiteboardApplications(
ServiceReference<?> jaxRsRuntimeServiceReference,
AriesJaxRSServiceRuntime runtime,
@@ -455,85 +623,19 @@ public class Whiteboard {
);
}
- private static OSGi<ServiceTuple<Application>> deployApplication(
- Map<String, ?> configuration, BundleContext bundleContext,
- ServiceTuple<Application> tuple, AriesJaxRSServiceRuntime runtime) {
-
- ExtensionManagerBus bus = createBus(bundleContext, configuration);
-
- ServiceReference<Application> serviceReference =
- tuple.getServiceReference();
-
- Map<String, Object> properties = getProperties(serviceReference);
-
- properties.computeIfAbsent(
- JAX_RS_NAME, (__) -> generateApplicationName(
- serviceReference::getProperty));
-
- return
- deployRegistrator(bus, tuple, properties, runtime).then(
- registerCXFServletService(
- bus, getApplicationBase(properties::get), properties)).then(
- just(tuple)
- );
- }
-
- private static OSGi<ServiceReference<Application>>
- getApplicationsForWhiteboard(
- ServiceReference<?> jaxRsRuntimeServiceReference) {
-
- return
- serviceReferences(Application.class, getApplicationFilter()).
- filter(new TargetFilter<>(jaxRsRuntimeServiceReference));
- }
-
- private static <T> OSGi<T> countChanges(
- OSGi<T> program, ChangeCounter counter) {
-
- return program.map(t -> {counter.inc(); return t;});
- }
-
private static interface ChangeCounter {
public void inc();
}
- private static OSGi<ServiceRegistration<Servlet>> registerCXFServletService(
- Bus bus, String address, Map<String, ?> configuration) {
-
- Map<String, Object> properties = new HashMap<>(configuration);
-
- properties.putIfAbsent(
- HTTP_WHITEBOARD_TARGET, "(osgi.http.endpoint=*)");
-
- properties.putIfAbsent(
- HTTP_WHITEBOARD_CONTEXT_SELECT,
- format(
- "(%s=%s)",
- HTTP_WHITEBOARD_CONTEXT_NAME,
- HTTP_WHITEBOARD_DEFAULT_CONTEXT_NAME));
-
- properties.putIfAbsent(HTTP_WHITEBOARD_SERVLET_PATTERN, address + "/*");
-
- CXFNonSpringServlet cxfNonSpringServlet = createCXFServlet(bus);
-
- return register(Servlet.class, cxfNonSpringServlet, properties);
- }
-
- private static CXFNonSpringServlet createCXFServlet(Bus bus) {
- CXFNonSpringServlet cxfNonSpringServlet = new CXFNonSpringServlet();
- cxfNonSpringServlet.setBus(bus);
- return cxfNonSpringServlet;
- }
-
private static class ServiceRegistrationChangeCounter
implements ChangeCounter{
private static final String changecount = "service.changecount";
private final AtomicLong _atomicLong = new AtomicLong();
- private ServiceRegistration<?> _serviceRegistration;
private final Hashtable<String, Object> _properties;
+ private ServiceRegistration<?> _serviceRegistration;
public ServiceRegistrationChangeCounter(
ServiceRegistration<?> serviceRegistration) {
@@ -565,10 +667,6 @@ public class Whiteboard {
}
}
- public static String getApplicationBase(PropertyHolder properties) {
- return properties.get(JAX_RS_APPLICATION_BASE).toString();
- }
-
private static class ApplicationReference {
private final String _applicationName;
private final CXFJaxRsServiceRegistrator _registrator;