Author: sergeyb
Date: Wed Mar 20 15:41:34 2013
New Revision: 1458893

URL: http://svn.apache.org/r1458893
Log:
Adding few more ContainerResponseFilter tests with minor follow-up updates to 
do with setting the content type

Modified:
    
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java
    
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java
    
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.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/JAXRS20ClientServerBookTest.java

Modified: 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java
URL: 
http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java?rev=1458893&r1=1458892&r2=1458893&view=diff
==============================================================================
--- 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java
 (original)
+++ 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java
 Wed Mar 20 15:41:34 2013
@@ -129,6 +129,7 @@ public class JAXRSInvoker extends Abstra
                 return new MessageContentsList(Response.serverError().build());
             }
         } else {
+            setResponseContentTypeIfNeeded(exchange.getInMessage(), asyncObj);
             return new MessageContentsList(asyncObj);
         }
     }
@@ -259,27 +260,33 @@ public class JAXRSInvoker extends Abstra
 
                 return this.invoke(exchange, newParams, result);
             } catch (IOException ex) {
-                Response resp = JAXRSUtils.convertFaultToResponse(ex, 
exchange.getInMessage());
+                Response resp = JAXRSUtils.convertFaultToResponse(ex, 
inMessage);
                 if (resp == null) {
-                    resp = JAXRSUtils.convertFaultToResponse(ex, 
exchange.getInMessage());
+                    resp = JAXRSUtils.convertFaultToResponse(ex, inMessage);
                 }
                 return new MessageContentsList(resp);
             } catch (WebApplicationException ex) {
                 Response excResponse;
                 if (JAXRSUtils.noResourceMethodForOptions(ex.getResponse(), 
-                        
(String)exchange.getInMessage().get(Message.HTTP_REQUEST_METHOD))) {
+                        (String)inMessage.get(Message.HTTP_REQUEST_METHOD))) {
                     excResponse = 
JAXRSUtils.createResponse(Collections.singletonList(subCri), 
                                                             null, null, 200, 
true);
                 } else {
-                    excResponse = JAXRSUtils.convertFaultToResponse(ex, 
exchange.getInMessage());
+                    excResponse = JAXRSUtils.convertFaultToResponse(ex, 
inMessage);
                 }
                 return new MessageContentsList(excResponse);
             }
         }
-
+        setResponseContentTypeIfNeeded(inMessage, result);
         return result;
     }
     
