Author: sergeyb
Date: Thu Nov 1 18:35:08 2012
New Revision: 1404715
URL: http://svn.apache.org/viewvc?rev=1404715&view=rev
Log:
[CXF-4552] Support for mapping multiple multipart form-data parts with the same
id to collection parameters bound to that id with Mulltipart attachment
Added:
cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/resources/attachmentFormJsonFiles2
Modified:
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/MultipartProvider.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/multipart/AttachmentUtils.java
cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultipartTest.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=1404715&r1=1404714&r2=1404715&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
Thu Nov 1 18:35:08 2012
@@ -137,17 +137,10 @@ public class MultipartProvider extends A
List<Attachment> infos = AttachmentUtils.getAttachments(
mc, attachmentDir, attachmentThreshold, attachmentMaxSize);
- if (Collection.class.isAssignableFrom(c)
+ boolean collectionExpected = Collection.class.isAssignableFrom(c);
+ if (collectionExpected
&& AnnotationUtils.getAnnotation(anns, Multipart.class) == null) {
- Class<?> actual = getActualType(t, 0);
- if (Attachment.class.isAssignableFrom(actual)) {
- return infos;
- }
- Collection<Object> objects = new ArrayList<Object>();
- for (Attachment a : infos) {
- objects.add(fromAttachment(a, actual, actual, anns));
- }
- return objects;
+ return getAttachmentCollection(t, infos, anns);
}
if (Map.class.isAssignableFrom(c)) {
Map<String, Object> map = new LinkedHashMap<String,
Object>(infos.size());
@@ -162,10 +155,17 @@ public class MultipartProvider extends A
}
Multipart id = AnnotationUtils.getAnnotation(anns, Multipart.class);
- Attachment multipart = AttachmentUtils.getMultipart(c, id, mt, infos);
+ Attachment multipart = AttachmentUtils.getMultipart(id, mt, infos);
if (multipart != null) {
- return fromAttachment(multipart, c, t, anns);
- } else if (id != null && !id.required()) {
+ if (collectionExpected &&
!mediaTypeSupported(multipart.getContentType())) {
+ List<Attachment> allMultiparts =
AttachmentUtils.getAllMultiparts(id, mt, infos);
+ return getAttachmentCollection(t, allMultiparts, anns);
+ } else {
+ return fromAttachment(multipart, c, t, anns);
+ }
+ }
+
+ if (id != null && !id.required()) {
/*
* If user asked for a null, give them a null.
*/
@@ -176,6 +176,18 @@ public class MultipartProvider extends A
}
+ private Object getAttachmentCollection(Type t, List<Attachment> infos,
Annotation[] anns) throws IOException {
+ Class<?> actual = getActualType(t, 0);
+ if (Attachment.class.isAssignableFrom(actual)) {
+ return infos;
+ }
+ Collection<Object> objects = new ArrayList<Object>();
+ for (Attachment a : infos) {
+ objects.add(fromAttachment(a, actual, actual, anns));
+ }
+ return objects;
+ }
+
private Class<?> getActualType(Type type, int pos) {
Class<?> actual = null;
try {
@@ -195,37 +207,25 @@ 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;
}
- 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);
- }
+ 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");
Modified:
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/multipart/AttachmentUtils.java
URL:
http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/multipart/AttachmentUtils.java?rev=1404715&r1=1404714&r2=1404715&view=diff
==============================================================================
---
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/multipart/AttachmentUtils.java
(original)
+++
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/multipart/AttachmentUtils.java
Thu Nov 1 18:35:08 2012
@@ -21,6 +21,7 @@ package org.apache.cxf.jaxrs.utils.multi
import java.io.IOException;
import java.util.LinkedHashMap;
+import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle;
@@ -97,8 +98,7 @@ public final class AttachmentUtils {
attachmentMaxSize).getAllAttachments();
}
- public static Attachment getMultipart(Class<Object> c,
- Multipart id,
+ public static Attachment getMultipart(Multipart id,
MediaType mt,
List<Attachment> infos) throws
IOException {
@@ -126,6 +126,20 @@ public final class AttachmentUtils {
return infos.size() > 0 ? infos.get(0) : null;
}
+ public static List<Attachment> getAllMultiparts(Multipart id,
+ MediaType mt,
+ List<Attachment> infos) throws
IOException {
+
+ List<Attachment> all = new LinkedList<Attachment>();
+ for (Attachment a : infos) {
+ if (matchAttachmentId(a, id, mt)) {
+ checkMediaTypes(a.getContentType(), id.type());
+ all.add(a);
+ }
+ }
+ return all;
+ }
+
private static boolean matchAttachmentId(Attachment at, Multipart mid,
MediaType multipartType) {
if (at.getContentId().equals(mid.value())) {
return true;
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=1404715&r1=1404714&r2=1404715&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
Thu Nov 1 18:35:08 2012
@@ -136,6 +136,12 @@ public class JAXRSMultipartTest extends
}
@Test
+ public void testBookJSONFormTwoFilesNotRecursive() throws Exception {
+ String address = "http://localhost:" + PORT +
"/bookstore/books/filesform";
+ doAddFormBook(address, "attachmentFormJsonFiles2", 200);
+ }
+
+ @Test
public void testBookJSONFormOneFileWhereManyExpected() throws Exception {
String address = "http://localhost:" + PORT +
"/bookstore/books/filesform/singlefile";
doAddFormBook(address, "attachmentFormJsonFile", 200);
Added:
cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/resources/attachmentFormJsonFiles2
URL:
http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/resources/attachmentFormJsonFiles2?rev=1404715&view=auto
==============================================================================
---
cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/resources/attachmentFormJsonFiles2
(added)
+++
cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/resources/attachmentFormJsonFiles2
Thu Nov 1 18:35:08 2012
@@ -0,0 +1,19 @@
+
+--bqJky99mlBWa-ZuqjC53mG6EzbmlxB
+Content-Disposition: form-data; name="owner"
+Content-Type: text/plain
+
+Larry
+--bqJky99mlBWa-ZuqjC53mG6EzbmlxB
+Content-Disposition: form-data; name="files"; filename="book1.text"
+Content-Type: application/json; charset=US-ASCII
+Content-Transfer-Encoding: 8bit
+
+{"Book":{"name":"CXF in Action - 1","id":123}}
+--bqJky99mlBWa-ZuqjC53mG6EzbmlxB
+Content-Disposition: form-data; name="files"; filename="book2.text"
+Content-Type: application/json; charset=US-ASCII
+Content-Transfer-Encoding: 8bit
+
+{"Book":{"name":"CXF in Action - 2%","id":124}}
+--bqJky99mlBWa-ZuqjC53mG6EzbmlxB--
\ No newline at end of file