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/08/16 18:56:38 UTC
svn commit: r1373920 - in /cxf/trunk:
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/
systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/
Author: sergeyb
Date: Thu Aug 16 16:56:38 2012
New Revision: 1373920
URL: http://svn.apache.org/viewvc?rev=1373920&view=rev
Log:
[CXF-4455] Support for 2.0 Response readEntity methods
Modified:
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/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ResponseImpl.java
cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java
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=1373920&r1=1373919&r2=1373920&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 Thu Aug 16 16:56:38 2012
@@ -54,6 +54,7 @@ import org.apache.cxf.interceptor.Interc
import org.apache.cxf.jaxrs.ext.multipart.Attachment;
import org.apache.cxf.jaxrs.ext.multipart.Multipart;
import org.apache.cxf.jaxrs.impl.MetadataMap;
+import org.apache.cxf.jaxrs.impl.ResponseImpl;
import org.apache.cxf.jaxrs.model.ClassResourceInfo;
import org.apache.cxf.jaxrs.model.OperationResourceInfo;
import org.apache.cxf.jaxrs.model.Parameter;
@@ -567,6 +568,8 @@ public class ClientProxyImpl extends Abs
throws Throwable {
try {
Response r = setResponseBuilder(outMessage, outMessage.getExchange()).build();
+ ((ResponseImpl)r).setMessage(outMessage);
+
Method method = outMessage.getExchange().get(Method.class);
checkResponse(method, r, outMessage);
if (method.getReturnType() == Void.class) {
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=1373920&r1=1373919&r2=1373920&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 Thu Aug 16 16:56:38 2012
@@ -47,6 +47,7 @@ import org.apache.cxf.helpers.CastUtils;
import org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.jaxrs.ext.form.Form;
+import org.apache.cxf.jaxrs.impl.ResponseImpl;
import org.apache.cxf.jaxrs.model.ParameterType;
import org.apache.cxf.jaxrs.model.URITemplate;
import org.apache.cxf.jaxrs.provider.ProviderFactory;
@@ -841,7 +842,9 @@ public class WebClient extends AbstractC
rb.entity(entity instanceof Response
? ((Response)entity).getEntity() : entity);
- return rb.build();
+ Response r = rb.build();
+ ((ResponseImpl)r).setMessage(outMessage);
+ return r;
} catch (Throwable ex) {
throw (ex instanceof ClientWebApplicationException) ? (ClientWebApplicationException)ex
: new ClientWebApplicationException(ex);
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ResponseImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ResponseImpl.java?rev=1373920&r1=1373919&r2=1373920&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ResponseImpl.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ResponseImpl.java Thu Aug 16 16:56:38 2012
@@ -19,10 +19,10 @@
package org.apache.cxf.jaxrs.impl;
-import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collections;
@@ -45,15 +45,21 @@ import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.NewCookie;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status.Family;
+import javax.ws.rs.ext.MessageBodyReader;
import org.apache.cxf.helpers.IOUtils;
+import org.apache.cxf.jaxrs.provider.ProviderFactory;
import org.apache.cxf.jaxrs.utils.HttpUtils;
+import org.apache.cxf.message.Message;
public final class ResponseImpl extends Response {
private final int status;
private Object entity;
private MultivaluedMap<String, Object> metadata;
+
+ private Message responseMessage;
private boolean entityClosed;
+ private boolean entityBufferred;
ResponseImpl(int s) {
this.status = s;
@@ -63,11 +69,19 @@ public final class ResponseImpl extends
this.status = s;
this.entity = e;
}
-
+
void addMetadata(MultivaluedMap<String, Object> meta) {
this.metadata = meta;
}
+ //TODO: This method is needed because on the client side the
+ // Response processing is done after the chain completes, thus
+ // PhaseInterceptorChain.getCurrentMessage() returns null.
+ // The refactoring will be required
+ public void setMessage(Message message) {
+ this.responseMessage = message;
+ }
+
public int getStatus() {
return status;
}
@@ -224,42 +238,74 @@ public final class ResponseImpl extends
}
public <T> T readEntity(Class<T> cls) throws MessageProcessingException, IllegalStateException {
- checkEntityIsAvailable();
- return null;
+ return readEntity(cls, new Annotation[]{});
}
public <T> T readEntity(GenericType<T> genType) throws MessageProcessingException, IllegalStateException {
- checkEntityIsAvailable();
- return null;
+ return readEntity(genType, new Annotation[]{});
}
public <T> T readEntity(Class<T> cls, Annotation[] anns) throws MessageProcessingException,
IllegalStateException {
- checkEntityIsAvailable();
- return null;
+
+ return doReadEntity(cls, cls, anns);
}
+ @SuppressWarnings("unchecked")
public <T> T readEntity(GenericType<T> genType, Annotation[] anns) throws MessageProcessingException,
IllegalStateException {
- checkEntityIsAvailable();
- return null;
+ return doReadEntity((Class<T>)genType.getRawType(),
+ genType.getType(), anns);
}
- public boolean bufferEntity() throws MessageProcessingException {
- if (entity instanceof InputStream) {
- if (entity instanceof ByteArrayInputStream) {
- return false;
- } else {
+ public <T> T doReadEntity(Class<T> cls, Type t, Annotation[] anns) throws MessageProcessingException,
+ IllegalStateException {
+
+ checkEntityIsAvailable();
+
+ if (cls.isAssignableFrom(entity.getClass())) {
+ T response = cls.cast(entity);
+ closeIfNotBufferred(cls);
+ return response;
+ }
+
+ if (responseMessage != null && entity instanceof InputStream) {
+ MediaType mediaType = getMediaType();
+ MessageBodyReader<T> mbr
+ = ProviderFactory.getInstance(responseMessage).createMessageBodyReader(
+ cls, t, anns, mediaType, responseMessage);
+ if (mbr != null) {
try {
- InputStream oldEntity = (InputStream)entity;
- entity = IOUtils.loadIntoBAIS(oldEntity);
- return true;
- } catch (IOException ex) {
+ T response = mbr.readFrom(cls, t, anns, mediaType, getStringHeaders(),
+ InputStream.class.cast(entity));
+ closeIfNotBufferred(cls);
+ return response;
+ } catch (Exception ex) {
throw new MessageProcessingException(ex);
}
}
}
- return false;
+
+ throw new MessageProcessingException("No Message Body reader is available");
+ }
+
+ private void closeIfNotBufferred(Class<?> responseCls) {
+ if (!entityBufferred && !InputStream.class.isAssignableFrom(responseCls)) {
+ close();
+ }
+ }
+
+ public boolean bufferEntity() throws MessageProcessingException {
+ if (!entityBufferred && entity instanceof InputStream) {
+ try {
+ InputStream oldEntity = (InputStream)entity;
+ entity = IOUtils.loadIntoBAIS(oldEntity);
+ entityBufferred = true;
+ } catch (IOException ex) {
+ throw new MessageProcessingException(ex);
+ }
+ }
+ return entityBufferred;
}
public void close() throws MessageProcessingException {
@@ -275,9 +321,9 @@ public final class ResponseImpl extends
}
- private void checkEntityIsAvailable() throws MessageProcessingException {
- if (entity == null) {
- throw new MessageProcessingException("Entity is not available");
+ private void checkEntityIsAvailable() {
+ if (entityClosed) {
+ throw new IllegalStateException("Entity is not available");
}
}
}
Modified: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java?rev=1373920&r1=1373919&r2=1373920&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java (original)
+++ cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java Thu Aug 16 16:56:38 2012
@@ -968,7 +968,7 @@ public class JAXRSClientServerBookTest e
}
@Test
- public void testGetBookFromResponseWithProxy() throws Exception {
+ public void testGetBookFromResponseWithProxyAndReader() throws Exception {
ResponseReader reader = new ResponseReader();
reader.setEntityClass(Book.class);
@@ -982,7 +982,17 @@ public class JAXRSClientServerBookTest e
}
@Test
- public void testGetBookFromResponseWithWebClient() throws Exception {
+ public void testGetBookFromResponseWithProxy() throws Exception {
+ BookStore bs = JAXRSClientFactory.create("http://localhost:" + PORT,
+ BookStore.class);
+ Response r = bs.getGenericResponseBook("123");
+ assertEquals(200, r.getStatus());
+ Book book = r.readEntity(Book.class);
+ assertEquals(123L, book.getId());
+ }
+
+ @Test
+ public void testGetBookFromResponseWithWebClientAndReader() throws Exception {
String address = "http://localhost:" + PORT + "/bookstore/genericresponse/123";
WebClient wc = WebClient.create(address,
Collections.singletonList(
@@ -994,6 +1004,16 @@ public class JAXRSClientServerBookTest e
}
@Test
+ public void testGetBookFromResponseWithWebClient() throws Exception {
+ String address = "http://localhost:" + PORT + "/bookstore/genericresponse/123";
+ WebClient wc = WebClient.create(address);
+ Response r = wc.accept("application/xml").get();
+ assertEquals(200, r.getStatus());
+ Book book = r.readEntity(Book.class);
+ assertEquals(123L, book.getId());
+ }
+
+ @Test
public void testUpdateWithProxy() throws Exception {
BookStore bs = JAXRSClientFactory.create("http://localhost:" + PORT, BookStore.class);
Book book = new Book();