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/19 23:11:58 UTC

svn commit: r1387755 - in /cxf/trunk: rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/spec/ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ systests/jaxrs/src/test/java...

Author: sergeyb
Date: Wed Sep 19 21:11:57 2012
New Revision: 1387755

URL: http://svn.apache.org/viewvc?rev=1387755&view=rev
Log:
[CXF-4455] Adding few new interceptor tests

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/ClientState.java
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/LocalClientState.java
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ThreadLocalClientState.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/client/spec/ClientRequestContextImpl.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/BookServer20.java
    cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java
    cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.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/AbstractClient.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java?rev=1387755&r1=1387754&r2=1387755&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 Wed Sep 19 21:11:57 2012
@@ -265,14 +265,7 @@ public abstract class AbstractClient imp
      * {@inheritDoc}
      */
     public Response getResponse() {
-        if (state.getResponseBuilder() == null) {
-            return null;
-        }
-        try {
-            return state.getResponseBuilder().clone().build();
-        } catch (CloneNotSupportedException ex) {
-            throw new ClientException(ex);
-        }
+        return state.getResponse();
     }
     
     /**
@@ -303,7 +296,7 @@ public abstract class AbstractClient imp
     }
 
     protected void resetResponse() {
-        state.setResponseBuilder(null);
+        state.setResponse(null);
     }
     
     protected void resetBaseAddress(URI uri) {
@@ -333,9 +326,7 @@ public abstract class AbstractClient imp
     protected ResponseBuilder setResponseBuilder(Message outMessage, Exchange exchange) throws Exception {
         Response response = exchange.get(Response.class);
         if (response != null) {
-            ResponseBuilder rb = Response.fromResponse(response);
-            state.setResponseBuilder(rb);
-            return rb.clone();
+            return Response.fromResponse(response);
         }
         
         Integer status = getResponseCode(exchange);
@@ -345,9 +336,7 @@ public abstract class AbstractClient imp
             ? exchange.getInMessage() : exchange.getInFaultMessage();
         // if there is no response message, we just send the response back directly
         if (responseMessage == null) {
-            ResponseBuilder rb = currentResponseBuilder.clone();
-            state.setResponseBuilder(currentResponseBuilder);
-            return rb;
+            return currentResponseBuilder;
         }
                 
         @SuppressWarnings("unchecked")
@@ -388,9 +377,7 @@ public abstract class AbstractClient imp
         InputStream mStream = responseMessage.getContent(InputStream.class);
         currentResponseBuilder.entity(mStream);
         
-        ResponseBuilder rb = currentResponseBuilder.clone();
-        state.setResponseBuilder(currentResponseBuilder);
-        return rb;
+        return currentResponseBuilder;
     }
     
     protected <T> void writeBody(T o, Message outMessage, Class<?> cls, Type type, Annotation[] anns,
@@ -449,6 +436,11 @@ public abstract class AbstractClient imp
     @SuppressWarnings("unchecked")
     protected <T> T readBody(Response r, Message outMessage, Class<T> cls, 
                              Type type, Annotation[] anns) {
+        
+        if (cls == Response.class) {
+            return cls.cast(r);
+        }
+        
         Message responseMessage = outMessage.getExchange().getInMessage();
         
         InputStream inputStream = (InputStream)r.getEntity();
@@ -460,7 +452,7 @@ public abstract class AbstractClient imp
                 || responseMessage.getContent(XMLStreamReader.class) == null
                     && responseMessage.getContent(Reader.class) == null) {
             
-                return cls == Response.class ? cls.cast(r) : null;
+                return null;
             }
         }
         
@@ -468,11 +460,7 @@ public abstract class AbstractClient imp
         if (status < 200 || status == 204 || status >= 300) {
             Object length = r.getMetadata().getFirst(HttpHeaders.CONTENT_LENGTH);
             if (length == null || Integer.parseInt(length.toString()) == 0 || status >= 300) {
-                if (cls == Response.class) {
-                    return cls.cast(r);
-                } else {
-                    return null;
-                }
+                return null;
             }
         }
         
@@ -490,8 +478,6 @@ public abstract class AbstractClient imp
             } catch (Exception ex) {
                 reportMessageHandlerProblem("MSG_READER_PROBLEM", cls, contentType, ex, r);
             }
-        } else if (cls == Response.class) {
-            return cls.cast(r);
         } else {
             reportMessageHandlerProblem("NO_MSG_READER", cls, contentType, null, null);
         }

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=1387755&r1=1387754&r2=1387755&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 Wed Sep 19 21:11:57 2012
@@ -564,6 +564,7 @@ public class ClientProxyImpl extends Abs
         try {
             Response r = setResponseBuilder(outMessage, outMessage.getExchange()).build();
             ((ResponseImpl)r).setMessage(outMessage);
+            getState().setResponse(r);
             
             Method method = outMessage.getExchange().get(Method.class);
             checkResponse(method, r, outMessage);

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientState.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientState.java?rev=1387755&r1=1387754&r2=1387755&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientState.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientState.java Wed Sep 19 21:11:57 2012
@@ -21,7 +21,7 @@ package org.apache.cxf.jaxrs.client;
 import java.net.URI;
 
 import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.core.Response.ResponseBuilder;
+import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriBuilder;
 
 
@@ -60,16 +60,16 @@ public interface ClientState {
     URI getBaseURI();
     
     /**
-     * Sets the responseBuilder
-     * @param responseBuilder responseBuilder
+     * Sets Response
+     * @param response response
      */
