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);
+    }
+
+}