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 2018/01/30 13:27:27 UTC
[3/3] aries-jax-rs-whiteboard git commit: First implementation of
PromisesRxInvoker
First implementation of PromisesRxInvoker
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/7c78ffda
Tree: http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/tree/7c78ffda
Diff: http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/diff/7c78ffda
Branch: refs/heads/master
Commit: 7c78ffdad7a342734f6e678543d8e74508251758
Parents: 0079ab1
Author: Carlos Sierra <cs...@apache.org>
Authored: Tue Jan 30 14:26:05 2018 +0100
Committer: Carlos Sierra <cs...@apache.org>
Committed: Tue Jan 30 14:26:05 2018 +0100
----------------------------------------------------------------------
jax-rs.itests/src/main/java/test/JaxrsTest.java | 41 +++++
jax-rs.whiteboard/pom.xml | 5 +
.../internal/client/ClientBuilderFactory.java | 4 +-
.../internal/client/PromiseRxInvokerImpl.java | 172 +++++++++++++++++++
.../client/PromiseRxInvokerProviderImpl.java | 52 ++++++
5 files changed, 273 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/7c78ffda/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 d2aa9f3..da66980 100644
--- a/jax-rs.itests/src/main/java/test/JaxrsTest.java
+++ b/jax-rs.itests/src/main/java/test/JaxrsTest.java
@@ -21,6 +21,7 @@ import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertTrue;
import static org.osgi.service.jaxrs.whiteboard.JaxrsWhiteboardConstants.*;
+import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -47,6 +48,7 @@ import org.osgi.framework.PrototypeServiceFactory;
import org.osgi.framework.ServiceFactory;
import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.jaxrs.client.PromiseRxInvoker;
import org.osgi.service.jaxrs.runtime.JaxrsServiceRuntime;
import org.osgi.service.jaxrs.runtime.dto.ApplicationDTO;
import org.osgi.service.jaxrs.runtime.dto.DTOConstants;
@@ -54,6 +56,7 @@ import org.osgi.service.jaxrs.runtime.dto.FailedApplicationDTO;
import org.osgi.service.jaxrs.runtime.dto.ResourceDTO;
import org.osgi.service.jaxrs.runtime.dto.ResourceMethodInfoDTO;
import org.osgi.service.jaxrs.runtime.dto.RuntimeDTO;
+import org.osgi.util.promise.Promise;
import org.osgi.util.tracker.ServiceTracker;
import test.types.ConfigurationAwareResource;
import test.types.TestAddon;
@@ -864,6 +867,44 @@ public class JaxrsTest extends TestHelper {
}
@Test
+ public void testAsyncResourceClientWithPromises()
+ throws ExecutionException, InterruptedException,
+ InvocationTargetException {
+
+ WebTarget webTarget =
+ createDefaultTarget().path("whiteboard").path("async").
+ path("HelloAsync");
+
+ AtomicBoolean pre = new AtomicBoolean();
+ AtomicBoolean post = new AtomicBoolean();
+
+ CountDownLatch countDownLatch = new CountDownLatch(1);
+
+ registerAddon(
+ new TestAsyncResource(
+ () -> pre.set(true),
+ () -> {
+ post.set(true);
+
+ countDownLatch.countDown();
+ }));
+
+ Promise<String> promise =
+ webTarget.
+ request().
+ rx(PromiseRxInvoker.class).
+ get(String.class);
+
+ String result = promise.getValue();
+
+ countDownLatch.await(1, TimeUnit.MINUTES);
+
+ assertTrue(post.get());
+
+ assertEquals("This should say HelloAsync", "HelloAsync", result);
+ }
+
+ @Test
public void testDefaultServiceReferencePropertiesAreAvailableInFeatures() {
AtomicBoolean executed = new AtomicBoolean();
AtomicReference<Object> propertyvalue = new AtomicReference<>();
http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/7c78ffda/jax-rs.whiteboard/pom.xml
----------------------------------------------------------------------
diff --git a/jax-rs.whiteboard/pom.xml b/jax-rs.whiteboard/pom.xml
index 3b807a8..d73148e 100644
--- a/jax-rs.whiteboard/pom.xml
+++ b/jax-rs.whiteboard/pom.xml
@@ -130,6 +130,11 @@
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.util.promise</artifactId>
+ <version>1.1.0-SNAPSHOT</version>
+ </dependency>
+ <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.2</version>
http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/7c78ffda/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/client/ClientBuilderFactory.java
----------------------------------------------------------------------
diff --git a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/client/ClientBuilderFactory.java b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/client/ClientBuilderFactory.java
index bbbc0ef..d98dc24 100644
--- a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/client/ClientBuilderFactory.java
+++ b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/client/ClientBuilderFactory.java
@@ -31,7 +31,9 @@ public class ClientBuilderFactory
public ClientBuilder getService(
Bundle bundle, ServiceRegistration<ClientBuilder> registration) {
- return new ClientBuilderImpl();
+ ClientBuilderImpl clientBuilder = new ClientBuilderImpl();
+
+ return clientBuilder.register(new PromiseRxInvokerProviderImpl());
}
@Override
http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/7c78ffda/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/client/PromiseRxInvokerImpl.java
----------------------------------------------------------------------
diff --git a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/client/PromiseRxInvokerImpl.java b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/client/PromiseRxInvokerImpl.java
new file mode 100644
index 0000000..b1ab900
--- /dev/null
+++ b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/client/PromiseRxInvokerImpl.java
@@ -0,0 +1,172 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.aries.jax.rs.whiteboard.internal.client;
+
+import org.osgi.service.jaxrs.client.PromiseRxInvoker;
+import org.osgi.util.promise.Promise;
+import org.osgi.util.promise.PromiseFactory;
+
+import javax.ws.rs.HttpMethod;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.client.SyncInvoker;
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.Response;
+
+class PromiseRxInvokerImpl implements PromiseRxInvoker {
+
+ public PromiseRxInvokerImpl(
+ SyncInvoker syncInvoker, PromiseFactory promiseFactory) {
+
+ _syncInvoker = syncInvoker;
+ _promiseFactory = promiseFactory;
+ }
+
+ @Override
+ public Promise<Response> delete() {
+ return method(HttpMethod.DELETE);
+ }
+
+ @Override
+ public <R> Promise<R> delete(Class<R> aClass) {
+ return method(HttpMethod.DELETE, aClass);
+ }
+
+ @Override
+ public <R> Promise<R> delete(GenericType<R> genericType) {
+ return method(HttpMethod.DELETE, genericType);
+ }
+
+ @Override
+ public Promise<Response> get() {
+ return method(HttpMethod.GET);
+ }
+
+ @Override
+ public <R> Promise<R> get(Class<R> aClass) {
+ return method(HttpMethod.GET, aClass);
+ }
+
+ @Override
+ public <R> Promise<R> get(GenericType<R> genericType) {
+ return method(HttpMethod.GET, genericType);
+ }
+
+ @Override
+ public Promise<Response> head() {
+ return method(HttpMethod.HEAD);
+ }
+
+ @Override
+ public <R> Promise<R> method(String s, Class<R> aClass) {
+ return _promiseFactory.submit(() -> _syncInvoker.method(s, aClass));
+ }
+
+ @Override
+ public <R> Promise<R> method(String s, Entity<?> entity, Class<R> aClass) {
+ return _promiseFactory.submit(
+ () -> _syncInvoker.method(s, entity, aClass));
+ }
+
+ @Override
+ public <R> Promise<R> method(
+ String s, Entity<?> entity, GenericType<R> genericType) {
+
+ return _promiseFactory.submit(
+ () -> _syncInvoker.method(s, entity, genericType));
+ }
+
+ @Override
+ public Promise<Response> method(String s, Entity<?> entity) {
+ return _promiseFactory.submit(() -> _syncInvoker.method(s, entity));
+ }
+
+ @Override
+ public <R> Promise<R> method(String s, GenericType<R> genericType) {
+ return _promiseFactory.submit(
+ () -> _syncInvoker.method(s, genericType));
+ }
+
+ @Override
+ public Promise<Response> method(String s) {
+ return _promiseFactory.submit(() -> _syncInvoker.method(s));
+ }
+
+ @Override
+ public Promise<Response> options() {
+ return method(HttpMethod.OPTIONS);
+ }
+
+ @Override
+ public <R> Promise<R> options(Class<R> aClass) {
+ return method(HttpMethod.OPTIONS, aClass);
+ }
+
+ @Override
+ public <R> Promise<R> options(GenericType<R> genericType) {
+ return method(HttpMethod.OPTIONS, genericType);
+ }
+
+ @Override
+ public <R> Promise<R> post(Entity<?> entity, Class<R> aClass) {
+ return method(HttpMethod.POST, entity, aClass);
+ }
+
+ @Override
+ public <R> Promise<R> post(Entity<?> entity, GenericType<R> genericType) {
+ return method(HttpMethod.POST, entity, genericType);
+ }
+
+ @Override
+ public Promise<Response> post(Entity<?> entity) {
+ return method(HttpMethod.POST, entity);
+ }
+
+ @Override
+ public <R> Promise<R> put(Entity<?> entity, Class<R> aClass) {
+ return method(HttpMethod.PUT, entity, aClass);
+ }
+
+ @Override
+ public <R> Promise<R> put(Entity<?> entity, GenericType<R> genericType) {
+ return method(HttpMethod.PUT, entity, genericType);
+ }
+
+ @Override
+ public Promise<Response> put(Entity<?> entity) {
+ return method(HttpMethod.PUT, entity);
+ }
+
+ @Override
+ public Promise<Response> trace() {
+ return method("TRACE", Response.class);
+ }
+
+ @Override
+ public <R> Promise<R> trace(Class<R> aClass) {
+ return method("TRACE", aClass);
+ }
+
+ @Override
+ public <R> Promise<R> trace(GenericType<R> genericType) {
+ return method("TRACE", genericType);
+ }
+
+ private final PromiseFactory _promiseFactory;
+ private final SyncInvoker _syncInvoker;
+
+}
http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/7c78ffda/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/client/PromiseRxInvokerProviderImpl.java
----------------------------------------------------------------------
diff --git a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/client/PromiseRxInvokerProviderImpl.java b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/client/PromiseRxInvokerProviderImpl.java
new file mode 100644
index 0000000..c8b36d1
--- /dev/null
+++ b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/client/PromiseRxInvokerProviderImpl.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.aries.jax.rs.whiteboard.internal.client;
+
+import org.osgi.service.jaxrs.client.PromiseRxInvoker;
+import org.osgi.util.promise.PromiseFactory;
+
+import javax.ws.rs.client.RxInvokerProvider;
+import javax.ws.rs.client.SyncInvoker;
+import java.util.concurrent.ExecutorService;
+
+public class PromiseRxInvokerProviderImpl
+ implements RxInvokerProvider<PromiseRxInvoker> {
+
+ @Override
+ public boolean isProviderFor(Class<?> clazz) {
+ return clazz == PromiseRxInvoker.class;
+ }
+
+ @Override
+ public PromiseRxInvoker getRxInvoker(
+ SyncInvoker syncInvoker, ExecutorService executorService) {
+
+ PromiseFactory promiseFactory;
+
+ if (executorService != null) {
+ promiseFactory = new PromiseFactory(executorService);
+ }
+ else {
+ promiseFactory = new PromiseFactory(
+ PromiseFactory.inlineExecutor());
+ }
+
+ return new PromiseRxInvokerImpl(syncInvoker, promiseFactory);
+ }
+
+}