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/07/11 14:22:54 UTC

svn commit: r1502203 - in /cxf/branches/2.7.x-fixes: ./ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/CachingMessageBodyReader.java rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/CachingMessageBodyWriter.java

Author: sergeyb
Date: Thu Jul 11 12:22:53 2013
New Revision: 1502203

URL: http://svn.apache.org/r1502203
Log:
Merged revisions 1502200 via svnmerge from 
https://svn.apache.org/repos/asf/cxf/trunk

........
  r1502200 | sergeyb | 2013-07-11 13:18:44 +0100 (Thu, 11 Jul 2013) | 1 line
  
  Updates to caching JAXRS providers to handle lists of delegating providers, example, when XML and JSON providers are configured alongside it
........

Modified:
    cxf/branches/2.7.x-fixes/   (props changed)
    cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/CachingMessageBodyReader.java
    cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/CachingMessageBodyWriter.java

Propchange: cxf/branches/2.7.x-fixes/
------------------------------------------------------------------------------
  Merged /cxf/trunk:r1502200

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

Modified: cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/CachingMessageBodyReader.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/CachingMessageBodyReader.java?rev=1502203&r1=1502202&r2=1502203&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/CachingMessageBodyReader.java (original)
+++ cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/CachingMessageBodyReader.java Thu Jul 11 12:22:53 2013
@@ -23,6 +23,8 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
+import java.util.Collections;
+import java.util.List;
 
 import javax.ws.rs.NotAcceptableException;
 import javax.ws.rs.WebApplicationException;
@@ -35,16 +37,24 @@ import javax.ws.rs.ext.Provider;
 public class CachingMessageBodyReader<T> extends AbstractCachingMessageProvider<T>
     implements MessageBodyReader<T> {
     
-    private MessageBodyReader<T> delegatingReader;
+    private List<MessageBodyReader<T>> delegatingReaders;
     
     public boolean isReadable(Class<?> type, Type gType, Annotation[] anns, MediaType mt) {
-        if (delegatingReader != null) {
-            return delegatingReader.isReadable(type, gType, anns, mt);
+        if (delegatingReaders != null) {
+            return getDelegatingReader(type, gType, anns, mt) != null;
         } else {
             return isProviderKeyNotSet();
         }
     }
 
+    private MessageBodyReader<T> getDelegatingReader(Class<?> type, Type gType, Annotation[] anns, MediaType mt) {
+        for (MessageBodyReader<T> reader: delegatingReaders) {
+            if (reader.isReadable(type, gType, anns, mt)) {
+                return reader;
+            }
+        }
+        return null;
+    }
     
     public T readFrom(Class<T> type, Type gType, Annotation[] anns, MediaType mt,
                         MultivaluedMap<String, String> theheaders, InputStream is) 
@@ -56,8 +66,8 @@ public class CachingMessageBodyReader<T>
     
     
     protected MessageBodyReader<T> getReader(Class<?> type, Type gType, Annotation[] anns, MediaType mt) {
-        if (delegatingReader != null) {
-            return delegatingReader;
+        if (delegatingReaders != null) {
+            return getDelegatingReader(type, gType, anns, mt);
         }
         MessageBodyReader<T> r = null;
         
@@ -79,4 +89,12 @@ public class CachingMessageBodyReader<T>
         return r;
     }
 
+    public void setDelegatingReader(MessageBodyReader<T> reader) {
+        this.delegatingReaders = Collections.singletonList(reader);
+    }
+    
+    public void setDelegatingReaders(List<MessageBodyReader<T>> readers) {
+        this.delegatingReaders = readers;
+    }
+
 }

Modified: cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/CachingMessageBodyWriter.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/CachingMessageBodyWriter.java?rev=1502203&r1=1502202&r2=1502203&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/CachingMessageBodyWriter.java (original)
+++ cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/CachingMessageBodyWriter.java Thu Jul 11 12:22:53 2013
@@ -23,6 +23,8 @@ import java.io.IOException;
 import java.io.OutputStream;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
+import java.util.Collections;
+import java.util.List;
 
 import javax.ws.rs.InternalServerErrorException;
 import javax.ws.rs.WebApplicationException;
@@ -35,20 +37,28 @@ import javax.ws.rs.ext.Provider;
 public class CachingMessageBodyWriter<T> extends AbstractCachingMessageProvider<T>
     implements MessageBodyWriter<T> {
     
-    private MessageBodyWriter<T> delegatingWriter;
+    private List<MessageBodyWriter<T>> delegatingWriters;
     
     public long getSize(T t, Class<?> type, Type gType, Annotation[] anns, MediaType mediaType) {
         return -1;
     }
 
     public boolean isWriteable(Class<?> type, Type gType, Annotation[] anns, MediaType mt) {
-        if (delegatingWriter != null) {
-            return delegatingWriter.isWriteable(type, gType, anns, mt);
+        if (delegatingWriters != null) {
+            return getDelegatingWriter(type, gType, anns, mt) != null;
         } else {
             return isProviderKeyNotSet();
         }
     }
 
+    private MessageBodyWriter<T> getDelegatingWriter(Class<?> type, Type gType, Annotation[] anns, MediaType mt) {
+        for (MessageBodyWriter<T> writer: delegatingWriters) {
+            if (writer.isWriteable(type, gType, anns, mt)) {
+                return writer;
+            }
+        }
+        return null;
+    }
     
     public void writeTo(T obj, Class<?> type, Type gType, Annotation[] anns, MediaType mt,
                         MultivaluedMap<String, Object> theheaders, OutputStream os) 
@@ -59,8 +69,8 @@ public class CachingMessageBodyWriter<T>
     
     
     protected MessageBodyWriter<T> getWriter(Class<?> type, Type gType, Annotation[] anns, MediaType mt) {
-        if (delegatingWriter != null) {
-            return delegatingWriter;
+        if (delegatingWriters != null) {
+            return getDelegatingWriter(type, gType, anns, mt);
         }
         MessageBodyWriter<T> w = null;
         
@@ -81,4 +91,12 @@ public class CachingMessageBodyWriter<T>
         }
         return w;
     }
+    
+    public void setDelegatingWriter(MessageBodyWriter<T> writer) {
+        this.delegatingWriters = Collections.singletonList(writer);
+    }
+    
+    public void setDelegatingWriters(List<MessageBodyWriter<T>> writers) {
+        this.delegatingWriters = writers;
+    }
 }