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 2013/02/22 13:48:42 UTC
svn commit: r1449019 - in /cxf/trunk:
rt/rs/client/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: Fri Feb 22 12:48:41 2013
New Revision: 1449019
URL: http://svn.apache.org/r1449019
Log:
[CXF-4848] Getting GenericEntity supported during async calls too
Modified:
cxf/trunk/rt/rs/client/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/rs/client/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java?rev=1449019&r1=1449018&r2=1449019&view=diff
==============================================================================
--- cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java (original)
+++ cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java Fri Feb 22 12:48:41 2013
@@ -388,7 +388,7 @@ public class WebClient extends AbstractC
* @return the future
*/
public <T> Future<T> post(Object body, InvocationCallback<T> callback) {
- return doInvokeAsyncCallback("POST", body, body.getClass(), body.getClass(), callback);
+ return doInvokeAsyncCallback("POST", body, body.getClass(), null, callback);
}
/**
@@ -409,7 +409,7 @@ public class WebClient extends AbstractC
* @return the future
*/
public <T> Future<T> put(Object body, InvocationCallback<T> callback) {
- return doInvokeAsyncCallback("PUT", body, body.getClass(), body.getClass(), callback);
+ return doInvokeAsyncCallback("PUT", body, body.getClass(), null, callback);
}
/**
@@ -832,6 +832,13 @@ public class WebClient extends AbstractC
Type outType,
InvocationCallback<T> callback) {
+ if (body instanceof GenericEntity) {
+ GenericEntity<?> genericEntity = (GenericEntity<?>)body;
+ body = genericEntity.getEntity();
+ requestClass = genericEntity.getRawType();
+ inType = getGenericEntityType(genericEntity, inType);
+ }
+
MultivaluedMap<String, String> headers = prepareHeaders(respClass, body);
resetResponse();
@@ -869,9 +876,23 @@ public class WebClient extends AbstractC
private void handleAsyncResponse(Message message) {
JaxrsClientCallback<?> cb = message.getExchange().get(JaxrsClientCallback.class);
- Response r = handleResponse(message.getExchange().getOutMessage(),
- cb.getResponseClass(),
- cb.getOutGenericType());
+ Response r = null;
+ try {
+ Object[] results = preProcessResult(message);
+ if (results != null && results.length == 1) {
+ r = (Response)results[0];
+ }
+ } catch (Exception ex) {
+ throw ex instanceof WebApplicationException
+ ? (WebApplicationException)ex
+ : ex instanceof ProcessingException
+ ? (ProcessingException)ex : new ProcessingException(ex);
+ }
+ if (r == null) {
+ r = handleResponse(message.getExchange().getOutMessage(),
+ cb.getResponseClass(),
+ cb.getOutGenericType());
+ }
if (cb.getResponseClass() == null || Response.class.equals(cb.getResponseClass())) {
cb.handleResponse(message, new Object[] {r});
@@ -1258,22 +1279,33 @@ public class WebClient extends AbstractC
@Override
public <T> Future<T> method(String name, Entity<?> entity, Class<T> responseType) {
- return doInvokeAsync(name, entity.getEntity(), entity.getClass(), entity.getClass(),
+ setEntityHeaders(entity);
+ return doInvokeAsync(name, entity.getEntity(), entity.getEntity().getClass(), null,
responseType, responseType, null);
}
@Override
public <T> Future<T> method(String name, Entity<?> entity, GenericType<T> responseType) {
- return doInvokeAsync(name, entity.getEntity(), entity.getClass(), entity.getClass(),
+ setEntityHeaders(entity);
+ return doInvokeAsync(name, entity.getEntity(), entity.getEntity().getClass(), null,
responseType.getRawType(), responseType.getType(), null);
}
@Override
public <T> Future<T> method(String name, Entity<?> entity, InvocationCallback<T> callback) {
- return doInvokeAsync(name, entity.getEntity(), entity.getClass(), entity.getClass(),
- Response.class, Response.class, callback);
+ setEntityHeaders(entity);
+ return doInvokeAsyncCallback(name, entity.getEntity(), entity.getEntity().getClass(), null,
+ callback);
+ }
+ private void setEntityHeaders(Entity<?> entity) {
+ WebClient.this.type(entity.getMediaType());
+ if (entity.getLanguage() != null) {
+ WebClient.this.language(entity.getLanguage().toString());
+ }
+ if (entity.getEncoding() != null) {
+ WebClient.this.encoding(entity.getEncoding());
+ }
}
-
}
}
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=1449019&r1=1449018&r2=1449019&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 Fri Feb 22 12:48:41 2013
@@ -32,6 +32,7 @@ import javax.ws.rs.client.ClientResponse
import javax.ws.rs.client.ClientResponseFilter;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.InvocationCallback;
+import javax.ws.rs.core.GenericEntity;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
@@ -101,6 +102,68 @@ public class JAXRS20ClientServerBookTest
doTestGetBookAsync(address, false);
}
+ @Test
+ public void testPostCollectionGenericEntity() throws Exception {
+
+ String endpointAddress =
+ "http://localhost:" + PORT + "/bookstore/collections3";
+ WebClient wc = WebClient.create(endpointAddress);
+ wc.accept("application/xml").type("application/xml");
+
+ GenericEntity<List<Book>> collectionEntity = createGenericEntity();
+ final Holder<Book> holder = new Holder<Book>();
+ InvocationCallback<Book> callback = createCallback(holder);
+
+ Future<Book> future = wc.post(collectionEntity, callback);
+ Book book = future.get();
+ assertEquals(200, wc.getResponse().getStatus());
+ assertSame(book, holder.value);
+ assertNotSame(collectionEntity.getEntity().get(0), book);
+ assertEquals(collectionEntity.getEntity().get(0).getName(), book.getName());
+ }
+
+ @Test
+ public void testPostCollectionGenericEntityAsEntity() throws Exception {
+
+ String endpointAddress =
+ "http://localhost:" + PORT + "/bookstore/collections3";
+ WebClient wc = WebClient.create(endpointAddress);
+ wc.accept("application/xml");
+
+ GenericEntity<List<Book>> collectionEntity = createGenericEntity();
+
+ final Holder<Book> holder = new Holder<Book>();
+ InvocationCallback<Book> callback = createCallback(holder);
+
+ Future<Book> future = wc.async().post(Entity.entity(collectionEntity, "application/xml"),
+ callback);
+ Book book = future.get();
+ assertEquals(200, wc.getResponse().getStatus());
+ assertSame(book, holder.value);
+ assertNotSame(collectionEntity.getEntity().get(0), book);
+ assertEquals(collectionEntity.getEntity().get(0).getName(), book.getName());
+ }
+
+ private GenericEntity<List<Book>> createGenericEntity() {
+ Book b1 = new Book("CXF in Action", 123L);
+ Book b2 = new Book("CXF Rocks", 124L);
+ List<Book> books = new ArrayList<Book>();
+ books.add(b1);
+ books.add(b2);
+ return new GenericEntity<List<Book>>(books) {
+ };
+ }
+
+ private InvocationCallback<Book> createCallback(final Holder<Book> holder) {
+ return new InvocationCallback<Book>() {
+ public void completed(Book response) {
+ holder.value = response;
+ }
+ public void failed(Throwable error) {
+ }
+ };
+ }
+
private void doTestGetBook(String address) {
WebClient wc = createWebClient(address);
Book book = wc.get(Book.class);
@@ -134,13 +197,7 @@ public class JAXRS20ClientServerBookTest
WebClient wc = createWebClient(address);
final Holder<Book> holder = new Holder<Book>();
- final InvocationCallback<Book> callback = new InvocationCallback<Book>() {
- public void completed(Book response) {
- holder.value = response;
- }
- public void failed(Throwable error) {
- }
- };
+ InvocationCallback<Book> callback = createCallback(holder);
Future<Book> future = asyncInvoker ? wc.async().get(callback) : wc.get(callback);
Book book = future.get();