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/04/02 17:29:35 UTC
svn commit: r1463595 - in /cxf/branches/2.7.x-fixes: ./
api/src/main/java/org/apache/cxf/common/util/
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/
rt/frontend/jaxrs/src/main/jav...
Author: sergeyb
Date: Tue Apr 2 15:29:34 2013
New Revision: 1463595
URL: http://svn.apache.org/r1463595
Log:
Merged revisions 1463583 via svnmerge from
https://svn.apache.org/repos/asf/cxf/trunk
........
r1463583 | sergeyb | 2013-04-02 18:06:29 +0300 (Tue, 02 Apr 2013) | 1 line
[CXF-4825] Trying to make sure JAX-RS Responses created by alternative implementations are not used internally or replaced by the CXF implementation if needed
........
Added:
cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/CustomResponse.java
- copied unchanged from r1463583, cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/CustomResponse.java
Modified:
cxf/branches/2.7.x-fixes/ (props changed)
cxf/branches/2.7.x-fixes/api/src/main/java/org/apache/cxf/common/util/ReflectionUtil.java
cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java
cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java
cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ResponseImpl.java
cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/WebApplicationExceptionMapper.java
cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java
cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java
cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java
Propchange: cxf/branches/2.7.x-fixes/
------------------------------------------------------------------------------
Merged /cxf/trunk:r1463583
Propchange: cxf/branches/2.7.x-fixes/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.
Modified: cxf/branches/2.7.x-fixes/api/src/main/java/org/apache/cxf/common/util/ReflectionUtil.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/api/src/main/java/org/apache/cxf/common/util/ReflectionUtil.java?rev=1463595&r1=1463594&r2=1463595&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/api/src/main/java/org/apache/cxf/common/util/ReflectionUtil.java (original)
+++ cxf/branches/2.7.x-fixes/api/src/main/java/org/apache/cxf/common/util/ReflectionUtil.java Tue Apr 2 15:29:34 2013
@@ -46,6 +46,23 @@ public final class ReflectionUtil {
// intentionally empty
}
+ public static <T> T accessDeclaredField(final Field f, final Object o, final Class<T> responseClass) {
+ return AccessController.doPrivileged(new PrivilegedAction<T>() {
+ public T run() {
+ try {
+ f.setAccessible(true);
+ return responseClass.cast(f.get(o));
+ } catch (SecurityException e) {
+ return null;
+ } catch (IllegalAccessException e) {
+ return null;
+ } finally {
+ f.setAccessible(false);
+ }
+ }
+ });
+ }
+
public static Field getDeclaredField(final Class<?> cls, final String name) {
return AccessController.doPrivileged(new PrivilegedAction<Field>() {
public Field run() {
Modified: cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java?rev=1463595&r1=1463594&r2=1463595&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java (original)
+++ cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java Tue Apr 2 15:29:34 2013
@@ -323,11 +323,11 @@ public abstract class AbstractClient imp
protected ResponseBuilder setResponseBuilder(Message outMessage, Exchange exchange) throws Exception {
Response response = exchange.get(Response.class);
if (response != null) {
- return Response.fromResponse(response);
+ return JAXRSUtils.fromResponse(JAXRSUtils.copyResponseIfNeeded(response));
}
Integer status = getResponseCode(exchange);
- ResponseBuilder currentResponseBuilder = Response.status(status);
+ ResponseBuilder currentResponseBuilder = JAXRSUtils.toResponseBuilder(status);
Message responseMessage = exchange.getInMessage() != null
? exchange.getInMessage() : exchange.getInFaultMessage();
Modified: cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java?rev=1463595&r1=1463594&r2=1463595&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java (original)
+++ cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java Tue Apr 2 15:29:34 2013
@@ -1071,7 +1071,7 @@ public class WebClient extends AbstractC
entity = currentResponse.getEntity();
}
}
- rb = Response.fromResponse(currentResponse);
+ rb = JAXRSUtils.fromResponse(currentResponse);
rb.entity(entity instanceof Response
? ((Response)entity).getEntity() : entity);
Modified: cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ResponseImpl.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ResponseImpl.java?rev=1463595&r1=1463594&r2=1463595&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ResponseImpl.java (original)
+++ cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ResponseImpl.java Tue Apr 2 15:29:34 2013
@@ -84,6 +84,10 @@ public final class ResponseImpl extends
this.entityAnnotations = anns;
}
+ public void setEntityAnnotations(Annotation[] anns) {
+ this.entityAnnotations = anns;
+ }
+
public Annotation[] getEntityAnnotations() {
return entityAnnotations;
}
Modified: cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/WebApplicationExceptionMapper.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/WebApplicationExceptionMapper.java?rev=1463595&r1=1463594&r2=1463595&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/WebApplicationExceptionMapper.java (original)
+++ cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/WebApplicationExceptionMapper.java Tue Apr 2 15:29:34 2013
@@ -23,12 +23,14 @@ import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.logging.Level;
import java.util.logging.Logger;
+
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import org.apache.cxf.common.logging.LogUtils;
+import org.apache.cxf.jaxrs.utils.JAXRSUtils;
import org.apache.cxf.logging.FaultListener;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.PhaseInterceptorChain;
@@ -72,7 +74,8 @@ public class WebApplicationExceptionMapp
}
if (doAddMessage) {
- r = Response.fromResponse(r).entity(errorMessage).type(MediaType.TEXT_PLAIN).build();
+ r = JAXRSUtils.copyResponseIfNeeded(r);
+ r = JAXRSUtils.fromResponse(r).entity(errorMessage).type(MediaType.TEXT_PLAIN).build();
}
return r;
}
Modified: cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java?rev=1463595&r1=1463594&r2=1463595&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java (original)
+++ cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java Tue Apr 2 15:29:34 2013
@@ -160,6 +160,8 @@ public class JAXRSOutInterceptor extends
OperationResourceInfo ori,
boolean firstTry) {
+ response = JAXRSUtils.copyResponseIfNeeded(response);
+
final Exchange exchange = message.getExchange();
Object entity = response.getEntity();
Modified: cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java?rev=1463595&r1=1463594&r2=1463595&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java (original)
+++ cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java Tue Apr 2 15:29:34 2013
@@ -96,6 +96,7 @@ import org.apache.cxf.common.classloader
import org.apache.cxf.common.i18n.BundleUtils;
import org.apache.cxf.common.logging.LogUtils;
import org.apache.cxf.common.util.PackageUtils;
+import org.apache.cxf.common.util.ReflectionUtil;
import org.apache.cxf.common.util.StringUtils;
import org.apache.cxf.helpers.XMLUtils;
import org.apache.cxf.jaxrs.ext.ContextProvider;
@@ -117,6 +118,8 @@ import org.apache.cxf.jaxrs.impl.ReaderI
import org.apache.cxf.jaxrs.impl.RequestImpl;
import org.apache.cxf.jaxrs.impl.ResourceContextImpl;
import org.apache.cxf.jaxrs.impl.ResourceInfoImpl;
+import org.apache.cxf.jaxrs.impl.ResponseBuilderImpl;
+import org.apache.cxf.jaxrs.impl.ResponseImpl;
import org.apache.cxf.jaxrs.impl.SecurityContextImpl;
import org.apache.cxf.jaxrs.impl.UriInfoImpl;
import org.apache.cxf.jaxrs.impl.WriterInterceptorContextImpl;
@@ -1538,4 +1541,55 @@ public final class JAXRSUtils {
}
}
}
+
+ public static Response toResponse(int status) {
+ return toResponseBuilder(status).build();
+ }
+
+ public static Response toResponse(Response.Status status) {
+ return toResponse(status.getStatusCode());
+ }
+
+ public static ResponseBuilder toResponseBuilder(int status) {
+ return new ResponseBuilderImpl().status(status);
+ }
+
+ public static ResponseBuilder toResponseBuilder(Response.Status status) {
+ return toResponseBuilder(status.getStatusCode());
+ }
+
+ public static ResponseBuilder fromResponse(Response response) {
+ ResponseBuilder rb = toResponseBuilder(response.getStatus());
+ rb.entity(response.getEntity());
+ for (Map.Entry<String, List<Object>> entry : response.getHeaders().entrySet()) {
+ List<Object> values = entry.getValue();
+ for (Object value : values) {
+ rb.header(entry.getKey(), value);
+ }
+ }
+ return rb;
+ }
+
+ public static Response copyResponseIfNeeded(Response response) {
+ if (!(response instanceof ResponseImpl)) {
+ Response r = fromResponse(response).build();
+ Field[] declaredFields = ReflectionUtil.getDeclaredFields(response.getClass());
+ for (Field f : declaredFields) {
+ Class<?> declClass = f.getType();
+ if (declClass == Annotation[].class) {
+ try {
+ Annotation[] fieldAnnotations =
+ ReflectionUtil.accessDeclaredField(f, response, Annotation[].class);
+ ((ResponseImpl)r).setEntityAnnotations(fieldAnnotations);
+ } catch (Throwable ex) {
+ LOG.warning("Custom annotations if any may can not be copied");
+ }
+ break;
+ }
+ }
+ return r;
+ } else {
+ return response;
+ }
+ }
}
Modified: cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java?rev=1463595&r1=1463594&r2=1463595&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java (original)
+++ cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java Tue Apr 2 15:29:34 2013
@@ -1148,6 +1148,14 @@ public class BookStore {
return this;
}
+ @Path("/customresponse")
+ @GET
+ @Produces("application/xml")
+ public Response getCustomBook() {
+ return new CustomResponse(
+ Response.ok().entity(new Book("Book", 222L)).header("customresponse", "OK").build());
+ }
+
@POST
@Path("/booksecho2")
@Consumes("text/plain")
Modified: cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java?rev=1463595&r1=1463594&r2=1463595&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java (original)
+++ cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java Tue Apr 2 15:29:34 2013
@@ -90,6 +90,16 @@ public class JAXRSClientServerBookTest e
}
+
+ @Test
+ public void testGetCustomBookResponse() {
+ String address = "http://localhost:" + PORT + "/bookstore/customresponse";
+ WebClient wc = WebClient.create(address);
+ Response r = wc.accept("application/xml").get(Response.class);
+ Book book = r.readEntity(Book.class);
+ assertEquals(222L, book.getId());
+ assertEquals("OK", r.getHeaderString("customresponse"));
+ }
@Test
public void testGetCustomBookText() {