+    private void setResponseContentTypeIfNeeded(Message inMessage, Object 
response) {
+        if (response instanceof Response) {
+            JAXRSUtils.setMessageContentType(inMessage, (Response)response);
+        }
+    }
+    
     private Object handleFault(Fault ex, Message inMessage, 
                                ClassResourceInfo cri, Method methodToInvoke) {
         String errorMessage = ex.getCause().getMessage();

Modified: 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java
URL: 
http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java?rev=1458893&r1=1458892&r2=1458893&view=diff
==============================================================================
--- 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java
 (original)
+++ 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java
 Wed Mar 20 15:41:34 2013
@@ -168,15 +168,18 @@ public final class ServerProviderFactory
         for (Map.Entry<NameKey, ProviderInfo<T>> entry : 
boundFilters.entrySet()) {
             String entryName = entry.getKey().getName();
             if (entryName.equals(DEFAULT_FILTER_NAME_BINDING)) {
-                map.put(entry.getValue(), Collections.<String>emptyList());
+                ProviderInfo<T> provider = entry.getValue(); 
+                map.put(provider, Collections.<String>emptyList());
             } else {
                 map.add(entry.getValue(), entryName);
             }
         }
         List<ProviderInfo<T>> list = new LinkedList<ProviderInfo<T>>();
         for (Map.Entry<ProviderInfo<T>, List<String>> entry : map.entrySet()) {
-            if (names.containsAll(entry.getValue())) {
-                list.add(entry.getKey());
+            List<String> values = entry.getValue();
+            if (names.containsAll(values)) {
+                ProviderInfo<T> provider = entry.getKey();
+                list.add(provider);
             }
         }
         return list;

Modified: 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
URL: 
http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java?rev=1458893&r1=1458892&r2=1458893&view=diff
==============================================================================
--- 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
 (original)
+++ 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
 Wed Mar 20 15:41:34 2013
@@ -138,6 +138,7 @@ import org.apache.cxf.jaxrs.provider.Abs
 import org.apache.cxf.jaxrs.provider.ProviderFactory;
 import org.apache.cxf.jaxrs.provider.ServerProviderFactory;
 import org.apache.cxf.jaxrs.utils.multipart.AttachmentUtils;
+import org.apache.cxf.message.Exchange;
 import org.apache.cxf.message.Message;
 import org.apache.cxf.message.MessageUtils;
 import org.apache.cxf.phase.PhaseInterceptorChain;
@@ -437,7 +438,7 @@ public final class JAXRSUtils {
                                 MediaType pMediaType = 
matchProduceTypes(acceptType, ori);
                                 if (mMatched && cMatched && pMediaType != 
null) {
                                     subresourcesOnly = false;
-                                    map.putSingle(MediaType.class.getName(), 
pMediaType.toString());
+                                    map.putSingle(Message.CONTENT_TYPE, 
pMediaType.toString());
                                     candidateList.put(ori, map);
                                     added = true;
                                 } else {
@@ -481,7 +482,7 @@ public final class JAXRSUtils {
                                
ori.getClassResourceInfo().getServiceClass().getName()).toString());
             }
             if (!ori.isSubResourceLocator()) {
-                List<String> responseContentType = 
matchedValues.remove(MediaType.class.getName());
+                List<String> responseContentType = 
matchedValues.remove(Message.CONTENT_TYPE);
                 if (responseContentType != null) {
                     message.getExchange().put(Message.CONTENT_TYPE, 
responseContentType.get(0));
                 }
@@ -1461,28 +1462,46 @@ public final class JAXRSUtils {
         return cls == null ? defaultExceptionType : cls;
     }
     
-    public static <T extends Throwable> Response convertFaultToResponse(T ex, 
Message inMessage) {
-        
+    public static <T extends Throwable> Response convertFaultToResponse(T ex, 
Message currentMessage) {
+        Message inMessage = currentMessage.getExchange().getInMessage();
+        Response response = null;
         if (ex.getClass() == WebApplicationException.class) {
             WebApplicationException webEx = (WebApplicationException)ex;
             if (webEx.getResponse().hasEntity() 
                 && webEx.getCause() == null
                 && 
MessageUtils.isTrue(inMessage.getContextualProperty(SUPPORT_WAE_SPEC_OPTIMIZATION)))
 {
-                return webEx.getResponse();
+                response = webEx.getResponse();
+                
             }
         }
-        
-        ExceptionMapper<T>  mapper =
-            
ServerProviderFactory.getInstance(inMessage).createExceptionMapper(ex.getClass(),
 inMessage);
-        if (mapper != null) {
-            try {
-                return mapper.toResponse(ex);
-            } catch (Exception mapperEx) {
-                mapperEx.printStackTrace();
-                return Response.serverError().build();
+        if (response == null) {
+            ExceptionMapper<T>  mapper =
+                
ServerProviderFactory.getInstance(inMessage).createExceptionMapper(ex.getClass(),
 inMessage);
+            if (mapper != null) {
+                try {
+                    response = mapper.toResponse(ex);
+                } catch (Exception mapperEx) {
+                    mapperEx.printStackTrace();
+                    return Response.serverError().build();
+                }
+            }
+        }
+        setMessageContentType(currentMessage, response);
+        return response;
+    }
+    
+    public static void setMessageContentType(Message message, Response 
response) {
+        if (response != null) {
+            Object ct = 
response.getHeaders().getFirst(HttpHeaders.CONTENT_TYPE);
+            if (ct != null) {
+                Exchange ex = message.getExchange();
+                if (ex.getInMessage() == message) {
+                    ex.put(Message.CONTENT_TYPE, ct.toString());
+                } else {
+                    message.put(Message.CONTENT_TYPE, ct.toString());
+                }
             }
         }
-        return null;
         
     }
     
@@ -1542,7 +1561,9 @@ public final class JAXRSUtils {
                 } catch (IOException ex) {
                     throw new InternalServerErrorException(ex);
                 }
-                if (m.getExchange().get(Response.class) != null) {
+                Response response = m.getExchange().get(Response.class);
+                if (response != null) {
+                    setMessageContentType(m, response);
                     return true;
                 }
             }

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=1458893&r1=1458892&r2=1458893&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 Mar 20 15:41:34 2013
@@ -31,6 +31,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import javax.annotation.Priority;
+import javax.ws.rs.InternalServerErrorException;
 import javax.ws.rs.NameBinding;
 import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.container.ContainerRequestContext;
@@ -42,6 +43,7 @@ import javax.ws.rs.container.PreMatching
 import javax.ws.rs.container.ResourceInfo;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.FeatureContext;
+import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
 import javax.ws.rs.ext.ReaderInterceptor;
 import javax.ws.rs.ext.ReaderInterceptorContext;
@@ -112,12 +114,20 @@ public class BookServer20 extends Abstra
 
         @Override
         public void filter(ContainerRequestContext context) throws IOException 
{
+            if 
("true".equals(context.getProperty("DynamicPrematchingFilter"))) {
+                throw new RuntimeException();
+            }
             context.setProperty("FirstPrematchingFilter", "true");
             
             UriInfo ui = context.getUriInfo();
             String path = ui.getPath(false);
             if ("wrongpath".equals(path)) {
                 
context.setRequestUri(URI.create("/bookstore/bookheaders/simple"));
+            } else if ("throwException".equals(path)) {
+                context.setProperty("filterexception", "prematch");
+                throw new InternalServerErrorException(
+                    Response.status(500).type("text/plain")
+                        .entity("Prematch filter error").build());
             }
         }
         
@@ -176,9 +186,16 @@ public class BookServer20 extends Abstra
     
     @CustomHeaderAdded
     private static class PostMatchContainerRequestFilter implements 
ContainerRequestFilter {
-
+        @Context
+        private UriInfo ui;
         @Override
         public void filter(ContainerRequestContext context) throws IOException 
{
+            if (ui.getQueryParameters().getFirst("throwException") != null) {
+                context.setProperty("filterexception", "postmatch");
+                throw new InternalServerErrorException(
+                    Response.status(500).type("text/plain")
+                        .entity("Postmatch filter error").build());
+            }
             String value = context.getHeaders().getFirst("Book");
             if (value != null) {
                 context.getHeaders().addFirst("Book", value + "3");
@@ -205,6 +222,13 @@ public class BookServer20 extends Abstra
         public void filter(ContainerRequestContext requestContext,
                            ContainerResponseContext responseContext) throws 
IOException {
             String ct = responseContext.getMediaType().toString();
+            if (requestContext.getProperty("filterexception") != null) {
+                if (!"text/plain".equals(ct)) {
+                    throw new RuntimeException();
+                }
+                responseContext.getHeaders().putSingle("FilterException", 
+                                                       
requestContext.getProperty("filterexception"));
+            }
             ct += ";charset=";
             responseContext.getHeaders().putSingle("Content-Type", ct);
             responseContext.getHeaders().add("Response", "OK");
@@ -218,8 +242,11 @@ public class BookServer20 extends Abstra
         @Override
         public void filter(ContainerRequestContext requestContext,
                            ContainerResponseContext responseContext) throws 
IOException {
-            if (!responseContext.getHeaders().containsKey("Response")
-                || 
!responseContext.getHeaders().containsKey("DynamicResponse")) {
+            if (!responseContext.getHeaders().containsKey("Response")) {
+                throw new RuntimeException();
+            }
+            if (!responseContext.getHeaders().containsKey("DynamicResponse")
+                && !"Prematch filter 
error".equals(responseContext.getEntity())) {
                 throw new RuntimeException();
             }
             responseContext.getHeaders().add("Response2", "OK2");
@@ -236,8 +263,10 @@ public class BookServer20 extends Abstra
         public void filter(ContainerRequestContext requestContext,
                            ContainerResponseContext responseContext) throws 
IOException {
             responseContext.getHeaders().add("Custom", "custom");
-            Book book = (Book)responseContext.getEntity();
-            responseContext.setEntity(new Book(book.getName(), 1 + 
book.getId()), null, null);
+            if (!responseContext.getEntity().equals("Postmatch filter error")) 
{
+                Book book = (Book)responseContext.getEntity();
+                responseContext.setEntity(new Book(book.getName(), 1 + 
book.getId()), null, null);
+            }
         }
         
     }

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=1458893&r1=1458892&r2=1458893&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 Mar 20 15:41:34 2013
@@ -93,6 +93,39 @@ public class JAXRS20ClientServerBookTest
     }
     
     @Test
+    public void testPreMatchContainerFilterThrowsException() {
+        String address = "http://localhost:"; + PORT + "/throwException";
+        WebClient wc = WebClient.create(address);
+        Response response = wc.get();
+        assertEquals(500, response.getStatus());
+        assertEquals("Prematch filter error", 
response.readEntity(String.class));
+        assertEquals("prematch", response.getHeaderString("FilterException"));
+        assertEquals("OK", response.getHeaderString("Response"));
+        assertEquals("OK2", response.getHeaderString("Response2"));
+        assertNull(response.getHeaderString("DynamicResponse"));
+        assertNull(response.getHeaderString("Custom"));
+        assertEquals("serverWrite", 
response.getHeaderString("ServerWriterInterceptor"));
+        assertEquals("text/plain;charset=us-ascii", 
response.getMediaType().toString());
+    }
+    
+    @Test
+    public void testPostMatchContainerFilterThrowsException() {
+        String address = "http://localhost:"; + PORT + 
"/bookstore/bookheaders/simple?throwException";
+        WebClient wc = WebClient.create(address);
+        
WebClient.getConfig(wc).getHttpConduit().getClient().setReceiveTimeout(1000000L);
+        Response response = wc.get();
+        assertEquals(500, response.getStatus());
+        assertEquals("Postmatch filter error", 
response.readEntity(String.class));
+        assertEquals("postmatch", response.getHeaderString("FilterException"));
+        assertEquals("OK", response.getHeaderString("Response"));
+        assertEquals("OK2", response.getHeaderString("Response2"));
+        assertEquals("Dynamic", response.getHeaderString("DynamicResponse"));
+        assertEquals("custom", response.getHeaderString("Custom"));
+        assertEquals("serverWrite", 
response.getHeaderString("ServerWriterInterceptor"));
+        assertEquals("text/plain;charset=us-ascii", 
response.getMediaType().toString());
+    }
+    
+    @Test
     public void testGetBookWrongPath() {
         String address = "http://localhost:"; + PORT + "/wrongpath";
         doTestGetBook(address);


Reply via email to