You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2012/09/23 19:48:36 UTC

svn commit: r1389105 - in /cxf/trunk: rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.java

Author: sergeyb
Date: Sun Sep 23 17:48:36 2012
New Revision: 1389105

URL: http://svn.apache.org/viewvc?rev=1389105&view=rev
Log:
Adding an async() method to WebClient to keep the async related interface in line with jaxrs20

Modified:
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java
    cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.java

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java?rev=1389105&r1=1389104&r2=1389105&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java Sun Sep 23 17:48:36 2012
@@ -32,10 +32,13 @@ import java.util.Map;
 import java.util.concurrent.Future;
 
 import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.client.AsyncInvoker;
 import javax.ws.rs.client.ClientException;
+import javax.ws.rs.client.Entity;
 import javax.ws.rs.client.InvocationCallback;
 import javax.ws.rs.core.Cookie;
 import javax.ws.rs.core.EntityTag;
+import javax.ws.rs.core.GenericType;
 import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.MultivaluedMap;
@@ -88,28 +91,7 @@ public class WebClient extends AbstractC
     }
     
     
-    class ClientAsyncResponseInterceptor extends AbstractPhaseInterceptor<Message> {
-        public ClientAsyncResponseInterceptor() {
-            super(Phase.UNMARSHAL);
-        }
-
-        @Override
-        public void handleMessage(Message message) throws Fault {
-            if (message.getExchange().isSynchronous()) {
-                return;
-            }
-            handleAsyncResponse(message);
-        }
-
-        @Override
-        public void handleFault(Message message) {
-            if (message.getExchange().isSynchronous()) {
-                return;
-            }
-            handleAsyncFault(message);
-        }
-
-    }
+    
     
     /**
      * Creates WebClient
@@ -499,6 +481,12 @@ public class WebClient extends AbstractC
         return invoke("GET", null, responseClass);
     }
     
+    /**
+     * Does HTTP Async GET invocation and returns Future.
+     * Shortcut for async().get(InvocationCallback)
+     * @param callback invocation callback 
+     * @return the future
+     */
     public <T> Future<T> get(InvocationCallback<T> callback) {
         return doInvokeAsync("GET", null, null, null, callback);
     }
@@ -804,6 +792,7 @@ public class WebClient extends AbstractC
         }
         return null;
     }
+    
     protected <T> Future<T> doInvokeAsync(String httpMethod, 
                                           Object body, 
                                           Class<?> requestClass,
@@ -1048,4 +1037,239 @@ public class WebClient extends AbstractC
         }
         return clientState;
     }
