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/24 12:29:59 UTC
svn commit: r1389275 - in /cxf/trunk:
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/
systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/
Author: sergeyb
Date: Mon Sep 24 10:29:59 2012
New Revision: 1389275
URL: http://svn.apache.org/viewvc?rev=1389275&view=rev
Log:
Initial attempt at bringing the sync and async web client code closer
Modified:
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java
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/AbstractClient.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java?rev=1389275&r1=1389274&r2=1389275&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java Mon Sep 24 10:29:59 2012
@@ -576,6 +576,14 @@ public abstract class AbstractClient imp
return newRequestURI;
}
+ protected void doRunInterceptorChain(Message m) {
+ try {
+ m.getInterceptorChain().doIntercept(m);
+ } catch (Exception ex) {
+ m.setContent(Exception.class, ex);
+ }
+ }
+
@SuppressWarnings("unchecked")
public Object[] invoke(BindingOperationInfo oi, Object[] params, Map<String, Object> context,
Exchange exchange) throws Exception {
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java?rev=1389275&r1=1389274&r2=1389275&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java Mon Sep 24 10:29:59 2012
@@ -520,11 +520,7 @@ public class ClientProxyImpl extends Abs
reqContext.put("BODY_INDEX", bodyIndex);
// execute chain
- try {
- outMessage.getInterceptorChain().doIntercept(outMessage);
- } catch (Exception ex) {
- outMessage.setContent(Exception.class, ex);
- }
+ doRunInterceptorChain(outMessage);
Object[] results = preProcessResult(outMessage);
if (results != null && results.length == 1) {
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=1389275&r1=1389274&r2=1389275&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 Mon Sep 24 10:29:59 2012
@@ -747,20 +747,7 @@ public class WebClient extends AbstractC
Class<?> responseClass,
Type outGenericType) {
- MultivaluedMap<String, String> headers = getHeaders();
- boolean contentTypeNotSet = headers.getFirst(HttpHeaders.CONTENT_TYPE) == null;
- if (contentTypeNotSet) {
- String ct = "*/*";
- if (body != null) {
- ct = body instanceof Form ? MediaType.APPLICATION_FORM_URLENCODED
- : MediaType.APPLICATION_XML;
- }
- headers.putSingle(HttpHeaders.CONTENT_TYPE, ct);
- }
- if (responseClass != null && responseClass != Response.class
- && headers.getFirst(HttpHeaders.ACCEPT) == null) {
- headers.putSingle(HttpHeaders.ACCEPT, MediaType.APPLICATION_XML_TYPE.toString());
- }
+ MultivaluedMap<String, String> headers = prepareHeaders(responseClass, body);
resetResponse();
Response r = doChainedInvocation(httpMethod, headers, body, requestClass, inGenericType,
responseClass, outGenericType, null, null);
@@ -796,8 +783,29 @@ public class WebClient extends AbstractC
protected <T> Future<T> doInvokeAsync(String httpMethod,
Object body,
Class<?> requestClass,
- Type inGenericType,
+ Type inType,
InvocationCallback<T> callback) {
+
+ Type outType = getCallbackType(callback);
+ Class<?> respClass = outType instanceof Class ? (Class<?>) outType : null;
+
+ MultivaluedMap<String, String> headers = prepareHeaders(respClass, body);
+ resetResponse();
+
+ Message m = finalizeMessage(httpMethod, headers, body, requestClass, inType,
+ respClass, outType, null, null);
+
+ m.getExchange().setSynchronous(false);
+ JaxrsClientCallback<T> cb = new JaxrsClientCallback<T>(callback, respClass, outType);
+ m.getExchange().put(JaxrsClientCallback.class, cb);
+
+ doRunInterceptorChain(m);
+
+ return cb.createFuture();
+ }
+
+
+ private MultivaluedMap<String, String> prepareHeaders(Class<?> responseClass, Object body) {
MultivaluedMap<String, String> headers = getHeaders();
boolean contentTypeNotSet = headers.getFirst(HttpHeaders.CONTENT_TYPE) == null;
if (contentTypeNotSet) {
@@ -808,45 +816,14 @@ public class WebClient extends AbstractC
}
headers.putSingle(HttpHeaders.CONTENT_TYPE, ct);
}
- Type outGenericType = getCallbackType(callback);
- Class<?> responseClass = outGenericType instanceof Class ? (Class<?>) outGenericType : null;
+
if (responseClass != null && responseClass != Response.class
&& headers.getFirst(HttpHeaders.ACCEPT) == null) {
headers.putSingle(HttpHeaders.ACCEPT, MediaType.APPLICATION_XML_TYPE.toString());
}
- resetResponse();
- URI uri = getCurrentURI();
- Exchange exchange = null;
- Map<String, Object> invContext = null;
-
- Message m = createMessage(body, httpMethod, headers, uri, exchange,
- invContext, false);
-
- m.getExchange().setSynchronous(false);
-
- Map<String, Object> reqContext = getRequestContext(m);
- reqContext.put(Message.HTTP_REQUEST_METHOD, httpMethod);
- reqContext.put(REQUEST_CLASS, requestClass);
- reqContext.put(REQUEST_TYPE, inGenericType);
- reqContext.put(RESPONSE_CLASS, responseClass);
- reqContext.put(RESPONSE_TYPE, outGenericType);
-
- if (body != null) {
- m.getInterceptorChain().add(new BodyWriter());
- }
- setPlainOperationNameProperty(m, httpMethod + ":" + uri.toString());
-
- JaxrsClientCallback<T> cb = new JaxrsClientCallback<T>(callback, responseClass, outGenericType);
- m.getExchange().put(JaxrsClientCallback.class, cb);
- try {
- m.getInterceptorChain().doIntercept(m);
- } catch (Exception ex) {
- m.setContent(Exception.class, ex);
- }
-
- return cb.createFuture();
+ return headers;
}
-
+
private void handleAsyncResponse(Message message) {
JaxrsClientCallback<?> cb = message.getExchange().get(JaxrsClientCallback.class);
Response r = handleResponse(message.getExchange().getOutMessage(),
@@ -859,11 +836,11 @@ public class WebClient extends AbstractC
cb.handleResponse(message, new Object[] {r.getEntity()});
}
}
- public void handleAsyncFault(Message message) {
+ private void handleAsyncFault(Message message) {
}
-
+ //TODO: retry invocation will not work in case of async request failures for the moment
@Override
protected Object retryInvoke(URI newRequestURI,
MultivaluedMap<String, String> headers,
@@ -885,12 +862,29 @@ public class WebClient extends AbstractC
MultivaluedMap<String, String> headers,
Object body,
Class<?> requestClass,
- Type inGenericType,
- Class<?> responseClass,
- Type outGenericType,
+ Type inType,
+ Class<?> respClass,
+ Type outType,
Exchange exchange,
Map<String, Object> invContext) {
//CHECKSTYLE:ON
+ Message m = finalizeMessage(httpMethod, headers, body, requestClass, inType,
+ respClass, outType, exchange, invContext);
+ doRunInterceptorChain(m);
+ return doResponse(m, respClass, outType);
+ }
+
+ //CHECKSTYLE:OFF
+ private Message finalizeMessage(String httpMethod,
+ MultivaluedMap<String, String> headers,
+ Object body,
+ Class<?> requestClass,
+ Type inGenericType,
+ Class<?> responseClass,
+ Type outGenericType,
+ Exchange exchange,
+ Map<String, Object> invContext) {
+ //CHECKSTYLE:ON
URI uri = getCurrentURI();
Message m = createMessage(body, httpMethod, headers, uri, exchange,
invContext, false);
@@ -906,14 +900,9 @@ public class WebClient extends AbstractC
m.getInterceptorChain().add(new BodyWriter());
}
setPlainOperationNameProperty(m, httpMethod + ":" + uri.toString());
-
- try {
- m.getInterceptorChain().doIntercept(m);
- } catch (Exception ex) {
- m.setContent(Exception.class, ex);
- }
- return doResponse(m, responseClass, outGenericType);
+ return m;
}
+
protected Response doResponse(Message m,
Class<?> responseClass,
Type outGenericType) {
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=1389275&r1=1389274&r2=1389275&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 Mon Sep 24 10:29:59 2012
@@ -33,6 +33,7 @@ import javax.ws.rs.client.ClientResponse
import javax.ws.rs.client.ClientResponseFilter;
import javax.ws.rs.client.InvocationCallback;
import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ReaderInterceptor;
import javax.ws.rs.ext.ReaderInterceptorContext;
@@ -58,56 +59,58 @@ public class JAXRS20ClientServerBookTest
@Test
public void testGetBook() {
String address = "http://localhost:" + PORT + "/bookstore/bookheaders/simple";
- doTestBook(address);
+ doTestGetBook(address);
}
@Test
public void testGetBookAsync() throws Exception {
String address = "http://localhost:" + PORT + "/bookstore/bookheaders/simple";
- doTestBookAsync(address, false);
+ doTestGetBookAsync(address, false);
+ }
+
+ @Test
+ public void testGetBookAsyncResponse() throws Exception {
+ String address = "http://localhost:" + PORT + "/bookstore/bookheaders/simple";
+ doTestGetBookAsyncResponse(address, false);
}
@Test
public void testGetBookAsyncInvoker() throws Exception {
String address = "http://localhost:" + PORT + "/bookstore/bookheaders/simple";
- doTestBookAsync(address, true);
+ doTestGetBookAsync(address, true);
}
@Test
public void testGetBookWrongPath() {
String address = "http://localhost:" + PORT + "/wrongpath";
- doTestBook(address);
+ doTestGetBook(address);
}
@Test
public void testGetBookWrongPathAsync() throws Exception {
String address = "http://localhost:" + PORT + "/wrongpath";
- doTestBookAsync(address, false);
+ doTestGetBookAsync(address, false);
}
- private void doTestBook(String address) {
- List<Object> providers = new ArrayList<Object>();
- providers.add(new ClientHeaderRequestFilter());
- providers.add(new ClientHeaderResponseFilter());
- WebClient wc = WebClient.create(address, providers);
- WebClient.getConfig(wc).getHttpConduit().getClient().setReceiveTimeout(1000000L);
+ private void doTestGetBook(String address) {
+ WebClient wc = createWebClient(address);
Book book = wc.get(Book.class);
assertEquals(124L, book.getId());
- Response response = wc.getResponse();
- assertEquals("OK", response.getHeaderString("Response"));
- assertEquals("custom", response.getHeaderString("Custom"));
- assertEquals("simple", response.getHeaderString("Simple"));
- assertEquals("serverWrite", response.getHeaderString("ServerWriterInterceptor"));
- assertEquals("http://localhost/redirect", response.getHeaderString(HttpHeaders.LOCATION));
+ validateResponse(wc);
}
- private void doTestBookAsync(String address, boolean asyncInvoker)
- throws InterruptedException, ExecutionException {
-
+ private WebClient createWebClient(String address) {
List<Object> providers = new ArrayList<Object>();
providers.add(new ClientHeaderRequestFilter());
providers.add(new ClientHeaderResponseFilter());
WebClient wc = WebClient.create(address, providers);
WebClient.getConfig(wc).getHttpConduit().getClient().setReceiveTimeout(1000000L);
+ return wc;
+ }
+
+ private void doTestGetBookAsync(String address, boolean asyncInvoker)
+ throws InterruptedException, ExecutionException {
+
+ WebClient wc = createWebClient(address);
final Holder<Book> holder = new Holder<Book>();
final InvocationCallback<Book> callback = new InvocationCallback<Book>() {
@@ -122,6 +125,31 @@ public class JAXRS20ClientServerBookTest
Book book = future.get();
assertSame(book, holder.value);
assertEquals(124L, book.getId());
+ validateResponse(wc);
+ }
+
+ private void doTestGetBookAsyncResponse(String address, boolean asyncInvoker)
+ throws InterruptedException, ExecutionException {
+
+ WebClient wc = createWebClient(address);
+ wc.accept(MediaType.APPLICATION_XML_TYPE);
+
+ final Holder<Response> holder = new Holder<Response>();
+ final InvocationCallback<Response> callback = new InvocationCallback<Response>() {
+ public void completed(Response response) {
+ holder.value = response;
+ }
+ public void failed(ClientException error) {
+ }
+ };
+
+ Future<Response> future = asyncInvoker ? wc.async().get(callback) : wc.get(callback);
+ Book book = future.get().readEntity(Book.class);
+ assertEquals(124L, book.getId());
+ validateResponse(wc);
+ }
+
+ private void validateResponse(WebClient wc) {
Response response = wc.getResponse();
assertEquals("OK", response.getHeaderString("Response"));
assertEquals("custom", response.getHeaderString("Custom"));
@@ -130,6 +158,8 @@ public class JAXRS20ClientServerBookTest
assertEquals("http://localhost/redirect", response.getHeaderString(HttpHeaders.LOCATION));
}
+
+
@Test
public void testClientFiltersLocalResponse() {
String address = "http://localhost:" + PORT + "/bookstores";
@@ -157,15 +187,12 @@ public class JAXRS20ClientServerBookTest
WebClient.getConfig(wc).getHttpConduit().getClient().setReceiveTimeout(1000000L);
Book book = wc.post(new Book("Book", 126L), Book.class);
assertEquals(124L, book.getId());
+ validateResponse(wc);
+
Response response = wc.getResponse();
- assertEquals("OK", response.getHeaderString("Response"));
- assertEquals("custom", response.getHeaderString("Custom"));
- assertEquals("simple", response.getHeaderString("Simple"));
assertEquals("serverRead", response.getHeaderString("ServerReaderInterceptor"));
- assertEquals("serverWrite", response.getHeaderString("ServerWriterInterceptor"));
assertEquals("clientWrite", response.getHeaderString("ClientWriterInterceptor"));
assertEquals("clientRead", response.getHeaderString("ClientReaderInterceptor"));
- assertEquals("http://localhost/redirect", response.getHeaderString(HttpHeaders.LOCATION));
}
private static class ClientCacheRequestFilter implements ClientRequestFilter {