-    void setResponseBuilder(ResponseBuilder responseBuilder);
+    void setResponse(Response response);
     
     /**
-     * Gets the responseBuilder
-     * @return responseBuilder
+     * Gets Response
+     * @return response
      */
-    ResponseBuilder getResponseBuilder();
+    Response getResponse();
     
     /**
      * Sets the request headers

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/LocalClientState.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/LocalClientState.java?rev=1387755&r1=1387754&r2=1387755&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/LocalClientState.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/LocalClientState.java Wed Sep 19 21:11:57 2012
@@ -20,9 +20,8 @@ package org.apache.cxf.jaxrs.client;
 
 import java.net.URI;
 
-import javax.ws.rs.client.ClientException;
 import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.core.Response.ResponseBuilder;
+import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriBuilder;
 
 import org.apache.cxf.common.util.StringUtils;
@@ -37,7 +36,7 @@ public class LocalClientState implements
     
     private MultivaluedMap<String, String> requestHeaders = new MetadataMap<String, String>(false, true);
     private MultivaluedMap<String, String> templates;
-    private ResponseBuilder responseBuilder;
+    private Response response;
     private URI baseURI;
     private UriBuilder currentBuilder;
     
@@ -58,11 +57,8 @@ public class LocalClientState implements
     public LocalClientState(LocalClientState cs) {
         this.requestHeaders = new MetadataMap<String, String>(cs.requestHeaders);
         this.templates = cs.templates == null ? null : new MetadataMap<String, String>(cs.templates);
-        try {
-            this.responseBuilder = cs.responseBuilder != null ? cs.responseBuilder.clone() : null;
-        } catch (CloneNotSupportedException ex) {
-            throw new ClientException(ex);
-        }
+        this.response = cs.response;
+        
         this.baseURI = cs.baseURI;
         this.currentBuilder = cs.currentBuilder != null ? cs.currentBuilder.clone() : null;
     }
@@ -85,12 +81,12 @@ public class LocalClientState implements
         return baseURI;
     }
     
-    public void setResponseBuilder(ResponseBuilder responseBuilder) {
-        this.responseBuilder = responseBuilder;
+    public void setResponse(Response r) {
+        this.response = r;
     }
     
-    public ResponseBuilder getResponseBuilder() {
-        return responseBuilder;
+    public Response getResponse() {
+        return response;
     }
     
     public void setRequestHeaders(MultivaluedMap<String, String> requestHeaders) {
@@ -117,7 +113,7 @@ public class LocalClientState implements
     
     public void reset() {
         requestHeaders.clear();
-        responseBuilder = null;
+        response = null;
         currentBuilder = UriBuilder.fromUri(baseURI);
         templates = null;
     }

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ThreadLocalClientState.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ThreadLocalClientState.java?rev=1387755&r1=1387754&r2=1387755&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ThreadLocalClientState.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ThreadLocalClientState.java Wed Sep 19 21:11:57 2012
@@ -25,7 +25,7 @@ import java.util.WeakHashMap;
 import java.util.concurrent.ConcurrentHashMap;
 
 import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.core.Response.ResponseBuilder;
+import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriBuilder;
 
 /**
@@ -73,12 +73,12 @@ public class ThreadLocalClientState impl
         return getState().getBaseURI();
     }
     
-    public void setResponseBuilder(ResponseBuilder responseBuilder) {
-        getState().setResponseBuilder(responseBuilder);
+    public void setResponse(Response response) {
+        getState().setResponse(response);
     }
     
-    public ResponseBuilder getResponseBuilder() {
-        return getState().getResponseBuilder();
+    public Response getResponse() {
+        return getState().getResponse();
     }
     
     public void setRequestHeaders(MultivaluedMap<String, String> requestHeaders) {

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=1387755&r1=1387754&r2=1387755&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 Wed Sep 19 21:11:57 2012
@@ -835,11 +835,16 @@ public class WebClient extends AbstractC
                     entity = currentResponse.getEntity();
                 }
             }
+            rb = Response.fromResponse(currentResponse);
+            
             rb.entity(entity instanceof Response 
                       ? ((Response)entity).getEntity() : entity);
             
             Response r = rb.build();
             ((ResponseImpl)r).setMessage(outMessage);
+            
+            getState().setResponse(r);
+            
             return r;
         } catch (Throwable ex) {
             throw (ex instanceof ClientException) ? (ClientException)ex

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientRequestContextImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientRequestContextImpl.java?rev=1387755&r1=1387754&r2=1387755&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientRequestContextImpl.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientRequestContextImpl.java Wed Sep 19 21:11:57 2012
@@ -35,6 +35,7 @@ import javax.ws.rs.core.MultivaluedMap;
 import org.apache.cxf.jaxrs.impl.AbstractRequestContextImpl;
 import org.apache.cxf.jaxrs.impl.MetadataMap;
 import org.apache.cxf.message.Message;
+import org.apache.cxf.message.MessageContentsList;
 
 
 public class ClientRequestContextImpl extends AbstractRequestContextImpl
@@ -59,8 +60,11 @@ public class ClientRequestContextImpl ex
     
     @Override
     public Object getEntity() {
-        // TODO Auto-generated method stub
-        return null;
+        MessageContentsList objs = MessageContentsList.getContentsList(m);
+        if (objs == null || objs.size() == 0) {
+            return null;
+        }
+        return objs.get(0);
     }
 
     @Override
@@ -71,14 +75,15 @@ public class ClientRequestContextImpl ex
 
     @Override
     public Class<?> getEntityClass() {
-        // TODO Auto-generated method stub
-        return null;
+        Object entity = getEntity();
+        return entity == null ? null : entity.getClass();
     }
 
     @Override
     public Type getEntityType() {
-        // TODO Auto-generated method stub
-        return null;
+        Object entity = getEntity();
+        //TODO: deal with generic entities
+        return entity == null ? null : entity.getClass();
     }
     
     @Override
@@ -88,8 +93,7 @@ public class ClientRequestContextImpl ex
 
     @Override
     public boolean hasEntity() {
-        // TODO Auto-generated method stub
-        return false;
+        return getEntity() != null;
     }
     
     @Override
@@ -99,6 +103,7 @@ public class ClientRequestContextImpl ex
             headers.putSingle(HttpHeaders.CONTENT_TYPE, mt);
             m.put(Message.CONTENT_TYPE, mt.toString());
         }
+        m.put(List.class, entity == null ? new MessageContentsList() : new MessageContentsList(entity));
     }
 
     

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=1387755&r1=1387754&r2=1387755&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 Wed Sep 19 21:11:57 2012
@@ -44,11 +44,12 @@ 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 javax.ws.rs.ext.ReaderInterceptor;
 
 import org.apache.cxf.helpers.IOUtils;
 import org.apache.cxf.jaxrs.provider.ProviderFactory;
 import org.apache.cxf.jaxrs.utils.HttpUtils;
+import org.apache.cxf.jaxrs.utils.JAXRSUtils;
 import org.apache.cxf.message.Message;
 
 public final class ResponseImpl extends Response {
@@ -290,7 +291,11 @@ public final class ResponseImpl extends 
     public <T> T doReadEntity(Class<T> cls, Type t, Annotation[] anns) throws MessageProcessingException,
         IllegalStateException {
         
-        checkEntityIsAvailable();
+        checkEntityIsClosed();
+        
+        if (!hasEntity()) {
+            return null;
+        }
         
         if (cls.isAssignableFrom(entity.getClass())) {
             T response = cls.cast(entity);
@@ -300,17 +305,22 @@ public final class ResponseImpl extends 
         
         if (responseMessage != null && entity instanceof InputStream) {
             MediaType mediaType = getMediaType();
-            MessageBodyReader<T> mbr 
-                = ProviderFactory.getInstance(responseMessage).createMessageBodyReader(
-                    cls, t, anns, mediaType, responseMessage);
-            if (mbr != null) {
+            
+            List<ReaderInterceptor> readers = ProviderFactory.getInstance(responseMessage)
+                .createMessageBodyReaderInterceptor(cls, t, anns, mediaType, 
+                                                    responseMessage.getExchange().getOutMessage());
+            if (readers != null) {
                 try {
-                    T response = mbr.readFrom(cls, t, anns, mediaType, getStringHeaders(), 
-                                        InputStream.class.cast(entity));
-                    closeIfNotBufferred(cls);
-                    return response;
+                    responseMessage.put(Message.PROTOCOL_HEADERS, this.getMetadata());
+                    return cls.cast(JAXRSUtils.readFromMessageBodyReader(readers, cls, t, 
+                                                                anns, 
+                                                                InputStream.class.cast(entity), 
+                                                                mediaType, 
+                                                                responseMessage));
                 } catch (Exception ex) {
                     throw new MessageProcessingException(ex);
+                } finally {
+                    closeIfNotBufferred(cls);
                 }
             }
         }
@@ -341,19 +351,22 @@ public final class ResponseImpl extends 
     }
 
     public void close() throws MessageProcessingException {
-        if (!entityClosed && entity instanceof InputStream) {
-            try {
-                ((InputStream)entity).close();
-                entity = null;
-                entityClosed = true;
-            } catch (IOException ex) {
-                throw new MessageProcessingException(ex);
+        if (!entityClosed) {
+            if (entity instanceof InputStream) {
+                try {
+                    ((InputStream)entity).close();
+                    entity = null;
+                } catch (IOException ex) {
+                    throw new MessageProcessingException(ex);
+                }
             }
+            entityClosed = true;
+            
         }
         
     }
     
-    private void checkEntityIsAvailable() {
+    private void checkEntityIsClosed() {
         if (entityClosed) {
             throw new IllegalStateException("Entity is not available");
         }

Modified: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookServer20.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookServer20.java?rev=1387755&r1=1387754&r2=1387755&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookServer20.java (original)
+++ cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookServer20.java Wed Sep 19 21:11:57 2012
@@ -29,12 +29,17 @@ import java.util.ArrayList;
 import java.util.List;
 
 import javax.ws.rs.NameBinding;
+import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.container.ContainerRequestContext;
 import javax.ws.rs.container.ContainerRequestFilter;
 import javax.ws.rs.container.ContainerResponseContext;
 import javax.ws.rs.container.ContainerResponseFilter;
 import javax.ws.rs.container.PreMatching;
 import javax.ws.rs.core.UriInfo;
+import javax.ws.rs.ext.ReaderInterceptor;
+import javax.ws.rs.ext.ReaderInterceptorContext;
+import javax.ws.rs.ext.WriterInterceptor;
+import javax.ws.rs.ext.WriterInterceptorContext;
 
 import org.apache.cxf.Bus;
 import org.apache.cxf.BusFactory;
@@ -59,6 +64,8 @@ public class BookServer20 extends Abstra
         providers.add(new PreMatchContainerRequestFilter());
         providers.add(new PostMatchContainerResponseFilter());
         providers.add(new PostMatchContainerResponseFilter2());
+        providers.add(new CustomReaderInterceptor());
+        providers.add(new CustomWriterInterceptor());
         sf.setProviders(providers);
         sf.setResourceProvider(BookStore.class,
                                new SingletonResourceProvider(new BookStore(), true));
@@ -131,4 +138,25 @@ public class BookServer20 extends Abstra
     public @interface CustomHeaderAdded { 
         
     }
+    
+    public static class CustomReaderInterceptor implements ReaderInterceptor {
+
+        @Override
+        public Object aroundReadFrom(ReaderInterceptorContext context) throws IOException,
+            WebApplicationException {
+            context.getHeaders().add("ServerReaderInterceptor", "serverRead");
+            return context.proceed();
+        }
+        
+    }
+    
+    public static class CustomWriterInterceptor implements WriterInterceptor {
+
+        @Override
+        public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException {
+            context.getHeaders().add("ServerWriterInterceptor", "serverWrite");
+            context.proceed();
+        }
+        
+    }
 }

Modified: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java?rev=1387755&r1=1387754&r2=1387755&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java (original)
+++ cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java Wed Sep 19 21:11:57 2012
@@ -431,13 +431,39 @@ public class BookStore {
     @Path("/bookheaders/simple/")
     @CustomHeaderAdded
     public Response getBookByHeaderSimple(@HeaderParam("BOOK") String headerBook,
-                                          @HeaderParam("Simple") String headerSimple) throws Exception {
+        @HeaderParam("Simple") String headerSimple) throws Exception {
+        
+        ResponseBuilder builder = getBookByHeaderSimpleBuilder(headerBook, headerSimple);
+        return builder.build();
+    }
+    
+    @POST
+    @Path("/bookheaders/simple/")
+    @CustomHeaderAdded
+    public Response echoBookByHeaderSimple(Book book,
+        @HeaderParam("BOOK") String headerBook,
+        @HeaderParam("Simple") String headerSimple,
+        @HeaderParam("ServerReaderInterceptor") String serverInterceptorHeader,
+        @HeaderParam("ClientWriterInterceptor") String clientInterceptorHeader) throws Exception {
+        
+        ResponseBuilder builder = getBookByHeaderSimpleBuilder(headerBook, headerSimple);
+        if (serverInterceptorHeader != null) {
+            builder.header("ServerReaderInterceptor", serverInterceptorHeader);
+        }
+        if (clientInterceptorHeader != null) {
+            builder.header("ClientWriterInterceptor", clientInterceptorHeader);
+        }
+        return builder.build();
+    }
+    
+    private ResponseBuilder getBookByHeaderSimpleBuilder(@HeaderParam("BOOK") String headerBook,
+        @HeaderParam("Simple") String headerSimple) throws Exception {
         
         ResponseBuilder builder = Response.ok(doGetBook(headerBook));
         if (headerSimple != null) {
             builder.header("Simple", headerSimple);
         }
-        return builder.build();
+        return builder;
     }
     
     @GET

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=1387755&r1=1387754&r2=1387755&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 Wed Sep 19 21:11:57 2012
@@ -23,12 +23,17 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.client.ClientRequestContext;
 import javax.ws.rs.client.ClientRequestFilter;
 import javax.ws.rs.client.ClientResponseContext;
 import javax.ws.rs.client.ClientResponseFilter;
 import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.Response;
+import javax.ws.rs.ext.ReaderInterceptor;
+import javax.ws.rs.ext.ReaderInterceptorContext;
+import javax.ws.rs.ext.WriterInterceptor;
+import javax.ws.rs.ext.WriterInterceptorContext;
 
 import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase;
@@ -69,6 +74,7 @@ public class JAXRS20ClientServerBookTest
         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));
     }
     
@@ -79,16 +85,42 @@ public class JAXRS20ClientServerBookTest
         providers.add(new ClientCacheRequestFilter());
         providers.add(new ClientHeaderResponseFilter());
         WebClient wc = WebClient.create(address, providers);
-        Response r = wc.get();
+        Book theBook = new Book("Echo", 123L);
+        Response r = wc.post(theBook);
         assertEquals(201, r.getStatus());
         assertEquals("http://localhost/redirect", r.getHeaderString(HttpHeaders.LOCATION));
+        Book responseBook = r.readEntity(Book.class);
+        assertSame(theBook, responseBook);
+    }
+    
+    @Test
+    public void testPostBook() {
+        String address = "http://localhost:" + PORT + "/bookstore/bookheaders/simple";
+        List<Object> providers = new ArrayList<Object>();
+        providers.add(new ClientHeaderRequestFilter());
+        providers.add(new ClientHeaderResponseFilter());
+        providers.add(new ClientReaderInterceptor());
+        providers.add(new ClientWriterInterceptor());
+        WebClient wc = WebClient.create(address, providers);
+        WebClient.getConfig(wc).getHttpConduit().getClient().setReceiveTimeout(1000000L);
+        Book book = wc.post(new Book("Book", 126L), 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("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 {
 
         @Override
         public void filter(ClientRequestContext context) throws IOException {
-            context.abortWith(Response.status(201).build());
+            context.abortWith(Response.status(201).entity(context.getEntity()).build());
         }
     }
     
@@ -110,4 +142,25 @@ public class JAXRS20ClientServerBookTest
         }
         
     }
+    
+    public static class ClientReaderInterceptor implements ReaderInterceptor {
+
+        @Override
+        public Object aroundReadFrom(ReaderInterceptorContext context) throws IOException,
+            WebApplicationException {
+            context.getHeaders().add("ClientReaderInterceptor", "clientRead");
+            return context.proceed();
+        }
+        
+    }
+    
+    public static class ClientWriterInterceptor implements WriterInterceptor {
+
+        @Override
+        public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException {
+            context.getHeaders().add("ClientWriterInterceptor", "clientWrite");
+            context.proceed();
+        }
+        
+    }
 }

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=1387755&r1=1387754&r2=1387755&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 Wed Sep 19 21:11:57 2012
@@ -79,7 +79,7 @@ public class JAXRSClientServerBookTest e
     public static void startServers() throws Exception {
         AbstractResourceInfo.clearAllMaps();
         assertTrue("server did not launch correctly",
-                   launchServer(BookServer.class));
+                   launchServer(BookServer.class, true));
         createStaticBus();
     }