+    
+    // Async related code, consider pushing most of it to AbstractClient
+    public AsyncInvoker async() {
+        return new AsyncInvokerImpl();
+    }
+    
+    class ClientAsyncResponseInterceptor extends AbstractPhaseInterceptor<Message> {
+        public ClientAsyncResponseInterceptor() {
+            super(Phase.UNMARSHAL);
+        }
+
+        @Override
+        public void handleMessage(Message message) throws Fault {
+            if (message.getExchange().isSynchronous()) {
+                return;
+            }
+            handleAsyncResponse(message);
+        }
+
+        @Override
+        public void handleFault(Message message) {
+            if (message.getExchange().isSynchronous()) {
+                return;
+            }
+            handleAsyncFault(message);
+        }
+
+    }
+    
+    class AsyncInvokerImpl implements AsyncInvoker {
+
+        @Override
+        public Future<Response> get() {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public <T> Future<T> get(Class<T> responseType) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public <T> Future<T> get(GenericType<T> responseType) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public <T> Future<T> get(InvocationCallback<T> callback) {
+            return doInvokeAsync("GET", null, null, null, callback);
+        }
+
+        @Override
+        public Future<Response> put(Entity<?> entity) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public <T> Future<T> put(Entity<?> entity, Class<T> responseType) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public <T> Future<T> put(Entity<?> entity, GenericType<T> responseType) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public <T> Future<T> put(Entity<?> entity, InvocationCallback<T> callback) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public Future<Response> post(Entity<?> entity) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public <T> Future<T> post(Entity<?> entity, Class<T> responseType) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public <T> Future<T> post(Entity<?> entity, GenericType<T> responseType) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public <T> Future<T> post(Entity<?> entity, InvocationCallback<T> callback) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public Future<Response> delete() {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public <T> Future<T> delete(Class<T> responseType) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public <T> Future<T> delete(GenericType<T> responseType) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public <T> Future<T> delete(InvocationCallback<T> callback) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public Future<Response> head() {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public Future<Response> head(InvocationCallback<Response> callback) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public Future<Response> options() {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public <T> Future<T> options(Class<T> responseType) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public <T> Future<T> options(GenericType<T> responseType) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public <T> Future<T> options(InvocationCallback<T> callback) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public Future<Response> trace() {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public <T> Future<T> trace(Class<T> responseType) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public <T> Future<T> trace(GenericType<T> responseType) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public <T> Future<T> trace(InvocationCallback<T> callback) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public Future<Response> method(String name) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public <T> Future<T> method(String name, Class<T> responseType) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public <T> Future<T> method(String name, GenericType<T> responseType) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public <T> Future<T> method(String name, InvocationCallback<T> callback) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public Future<Response> method(String name, Entity<?> entity) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public <T> Future<T> method(String name, Entity<?> entity, Class<T> responseType) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public <T> Future<T> method(String name, Entity<?> entity, GenericType<T> responseType) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public <T> Future<T> method(String name, Entity<?> entity, InvocationCallback<T> callback) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+        
+    }
 }

Modified: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.java?rev=1389105&r1=1389104&r2=1389105&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.java (original)
+++ cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.java Sun Sep 23 17:48:36 2012
@@ -60,10 +60,17 @@ public class JAXRS20ClientServerBookTest
         String address = "http://localhost:" + PORT + "/bookstore/bookheaders/simple";
         doTestBook(address);
     }
+    
     @Test
     public void testGetBookAsync() throws Exception {
         String address = "http://localhost:" + PORT + "/bookstore/bookheaders/simple";
-        doTestBookAsync(address);
+        doTestBookAsync(address, false);
+    }
+    
+    @Test
+    public void testGetBookAsyncInvoker() throws Exception {
+        String address = "http://localhost:" + PORT + "/bookstore/bookheaders/simple";
+        doTestBookAsync(address, true);
     }
     
     @Test
@@ -74,7 +81,7 @@ public class JAXRS20ClientServerBookTest
     @Test
     public void testGetBookWrongPathAsync() throws Exception {
         String address = "http://localhost:" + PORT + "/wrongpath";
-        doTestBookAsync(address);
+        doTestBookAsync(address, false);
     }
     
     private void doTestBook(String address) {
@@ -92,7 +99,10 @@ public class JAXRS20ClientServerBookTest
         assertEquals("serverWrite", response.getHeaderString("ServerWriterInterceptor"));
         assertEquals("http://localhost/redirect", response.getHeaderString(HttpHeaders.LOCATION));
     }
-    private void doTestBookAsync(String address) throws InterruptedException, ExecutionException {
+    
+    private void doTestBookAsync(String address, boolean asyncInvoker) 
+        throws InterruptedException, ExecutionException {
+        
         List<Object> providers = new ArrayList<Object>();
         providers.add(new ClientHeaderRequestFilter());
         providers.add(new ClientHeaderResponseFilter());
@@ -100,13 +110,15 @@ public class JAXRS20ClientServerBookTest
         WebClient.getConfig(wc).getHttpConduit().getClient().setReceiveTimeout(1000000L);
         
         final Holder<Book> holder = new Holder<Book>();
-        Future<Book> future = wc.get(new InvocationCallback<Book>() {
+        final InvocationCallback<Book> callback = new InvocationCallback<Book>() {
             public void completed(Book response) {
                 holder.value = response;
             }
             public void failed(ClientException error) {
             }
-        });
+        };
+        
+        Future<Book> future = asyncInvoker ? wc.async().get(callback) : wc.get(callback);
         Book book = future.get();
         assertSame(book, holder.value);
         assertEquals(124L, book.getId());