You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2009/08/27 19:11:41 UTC

svn commit: r808540 - in /cxf/branches/2.2.x-fixes: ./ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ systests/sr...

Author: dkulp
Date: Thu Aug 27 17:11:40 2009
New Revision: 808540

URL: http://svn.apache.org/viewvc?rev=808540&view=rev
Log:
Merged revisions 808107 via svnmerge from 
https://svn.apache.org/repos/asf/cxf/trunk

........
  r808107 | sergeyb | 2009-08-26 12:26:40 -0400 (Wed, 26 Aug 2009) | 1 line
  
  JAXRS : supporting the injection of proxified providers and sorting message providers by type
........

Modified:
    cxf/branches/2.2.x-fixes/   (props changed)
    cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
    cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
    cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java
    cxf/branches/2.2.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerProxySpringBookTest.java
    cxf/branches/2.2.x-fixes/systests/src/test/resources/jaxrs_proxy/WEB-INF/beans.xml

Propchange: cxf/branches/2.2.x-fixes/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Aug 27 17:11:40 2009
@@ -1 +1 @@
-/cxf/trunk:782728-782730,783097,783294,783396,784059,784181-784184,784893,784895,785279-785282,785468,785621,785624,785651,785734,785866,786142,786271-786272,786395,786512,786514,786582-786583,786638,786647,786850,787200,787269,787277-787279,787290-787291,787305,787323,787366,787849,788030,788060,788187,788444,788451,788703,788752,788774,788819-788820,789013,789371,789387,789420,789527-789530,789704-789705,789788,789811,789896-789901,790074,790094,790134,790188,790294,790553,790637-790644,790868,791301,791354,791538,791753,791947,792007,792096,792183,792261-792265,792271,792604,792683-792685,792975,792985,793059,793570,794297,794396,794680,794728,794771,794778-794780,794892,795044,795104,795160,795583,795907,796022-796023,796352,796593,796741,796780,796994-796997,797117,797159,797192,797194,797231-797233,797442,797505,797517,797534,797581-797583,797587,797640,797651,797699,797882-797883,798344-798346,798363,798461,798479,798533,798551,798557,798561-798562,798570,798573,79858
 4,798654,798748-798749,798816,798891,798929-798930,799245,799267,799439,799448,799637,799723-799724,799792,800453,800497-800498,801380-801381,801447,801962,802892,803056,803129,803419,803460,803493,803689,804002,804175,804276,805784,805907,805909,806020-806021,806023,806405-806406,806576,806602-806604,806620,806627,806631,806633,806638,806687,806876,806922,806979-806982,807181,807205,807295,807748,807807,808035,808069,808085
+/cxf/trunk:782728-782730,783097,783294,783396,784059,784181-784184,784893,784895,785279-785282,785468,785621,785624,785651,785734,785866,786142,786271-786272,786395,786512,786514,786582-786583,786638,786647,786850,787200,787269,787277-787279,787290-787291,787305,787323,787366,787849,788030,788060,788187,788444,788451,788703,788752,788774,788819-788820,789013,789371,789387,789420,789527-789530,789704-789705,789788,789811,789896-789901,790074,790094,790134,790188,790294,790553,790637-790644,790868,791301,791354,791538,791753,791947,792007,792096,792183,792261-792265,792271,792604,792683-792685,792975,792985,793059,793570,794297,794396,794680,794728,794771,794778-794780,794892,795044,795104,795160,795583,795907,796022-796023,796352,796593,796741,796780,796994-796997,797117,797159,797192,797194,797231-797233,797442,797505,797517,797534,797581-797583,797587,797640,797651,797699,797882-797883,798344-798346,798363,798461,798479,798533,798551,798557,798561-798562,798570,798573,79858
 4,798654,798748-798749,798816,798891,798929-798930,799245,799267,799439,799448,799637,799723-799724,799792,800453,800497-800498,801380-801381,801447,801962,802892,803056,803129,803419,803460,803493,803689,804002,804175,804276,805784,805907,805909,806020-806021,806023,806405-806406,806576,806602-806604,806620,806627,806631,806633,806638,806687,806876,806922,806979-806982,807181,807205,807295,807748,807807,808035,808069,808085,808107

