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/10/09 22:42:29 UTC

svn commit: r1396302 - in /cxf/trunk: rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/

Author: sergeyb
Date: Tue Oct  9 20:42:29 2012
New Revision: 1396302

URL: http://svn.apache.org/viewvc?rev=1396302&view=rev
Log:
[CXF-4552] Collections of parts annotated with @Multipart are nor processed with form data payloads containing a single file only

Modified:
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/MultipartProvider.java
    cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultipartTest.java
    cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/MultipartStore.java

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/MultipartProvider.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/MultipartProvider.java?rev=1396302&r1=1396301&r2=1396302&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/MultipartProvider.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/MultipartProvider.java Tue Oct  9 20:42:29 2012
@@ -195,25 +195,38 @@ public class MultipartProvider extends A
         } else if (Attachment.class.isAssignableFrom(c)) {
             return multipart;
         } else {
+            boolean isCollection = Collection.class.isAssignableFrom(c);
+            boolean isRecursive = false;
             if (mediaTypeSupported(multipart.getContentType())) {
                 mc.put("org.apache.cxf.multipart.embedded", true);
                 mc.put("org.apache.cxf.multipart.embedded.ctype", multipart.getContentType());
                 mc.put("org.apache.cxf.multipart.embedded.input", 
                        multipart.getDataHandler().getInputStream());
                 anns = new Annotation[]{};
+                isRecursive = true;
             }
-            MessageBodyReader<T> r = 
-                mc.getProviders().getMessageBodyReader(c, t, anns, multipart.getContentType());
-            if (r != null) {
-                InputStream is = multipart.getDataHandler().getInputStream();
-                is = decodeIfNeeded(multipart, is);
-                return r.readFrom(c, t, anns, multipart.getContentType(), multipart.getHeaders(), 
-                                  is);
+            if (isCollection && !isRecursive) {
+                c = convertTypeToClass(t);
+                return Collections.singletonList(fromAttachment(multipart, c, c, anns));
+            } else {
+                MessageBodyReader<T> r = 
+                    mc.getProviders().getMessageBodyReader(c, t, anns, multipart.getContentType());
+                if (r != null) {
+                    InputStream is = multipart.getDataHandler().getInputStream();
+                    is = decodeIfNeeded(multipart, is);
+                    return r.readFrom(c, t, anns, multipart.getContentType(), multipart.getHeaders(), 
+                                      is);
+                }
             }
         }
         return null;
     }
     
+    @SuppressWarnings("unchecked")
+    private <T> Class<T> convertTypeToClass(Type t) {
+        return (Class<T>)InjectionUtils.getActualType(t, 0);
+    }
+    
     private InputStream decodeIfNeeded(Attachment multipart, InputStream is) {
         String value = multipart.getHeader("Content-Transfer-Encoding");
         if ("base64".equals(value) || "quoted-printable".equals(value)) {

Modified: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultipartTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultipartTest.java?rev=1396302&r1=1396301&r2=1396302&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultipartTest.java (original)
+++ cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultipartTest.java Tue Oct  9 20:42:29 2012
@@ -135,6 +135,12 @@ public class JAXRSMultipartTest extends 
     }
     
     @Test
+    public void testBookJSONFormOneFileWhereManyExpected() throws Exception {
+        String address = "http://localhost:" + PORT + "/bookstore/books/filesform/singlefile";
+        doAddFormBook(address, "attachmentFormJsonFile", 200);               
+    }
+    
+    @Test
     public void testBookJSONFormTwoFilesMixUp() throws Exception {
         String address = "http://localhost:" + PORT + "/bookstore/books/filesform/mixup";
         doAddFormBook(address, "attachmentFormJsonFiles", 200);               

Modified: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/MultipartStore.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/MultipartStore.java?rev=1396302&r1=1396301&r2=1396302&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/MultipartStore.java (original)
+++ cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/MultipartStore.java Tue Oct  9 20:42:29 2012
@@ -444,6 +444,26 @@ public class MultipartStore {
     }
     
     @POST
+    @Path("/books/filesform/singlefile")
+    @Produces("text/xml")
+    @Consumes("multipart/form-data")
+    public Response addBookFilesFormSingleFile(@Multipart("owner") String name, 
+                                     @Multipart("file") List<Book> books) 
+        throws Exception {
+        if (books.size() != 1) {
+            throw new WebApplicationException();
+        }
+        Book b = books.get(0);
+        if (!"CXF in Action - 1".equals(b.getName())
+            || !"Larry".equals(name)) {
+            throw new WebApplicationException();
+        }
+        b.setId(124);
+        b.setName("CXF in Action - 2");
+        return Response.ok(b).build();
+    }
+    
+    @POST
     @Path("/books/filesform/mixup")
     @Produces("text/xml")
     @Consumes("multipart/form-data")