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/03 16:50:31 UTC
aries-jax-rs-whiteboard git commit: First implementation of count
change
Repository: aries-jax-rs-whiteboard
Updated Branches:
refs/heads/master ee69fc90d -> 14019e2d5
First implementation of count change
To account for all the modification in each Runtime and update the
SERVICE_CHANGECOUNT property of the Runtime.
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/14019e2d
Tree: http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/tree/14019e2d
Diff: http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/diff/14019e2d
Branch: refs/heads/master
Commit: 14019e2d5adb7a61785215e1487c2e404e1d21d1
Parents: ee69fc9
Author: Carlos Sierra <cs...@apache.org>
Authored: Thu Aug 3 18:44:13 2017 +0200
Committer: Carlos Sierra <cs...@apache.org>
Committed: Thu Aug 3 18:50:06 2017 +0200
----------------------------------------------------------------------
.../main/java/test/WhiteboardFactoryTest.java | 49 ++++++++++++
.../jax/rs/whiteboard/internal/Whiteboard.java | 80 ++++++++++++++++++--
2 files changed, 121 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/14019e2d/jax-rs.itests/src/main/java/test/WhiteboardFactoryTest.java
----------------------------------------------------------------------
diff --git a/jax-rs.itests/src/main/java/test/WhiteboardFactoryTest.java b/jax-rs.itests/src/main/java/test/WhiteboardFactoryTest.java
index 810dcc2..b945eff 100644
--- a/jax-rs.itests/src/main/java/test/WhiteboardFactoryTest.java
+++ b/jax-rs.itests/src/main/java/test/WhiteboardFactoryTest.java
@@ -19,17 +19,26 @@ package test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.osgi.service.jaxrs.whiteboard.JaxRSWhiteboardConstants.JAX_RS_APPLICATION_BASE;
+import static org.osgi.service.jaxrs.whiteboard.JaxRSWhiteboardConstants.JAX_RS_RESOURCE;
+import java.util.Arrays;
+import java.util.Dictionary;
import java.util.Hashtable;
import org.junit.Test;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
import org.osgi.service.cm.Configuration;
import org.osgi.service.cm.ConfigurationAdmin;
import org.osgi.service.jaxrs.runtime.JaxRSServiceRuntime;
import org.osgi.util.tracker.ServiceTracker;
+import test.types.TestApplication;
+
+import javax.ws.rs.core.Application;
public class WhiteboardFactoryTest {
@@ -112,6 +121,46 @@ public class WhiteboardFactoryTest {
}
}
+ @Test
+ public void testChangeCount() throws Exception {
+ ServiceTracker<JaxRSServiceRuntime, JaxRSServiceRuntime> runtimeTracker =
+ new ServiceTracker<>(
+ bundleContext, JaxRSServiceRuntime.class, null);
+
+ try {
+ runtimeTracker.open();
+
+ JaxRSServiceRuntime runtime = runtimeTracker.waitForService(5000);
+
+ assertNotNull(runtime);
+
+ ServiceReference<JaxRSServiceRuntime> serviceReference = runtimeTracker.getServiceReference();
+
+ Long changeCount = (Long)serviceReference.getProperty("service.changecount");
+
+ Dictionary<String, Object> properties = new Hashtable<>();
+
+ properties.put(JAX_RS_APPLICATION_BASE, "/test-counter");
+
+ ServiceRegistration<?> serviceRegistration =
+ bundleContext.registerService(
+ Application.class, new TestApplication(), properties);
+
+ assertTrue(
+ changeCount < (Long)runtimeTracker.getServiceReference().getProperty("service.changecount"));
+
+ changeCount = (Long)serviceReference.getProperty("service.changecount");
+
+ serviceRegistration.unregister();
+
+ assertTrue(
+ changeCount < (Long)runtimeTracker.getServiceReference().getProperty("service.changecount"));
+ }
+ finally {
+ runtimeTracker.close();
+ }
+ }
+
private BundleContext bundleContext = FrameworkUtil.getBundle(getClass()).getBundleContext();
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/14019e2d/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 0f71906..e498e54 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
@@ -25,6 +25,7 @@ import org.osgi.framework.Constants;
import org.osgi.framework.Filter;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
import org.osgi.framework.wiring.BundleWiring;
import org.osgi.service.http.runtime.HttpServiceRuntime;
import org.osgi.service.jaxrs.runtime.JaxRSServiceRuntime;
@@ -35,7 +36,9 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.Dictionary;
import java.util.HashMap;
+import java.util.Hashtable;
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;
@@ -69,17 +72,20 @@ import static org.osgi.service.jaxrs.whiteboard.JaxRSWhiteboardConstants.JAX_RS_
*/
public class Whiteboard {
public static OSGi<Void> createWhiteboard(Dictionary<String, ?> configuration) {
+ AtomicLong changeCount = new AtomicLong();
+
return
bundleContext().flatMap(bundleContext ->
just(createBus(bundleContext, configuration)).flatMap(bus ->
just(createDefaultJaxRsServiceRegistrator(bus)).flatMap(defaultServiceRegistrator ->
+ registerJaxRSServiceRuntime(bundleContext, bus, Maps.from(configuration)).flatMap(registratorRegistration ->
+ just(new ServiceRegistrationChangeCounter(changeCount, "service.changecount", registratorRegistration)).flatMap(counter ->
all(
- registerJaxRSServiceRuntime(bundleContext, bus, Maps.from(configuration)),
- whiteboardApplications(bus),
- whiteBoardApplicationSingletons(),
- whiteboardExtensions(defaultServiceRegistrator),
- whiteboardSingletons(defaultServiceRegistrator)
- ))));
+ countChanges(whiteboardApplications(bus), counter),
+ countChanges(whiteBoardApplicationSingletons(), counter),
+ countChanges(whiteboardExtensions(defaultServiceRegistrator), counter),
+ countChanges(whiteboardSingletons(defaultServiceRegistrator), counter)
+ ))))));
}
private static OSGi<Collection<String>> bestEffortCalculationOfEnpoints(Filter filter) {
@@ -150,8 +156,9 @@ public class Whiteboard {
return format("(%s=true)", JAX_RS_RESOURCE);
}
- private static OSGi<?> registerJaxRSServiceRuntime(
- BundleContext bundleContext, Bus bus, Map<String, ?> configuration) {
+ private static OSGi<ServiceRegistration<?>>
+ registerJaxRSServiceRuntime(
+ BundleContext bundleContext, Bus bus, Map<String, ?> configuration) {
Map<String, Object> properties = new HashMap<>(configuration);
@@ -257,4 +264,61 @@ public class Whiteboard {
)
);
}
+
+ 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 class ServiceRegistrationChangeCounter
+ implements ChangeCounter{
+
+ private final AtomicLong _atomicLong;
+ private String _property;
+ private ServiceRegistration<?> _serviceRegistration;
+ private final Hashtable<String, Object> _properties;
+
+ public ServiceRegistrationChangeCounter(
+ AtomicLong atomicLong, String property,
+ ServiceRegistration<?> serviceRegistration) {
+
+ _atomicLong = atomicLong;
+ _property = property;
+ _serviceRegistration = serviceRegistration;
+
+ ServiceReference<?> serviceReference =
+ _serviceRegistration.getReference();
+
+ String[] propertyKeys = serviceReference.getPropertyKeys();
+
+ _properties = new Hashtable<>();
+
+ for (int i = 0; i < propertyKeys.length; i++) {
+ String propertyKey = propertyKeys[i];
+
+ _properties.put(
+ propertyKey, serviceReference.getProperty(propertyKey));
+ }
+ }
+
+ @Override
+ public void inc() {
+ long l = _atomicLong.incrementAndGet();
+
+ Hashtable<String, Object> properties =
+ (Hashtable<String, Object>)_properties.clone();
+
+ properties.put(_property, l);
+
+ _serviceRegistration.setProperties(properties);
+ }
+ }
+
}