Propchange: cxf/branches/2.2.x-fixes/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.

Modified: cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java?rev=808540&r1=808539&r2=808540&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java (original)
+++ cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java Thu Aug 27 17:11:40 2009
@@ -38,6 +38,7 @@
 
 import org.apache.cxf.Bus;
 import org.apache.cxf.common.logging.LogUtils;
+import org.apache.cxf.common.util.ClassHelper;
 import org.apache.cxf.endpoint.Endpoint;
 import org.apache.cxf.jaxrs.client.ResponseExceptionMapper;
 import org.apache.cxf.jaxrs.ext.ParameterHandler;
@@ -185,7 +186,7 @@
         if (candidates.size() == 0) {
             return null;
         }
-        Collections.sort(candidates, new ParameterHandlerComparator());
+        Collections.sort(candidates, new ClassComparator());
         return candidates.get(0);
     }
     
@@ -201,20 +202,25 @@
         if (candidates.size() == 0) {
             return null;
         }
-        Collections.sort(candidates, new ResponseExceptionMapperComparator());
+        Collections.sort(candidates, new ClassComparator());
         return candidates.get(0);
     }
     
     private static void handleMapper(List<Object> candidates, ProviderInfo em, 
                                      Class<?> expectedType, Message m) {
         
-        Type[] types = em.getProvider().getClass().getGenericInterfaces();
+        Class<?> mapperClass =  ClassHelper.getRealClass(em.getProvider());
+        Type[] types = getGenericInterfaces(mapperClass);
         for (Type t : types) {
             if (t instanceof ParameterizedType) {
                 ParameterizedType pt = (ParameterizedType)t;
                 Type[] args = pt.getActualTypeArguments();
                 for (int i = 0; i < args.length; i++) {
-                    if (((Class<?>)args[i]).isAssignableFrom(expectedType)) {
+                    Class<?> actualClass = InjectionUtils.getRawType(args[i]);
+                    if (actualClass == null) {
+                        continue;
+                    }
+                    if (actualClass.isAssignableFrom(expectedType)) {
                         if (m != null) {
                             InjectionUtils.injectContextFields(em.getProvider(), em, m);
                             InjectionUtils.injectContextMethods(em.getProvider(), em, m);
@@ -294,35 +300,37 @@
             if (o == null) {
                 continue;
             }
-            if (MessageBodyReader.class.isAssignableFrom(o.getClass())) {
+            Class<?> oClass = ClassHelper.getRealClass(o);
+            
+            if (MessageBodyReader.class.isAssignableFrom(oClass)) {
                 messageReaders.add(new ProviderInfo<MessageBodyReader>((MessageBodyReader)o)); 
             }
             
-            if (MessageBodyWriter.class.isAssignableFrom(o.getClass())) {
+            if (MessageBodyWriter.class.isAssignableFrom(oClass)) {
                 messageWriters.add(new ProviderInfo<MessageBodyWriter>((MessageBodyWriter)o)); 
             }
             
-            if (ContextResolver.class.isAssignableFrom(o.getClass())) {
+            if (ContextResolver.class.isAssignableFrom(oClass)) {
                 contextResolvers.add(new ProviderInfo<ContextResolver>((ContextResolver)o)); 
             }
             
-            if (RequestHandler.class.isAssignableFrom(o.getClass())) {
+            if (RequestHandler.class.isAssignableFrom(oClass)) {
                 requestHandlers.add(new ProviderInfo<RequestHandler>((RequestHandler)o)); 
             }
             
-            if (ResponseHandler.class.isAssignableFrom(o.getClass())) {
+            if (ResponseHandler.class.isAssignableFrom(oClass)) {
                 responseHandlers.add(new ProviderInfo<ResponseHandler>((ResponseHandler)o)); 
             }
             
-            if (ExceptionMapper.class.isAssignableFrom(o.getClass())) {
+            if (ExceptionMapper.class.isAssignableFrom(oClass)) {
                 exceptionMappers.add(new ProviderInfo<ExceptionMapper>((ExceptionMapper)o)); 
             }
             
-            if (ResponseExceptionMapper.class.isAssignableFrom(o.getClass())) {
+            if (ResponseExceptionMapper.class.isAssignableFrom(oClass)) {
                 responseExceptionMappers.add(new ProviderInfo<ResponseExceptionMapper>((ResponseExceptionMapper)o)); 
             }
             
-            if (ParameterHandler.class.isAssignableFrom(o.getClass())) {
+            if (ParameterHandler.class.isAssignableFrom(oClass)) {
                 paramHandlers.add(new ProviderInfo<ParameterHandler>((ParameterHandler)o)); 
             }
         }
@@ -377,16 +385,23 @@
                                                          Annotation[] annotations,
                                                          MediaType mediaType,
                                                          Message m) {
+        List<MessageBodyReader<T>> candidates = new LinkedList<MessageBodyReader<T>>();
         for (ProviderInfo<MessageBodyReader> ep : messageReaders) {
-            
             if (matchesReaderCriterias(ep.getProvider(), type, genericType, annotations, mediaType)) {
-                InjectionUtils.injectContextFields(ep.getProvider(), ep, m);
-                InjectionUtils.injectContextMethods(ep.getProvider(), ep, m);
-                return ep.getProvider();
+                if (this == SHARED_FACTORY) {
+                    InjectionUtils.injectContextFields(ep.getProvider(), ep, m);
+                    InjectionUtils.injectContextMethods(ep.getProvider(), ep, m);
+                    return ep.getProvider();
+                }
+                handleMapper((List)candidates, ep, type, m);
             }
         }     
         
-        return null;
+        if (candidates.size() == 0) {
+            return null;
+        }
+        Collections.sort(candidates, new ClassComparator());
+        return candidates.get(0);
         
     }
     
@@ -424,16 +439,22 @@
                                                          Annotation[] annotations,
                                                          MediaType mediaType,
                                                          Message m) {
+        List<MessageBodyWriter<T>> candidates = new LinkedList<MessageBodyWriter<T>>();
         for (ProviderInfo<MessageBodyWriter> ep : messageWriters) {
             if (matchesWriterCriterias(ep.getProvider(), type, genericType, annotations, mediaType)) {
-                InjectionUtils.injectContextFields(ep.getProvider(), ep, m);
-                InjectionUtils.injectContextMethods(ep.getProvider(), ep, m);
-                return ep.getProvider();
+                if (this == SHARED_FACTORY) {
+                    InjectionUtils.injectContextFields(ep.getProvider(), ep, m);
+                    InjectionUtils.injectContextMethods(ep.getProvider(), ep, m);
+                    return ep.getProvider();
+                }
+                handleMapper((List)candidates, ep, type, m);
             }
         }     
-        
-        return null;
-        
+        if (candidates.size() == 0) {
+            return null;
+        }
+        Collections.sort(candidates, new ClassComparator());
+        return candidates.get(0);
     }
     
     private <T> boolean matchesWriterCriterias(MessageBodyWriter<T> ep,
@@ -490,7 +511,6 @@
             types2 = JAXRSUtils.sortMediaTypes(types2);
     
             return JAXRSUtils.compareSortedMediaTypes(types1, types2);
-            
         }
     }
     
@@ -508,7 +528,6 @@
                 JAXRSUtils.sortMediaTypes(JAXRSUtils.getProviderProduceTypes(e2));
     
             return JAXRSUtils.compareSortedMediaTypes(types1, types2);
-            
         }
     }
     
@@ -596,34 +615,32 @@
 
         public int compare(ExceptionMapper<? extends Throwable> em1, 
                            ExceptionMapper<? extends Throwable> em2) {
-            return compareClasses(em1.getClass(), em2.getClass());
+            return compareClasses(em1, em2);
         }
         
     }
     
-    private static class ResponseExceptionMapperComparator implements 
-        Comparator<ResponseExceptionMapper<? extends Throwable>> {
+    private static class ClassComparator implements 
+        Comparator<Object> {
     
-        public int compare(ResponseExceptionMapper<? extends Throwable> em1, 
-                           ResponseExceptionMapper<? extends Throwable> em2) {
-            return compareClasses(em1.getClass(), em2.getClass());
+        public int compare(Object em1, Object em2) {
+            return compareClasses(em1, em2);
         }
         
     }
     
-    private static class ParameterHandlerComparator implements 
-        Comparator<ParameterHandler<? extends Object>> {
-
-        public int compare(ParameterHandler<? extends Object> em1, 
-                           ParameterHandler<? extends Object> em2) {
-            return compareClasses(em1.getClass(), em2.getClass());
+    private static int compareClasses(Object o1, Object o2) {
+        Class<?> cl1 = ClassHelper.getRealClass(o1); 
+        Class<?> cl2 = ClassHelper.getRealClass(o2);
+        
+        Type[] types1 = getGenericInterfaces(cl1);
+        Type[] types2 = getGenericInterfaces(cl2);
+        
+        if (types1.length == 0 && types2.length > 0) {
+            return 1;
+        } else if (types1.length > 0 && types2.length == 0) {
+            return -1;
         }
-    
-    }
-    
-    private static int compareClasses(Class<?> cl1, Class<?> cl2) {
-        Type[] types1 = cl1.getGenericInterfaces();
-        Type[] types2 = cl2.getGenericInterfaces();
         
         Class<?> realClass1 = InjectionUtils.getActualType(types1[0]);
         Class<?> realClass2 = InjectionUtils.getActualType(types2[0]);
@@ -636,4 +653,15 @@
         }
         return -1;
     }
+    
+    private static Type[] getGenericInterfaces(Class<?> cls) {
+        if (Object.class == cls) {
+            return new Type[]{};
+        }
+        Type[] types = cls.getGenericInterfaces();
+        if (types.length > 0) {
+            return types;
+        }
+        return getGenericInterfaces(cls.getSuperclass());
+    }
 }

Modified: cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java?rev=808540&r1=808539&r2=808540&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java (original)
+++ cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java Thu Aug 27 17:11:40 2009
@@ -209,6 +209,22 @@
         return t instanceof Class ? (Class<?>)t : getActualType(t, pos);
     }
     
+    public static Class<?> getRawType(Type genericType) {
+        
+        if (genericType == null) {
+            return null;
+        }
+        if (!ParameterizedType.class.isAssignableFrom(genericType.getClass())) {
+            return (Class<?>)genericType;
+        }
+        ParameterizedType paramType = (ParameterizedType)genericType;
+        
+        Type t = paramType.getRawType();
+        
+        return t instanceof Class ? (Class<?>)t : null;
+    }
+    
+    
     public static Type[] getActualTypes(Type genericType) {
         if (genericType == null 
             || !ParameterizedType.class.isAssignableFrom(genericType.getClass())) {

Modified: cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java?rev=808540&r1=808539&r2=808540&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java (original)
+++ cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java Thu Aug 27 17:11:40 2009
@@ -55,6 +55,7 @@
 import org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper;
 import org.apache.cxf.jaxrs.model.ProviderInfo;
 import org.apache.cxf.jaxrs.resources.Book;
+import org.apache.cxf.jaxrs.resources.SuperBook;
 import org.apache.cxf.jaxrs.utils.JAXRSUtils;
 import org.apache.cxf.message.Exchange;
 import org.apache.cxf.message.ExchangeImpl;
@@ -164,6 +165,29 @@
     }
     
     @Test
+    public void testMessageBodyHandlerHierarchy() throws Exception {
+        ProviderFactory pf = ProviderFactory.getInstance();
+        List<Object> providers = new ArrayList<Object>();
+        BookReaderWriter bookHandler = new BookReaderWriter();
+        providers.add(bookHandler);
+        SuperBookReaderWriter superBookHandler = new SuperBookReaderWriter();
+        providers.add(superBookHandler);
+        pf.setUserProviders(providers);
+        assertSame(bookHandler, 
+                   pf.createMessageBodyReader(Book.class, Book.class, new Annotation[]{}, 
+                                              MediaType.APPLICATION_XML_TYPE, new MessageImpl()));
+        assertSame(superBookHandler, 
+                   pf.createMessageBodyReader(SuperBook.class, SuperBook.class, new Annotation[]{}, 
+                                              MediaType.APPLICATION_XML_TYPE, new MessageImpl()));
+        assertSame(bookHandler, 
+                   pf.createMessageBodyWriter(Book.class, Book.class, new Annotation[]{}, 
+                                              MediaType.APPLICATION_XML_TYPE, new MessageImpl()));
+        assertSame(superBookHandler, 
+                   pf.createMessageBodyWriter(SuperBook.class, SuperBook.class, new Annotation[]{}, 
+                                              MediaType.APPLICATION_XML_TYPE, new MessageImpl()));
+    }
+    
+    @Test
     public void testSortEntityProviders() throws Exception {
         ProviderFactory pf = ProviderFactory.getInstance();
         pf.registerUserProvider(new TestStringProvider());
@@ -179,8 +203,6 @@
         assertTrue(indexOf(writers, TestStringProvider.class) 
                    < indexOf(writers, PrimitiveTextProvider.class));
         
-        //REVISIT the compare algorithm
-        //assertTrue(indexOf(providers, JSONProvider.class) < indexOf(providers, TestStringProvider.class));
     }
     
     @Test
@@ -284,7 +306,7 @@
     public void testRegisterCustomJSONEntityProvider() throws Exception {
         ProviderFactory pf = ProviderFactory.getInstance();
         pf.registerUserProvider(new CustomJSONProvider());
-        verifyProvider(pf, org.apache.cxf.jaxrs.resources.Book.class, CustomJSONProvider.class, 
+        verifyProvider(pf, Book.class, CustomJSONProvider.class, 
                        "application/json");
     }
     
@@ -375,7 +397,7 @@
     @Consumes("application/json")
     @Produces("application/json")
     private final class CustomJSONProvider 
-        implements MessageBodyReader<String>, MessageBodyWriter<String>  {
+        implements MessageBodyReader<Book>, MessageBodyWriter<Book>  {
 
         public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations,
                                   MediaType m) {
@@ -387,18 +409,18 @@
             return type.getAnnotation(XmlRootElement.class) != null;
         }
         
-        public long getSize(String s, Class<?> type, Type genericType, Annotation[] annotations,
+        public long getSize(Book b, Class<?> type, Type genericType, Annotation[] annotations,
                             MediaType m) {
-            return s.length();
+            return -1;
         }
 
-        public String readFrom(Class<String> clazz, Type genericType, Annotation[] annotations, 
+        public Book readFrom(Class<Book> clazz, Type genericType, Annotation[] annotations, 
                                MediaType m, MultivaluedMap<String, String> headers, InputStream is) {    
             //Dummy
             return null;
         }
 
-        public void writeTo(String obj, Class<?> clazz, Type genericType, Annotation[] annotations,  
+        public void writeTo(Book obj, Class<?> clazz, Type genericType, Annotation[] annotations,  
             MediaType m, MultivaluedMap<String, Object> headers, OutputStream os) {
             //Dummy
         }
@@ -408,7 +430,7 @@
     @Consumes("application/widget")
     @Produces("application/widget")
     private final class CustomWidgetProvider
-        implements MessageBodyReader<String>, MessageBodyWriter<String>  {
+        implements MessageBodyReader<Book>, MessageBodyWriter<Book>  {
 
         public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations,
                                   MediaType m) {
@@ -420,19 +442,19 @@
             return type.getAnnotation(XmlRootElement.class) != null;
         }
         
-        public long getSize(String s, Class<?> type, Type genericType, Annotation[] annotations,
+        public long getSize(Book s, Class<?> type, Type genericType, Annotation[] annotations,
                             MediaType m) {
-            return s.length();
+            return -1;
         }
 
 
-        public String readFrom(Class<String> clazz, Type genericType, Annotation[] annotations, 
+        public Book readFrom(Class<Book> clazz, Type genericType, Annotation[] annotations, 
                                MediaType m, MultivaluedMap<String, String> headers, InputStream is) {    
             //Dummy
             return null;
         }
 
-        public void writeTo(String obj, Class<?> clazz, Type genericType, Annotation[] annotations,  
+        public void writeTo(Book obj, Class<?> clazz, Type genericType, Annotation[] annotations,  
             MediaType m, MultivaluedMap<String, Object> headers, OutputStream os) {
             //Dummy
         }
@@ -460,5 +482,78 @@
         }
         
     }
-     
+    
+    @Produces("application/xml")
+    @Consumes("application/xml")
+    private static class BookReaderWriter 
+        implements MessageBodyReader<Book>, MessageBodyWriter<Book> {
+
+        public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, 
+                                  MediaType mediaType) {
+            return true;
+        }
+
+        public Book readFrom(Class<Book> arg0, Type arg1, Annotation[] arg2, 
+                             MediaType arg3, MultivaluedMap<String, String> arg4, InputStream arg5) 
+            throws IOException, WebApplicationException {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        public long getSize(Book t, Class<?> type, Type genericType, Annotation[] annotations, 
+                            MediaType mediaType) {
+            // TODO Auto-generated method stub
+            return 0;
+        }
+
+        public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, 
+                                   MediaType mediaType) {
+            return true;
+        }
+
+        public void writeTo(Book arg0, Class<?> arg1, Type arg2, Annotation[] arg3, 
+                            MediaType arg4, MultivaluedMap<String, Object> arg5, OutputStream arg6) 
+            throws IOException, WebApplicationException {
+            // TODO Auto-generated method stub
+            
+        }
+    }
+    
+    @Produces("application/xml")
+    @Consumes("application/xml")
+    private static class SuperBookReaderWriter 
+        implements MessageBodyReader<SuperBook>, MessageBodyWriter<SuperBook> {
+
+        public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, 
+                                  MediaType mediaType) {
+            return true;
+        }
+
+        public SuperBook readFrom(Class<SuperBook> arg0, Type arg1, Annotation[] arg2, MediaType arg3, 
+                                  MultivaluedMap<String, String> arg4, InputStream arg5) 
+            throws IOException, WebApplicationException {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        public long getSize(SuperBook t, Class<?> type, Type genericType, 
+                            Annotation[] annotations, MediaType mediaType) {
+            // TODO Auto-generated method stub
+            return 0;
+        }
+
+        public boolean isWriteable(Class<?> type, Type genericType, 
+                                   Annotation[] annotations, MediaType mediaType) {
+            return true;
+        }
+
+        public void writeTo(SuperBook arg0, Class<?> arg1, Type arg2, 
+                            Annotation[] arg3, MediaType arg4, MultivaluedMap<String, Object> arg5, 
+                            OutputStream arg6) throws IOException, WebApplicationException {
+            // TODO Auto-generated method stub
+            
+        }
+        
+    }
+    
 }

Modified: cxf/branches/2.2.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerProxySpringBookTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerProxySpringBookTest.java?rev=808540&r1=808539&r2=808540&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerProxySpringBookTest.java (original)
+++ cxf/branches/2.2.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerProxySpringBookTest.java Thu Aug 27 17:11:40 2009
@@ -20,6 +20,7 @@
 package org.apache.cxf.systest.jaxrs;
 
 import java.io.InputStream;
+import java.net.HttpURLConnection;
 import java.net.URL;
 import java.net.URLConnection;
 
@@ -38,6 +39,26 @@
     }
     
     @Test
+    public void testGetBookNotFound() throws Exception {
+        
+        String endpointAddress =
+            "http://localhost:9080/test/bookstore/books/12345"; 
+        URL url = new URL(endpointAddress);
+        HttpURLConnection connect = (HttpURLConnection)url.openConnection();
+        connect.addRequestProperty("Accept", "text/plain,application/xml");
+        assertEquals(500, connect.getResponseCode());
+        InputStream in = connect.getErrorStream();
+        assertNotNull(in);           
+
+        InputStream expected = getClass()
+            .getResourceAsStream("resources/expected_get_book_notfound_mapped.txt");
+
+        assertEquals("Exception is not mapped correctly", 
+                     getStringFromInputStream(expected).trim(),
+                     getStringFromInputStream(in).trim());
+    }
+    
+    @Test
     public void testGetThatBook123() throws Exception {
         getBook("http://localhost:9080/test/bookstorestorage/thosebooks/123");
     }

Modified: cxf/branches/2.2.x-fixes/systests/src/test/resources/jaxrs_proxy/WEB-INF/beans.xml
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/systests/src/test/resources/jaxrs_proxy/WEB-INF/beans.xml?rev=808540&r1=808539&r2=808540&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/systests/src/test/resources/jaxrs_proxy/WEB-INF/beans.xml (original)
+++ cxf/branches/2.2.x-fixes/systests/src/test/resources/jaxrs_proxy/WEB-INF/beans.xml Thu Aug 27 17:11:40 2009
@@ -45,11 +45,18 @@
     <jaxrs:serviceBeans>
       <ref bean="bookstore"/>
       <ref bean="bookstoreInterface"/>
-    </jaxrs:serviceBeans>		   
+    </jaxrs:serviceBeans>
+    <jaxrs:providers>
+      <ref bean="exceptionMapper"/>
+      <ref bean="exceptionMapper2"/>
+    </jaxrs:providers>		   
   </jaxrs:server>
   <bean id="bookstore" class="org.apache.cxf.systest.jaxrs.BookStore"/>
   <bean id="bookstoreInterface" class="org.apache.cxf.systest.jaxrs.BookStoreWithInterface"/>
-  
+  <bean id="exceptionMapper" class="org.apache.cxf.systest.jaxrs.BookExceptionMapper">
+      <property name="toHandle" value="true"/>
+  </bean>   
+  <bean id="exceptionMapper2" class="org.apache.cxf.systest.jaxrs.BookExceptionMapper"/>  
   <jaxrs:server id="bookservice2" address="/2"
     modelRef="classpath:/org/apache/cxf/systest/jaxrs/resources/resources.xml">
     <jaxrs:serviceBeans>
@@ -71,10 +78,10 @@
 		<aop:aspect id="loggingAspect" ref="simpleLogger">
 			<aop:before
 			      method="logBefore"
-			      pointcut="execution(* org.apache.cxf.systest.jaxrs.BookStore*.*(..))"/>
+			      pointcut="execution(* org.apache.cxf.systest.jaxrs.Book*.*(..))"/>
 			<aop:after-returning
 			      method="logAfter"
-			      pointcut="execution(* org.apache.cxf.systest.jaxrs.BookStore*.*(..))"/>
+			      pointcut="execution(* org.apache.cxf.systest.jaxrs.Book*.*(..))"/>
 		</aop:aspect>
 	</aop:config>