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")