Return-Path: Delivered-To: apmail-cxf-commits-archive@www.apache.org Received: (qmail 30270 invoked from network); 23 Jan 2009 15:16:47 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 23 Jan 2009 15:16:47 -0000 Received: (qmail 63585 invoked by uid 500); 23 Jan 2009 15:16:47 -0000 Delivered-To: apmail-cxf-commits-archive@cxf.apache.org Received: (qmail 63513 invoked by uid 500); 23 Jan 2009 15:16:47 -0000 Mailing-List: contact commits-help@cxf.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cxf.apache.org Delivered-To: mailing list commits@cxf.apache.org Received: (qmail 63504 invoked by uid 99); 23 Jan 2009 15:16:47 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 23 Jan 2009 07:16:47 -0800 X-ASF-Spam-Status: No, hits=-1998.5 required=10.0 tests=ALL_TRUSTED,WEIRD_PORT X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 23 Jan 2009 15:16:43 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 7F0232388A16; Fri, 23 Jan 2009 07:16:22 -0800 (PST) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r737046 - in /cxf/trunk: rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/ 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/main/java/or... Date: Fri, 23 Jan 2009 15:16:22 -0000 To: commits@cxf.apache.org From: sergeyb@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20090123151622.7F0232388A16@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: sergeyb Date: Fri Jan 23 07:16:21 2009 New Revision: 737046 URL: http://svn.apache.org/viewvc?rev=737046&view=rev Log: JAXRS : handling of multiparts by arbitrary providers Added: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/multipart/ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/multipart/AttachmentUtils.java (with props) cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/multipart/MultipartInfo.java (with props) cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/attachmentData2 Removed: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/AttachmentUtils.java Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/MultipartID.java cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ActivationProvider.java cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONProvider.java cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultipartTest.java cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/MultipartStore.java Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/MultipartID.java URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/MultipartID.java?rev=737046&r1=737045&r2=737046&view=diff ============================================================================== --- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/MultipartID.java (original) +++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/MultipartID.java Fri Jan 23 07:16:21 2009 @@ -27,5 +27,6 @@ @Target({ElementType.PARAMETER, ElementType.FIELD }) @Retention(RetentionPolicy.RUNTIME) public @interface MultipartID { - String value(); + String value() default "root"; + String type() default "*/*"; } Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java?rev=737046&r1=737045&r2=737046&view=diff ============================================================================== --- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java (original) +++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java Fri Jan 23 07:16:21 2009 @@ -19,8 +19,6 @@ package org.apache.cxf.jaxrs.provider; -import java.io.IOException; -import java.io.InputStream; import java.lang.annotation.Annotation; import java.lang.reflect.Type; import java.util.List; @@ -50,7 +48,6 @@ import org.apache.cxf.common.util.PackageUtils; import org.apache.cxf.jaxrs.ext.MessageContext; import org.apache.cxf.jaxrs.utils.AnnotationUtils; -import org.apache.cxf.jaxrs.utils.AttachmentUtils; import org.apache.cxf.jaxrs.utils.InjectionUtils; import org.apache.cxf.jaxrs.utils.schemas.SchemaHandler; @@ -59,8 +56,6 @@ protected static final ResourceBundle BUNDLE = BundleUtils.getBundle(AbstractJAXBProvider.class); - private static final MediaType MULTIPART_RELATED_TYPE = - MediaType.valueOf("multipart/related"); private static final Logger LOG = LogUtils.getL7dLogger(AbstractJAXBProvider.class); private static final String CHARSET_PARAMETER = "charset"; @@ -99,17 +94,6 @@ return mc; } - public InputStream getInputStream(Class type, Annotation[] anns, MediaType mt, - InputStream is) throws IOException { - if (mt.isCompatible(MULTIPART_RELATED_TYPE)) { - is = (InputStream)AttachmentUtils.getMultipart(type, anns, mt, getContext(), is); - if (is == null) { - throw new WebApplicationException(404); - } - } - return is; - } - @SuppressWarnings("unchecked") protected JAXBContext getJAXBContext(Class type, Type genericType) throws JAXBException { if (mc != null) { Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ActivationProvider.java URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ActivationProvider.java?rev=737046&r1=737045&r2=737046&view=diff ============================================================================== --- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ActivationProvider.java (original) +++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ActivationProvider.java Fri Jan 23 07:16:21 2009 @@ -35,7 +35,8 @@ import javax.ws.rs.ext.Provider; import org.apache.cxf.jaxrs.ext.MessageContext; -import org.apache.cxf.jaxrs.utils.AttachmentUtils; +import org.apache.cxf.jaxrs.utils.multipart.AttachmentUtils; +import org.apache.cxf.jaxrs.utils.multipart.MultipartInfo; @Provider @Consumes("multipart/related") @@ -45,18 +46,30 @@ private MessageContext mc; public boolean isReadable(Class type, Type genericType, Annotation[] annotations, - MediaType mediaType) { - return DataSource.class.isAssignableFrom(type) - || DataHandler.class.isAssignableFrom(type); + MediaType mt) { + if (DataHandler.class.isAssignableFrom(type) || DataSource.class.isAssignableFrom(type) + || (mt.getType().equals("multipart") && mt.getSubtype().equals("related"))) { + return true; + } + return false; } public Object readFrom(Class c, Type t, Annotation[] anns, MediaType mt, MultivaluedMap headers, InputStream is) throws IOException, WebApplicationException { - - Object multipart = AttachmentUtils.getMultipart(c, anns, mt, mc, is); + MultipartInfo multipart = AttachmentUtils.getMultipart(c, anns, mt, mc, is); if (multipart != null) { - return multipart; + if (InputStream.class.isAssignableFrom(multipart.getPart().getClass())) { + MessageBodyReader r = + mc.getProviders().getMessageBodyReader(c, t, anns, multipart.getType()); + if (r != null) { + return r.readFrom(c, t, anns, multipart.getType(), headers, + (InputStream)multipart.getPart()); + } + } else { + // it's either DataSource or DataHandler + return multipart.getPart(); + } } throw new WebApplicationException(404); } Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java?rev=737046&r1=737045&r2=737046&view=diff ============================================================================== --- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java (original) +++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java Fri Jan 23 07:16:21 2009 @@ -45,9 +45,7 @@ import org.apache.cxf.jaxrs.utils.schemas.SchemaHandler; @Produces({"application/xml", "text/xml" }) -@Consumes({"application/xml", "text/xml", - "multipart/related;type=\"text/xml\"", - "multipart/related;type=\"application/xml\"" }) +@Consumes({"application/xml", "text/xml" }) @Provider public class JAXBElementProvider extends AbstractJAXBProvider { @@ -83,10 +81,9 @@ } public Object readFrom(Class type, Type genericType, Annotation[] anns, MediaType mt, - MultivaluedMap headers, InputStream stream) + MultivaluedMap headers, InputStream is) throws IOException { try { - InputStream is = getInputStream(type, anns, mt, stream); Class theType = getActualType(type, genericType); Unmarshaller unmarshaller = createUnmarshaller(theType, genericType); Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONProvider.java URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONProvider.java?rev=737046&r1=737045&r2=737046&view=diff ============================================================================== --- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONProvider.java (original) +++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONProvider.java Fri Jan 23 07:16:21 2009 @@ -54,8 +54,7 @@ import org.codehaus.jettison.mapped.MappedXMLStreamWriter; @Produces("application/json") -@Consumes({"application/json", - "multipart/related;type=\"application/json\"" }) +@Consumes("application/json") @Provider public class JSONProvider extends AbstractJAXBProvider { @@ -100,11 +99,10 @@ } public Object readFrom(Class type, Type genericType, Annotation[] anns, MediaType mt, - MultivaluedMap headers, InputStream stream) + MultivaluedMap headers, InputStream is) throws IOException { try { - InputStream is = getInputStream(type, anns, mt, stream); Class theType = getActualType(type, genericType); Unmarshaller unmarshaller = createUnmarshaller(theType, genericType); Added: 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=737046&view=auto ============================================================================== --- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/multipart/AttachmentUtils.java (added) +++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/multipart/AttachmentUtils.java Fri Jan 23 07:16:21 2009 @@ -0,0 +1,118 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.cxf.jaxrs.utils.multipart; + +import java.io.IOException; +import java.io.InputStream; +import java.lang.annotation.Annotation; +import java.util.Map; +import java.util.ResourceBundle; +import java.util.logging.Logger; + +import javax.activation.DataHandler; +import javax.activation.DataSource; +import javax.mail.util.ByteArrayDataSource; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.MediaType; + +import org.apache.cxf.common.i18n.BundleUtils; +import org.apache.cxf.common.logging.LogUtils; +import org.apache.cxf.helpers.CastUtils; +import org.apache.cxf.jaxrs.ext.MessageContext; +import org.apache.cxf.jaxrs.ext.MultipartID; +import org.apache.cxf.jaxrs.utils.AnnotationUtils; +import org.apache.cxf.jaxrs.utils.JAXRSUtils; + +public final class AttachmentUtils { + private static final Logger LOG = LogUtils.getL7dLogger(JAXRSUtils.class); + private static final ResourceBundle BUNDLE = BundleUtils.getBundle(JAXRSUtils.class); + + private AttachmentUtils() { + } + + public static Map getAttachments(MessageContext mc) { + return CastUtils.cast((Map)mc.get(MessageContext.INBOUND_MESSAGE_ATTACHMENTS)); + } + + // TODO : refactor this 'piece' + public static MultipartInfo getMultipart(Class c, Annotation[] anns, + MediaType mt, MessageContext mc, InputStream is) throws IOException { + InputStream stream = null; + MultipartID id = AnnotationUtils.getAnnotation(anns, MultipartID.class); + if (id != null) { + String contentId = id.value(); + String rootId = mt.getParameters().get("start"); + if (rootId != null) { + rootId = rootId.replace("\"", "").replace("'", ""); + if (rootId.equalsIgnoreCase(contentId)) { + stream = is; + } + } + if (stream == null) { + // TODO: looks like the lazy attachments collection can only be accessed this way + for (Map.Entry entry : getAttachments(mc).entrySet()) { + if (entry.getKey().equals(contentId)) { + DataHandler dh = entry.getValue(); + MediaType handlerType = dh.getContentType() == null + ? MediaType.WILDCARD_TYPE : MediaType.valueOf(dh.getContentType()); + checkMediaTypes(handlerType, id.type()); + Object o = DataHandler.class.isAssignableFrom(c) ? dh + : DataSource.class.isAssignableFrom(c) ? dh.getDataSource() + : dh.getInputStream(); + return new MultipartInfo(o, handlerType); + } + } + org.apache.cxf.common.i18n.Message errorMsg = + new org.apache.cxf.common.i18n.Message("MULTTIPART_ID_NOT_FOUND", + BUNDLE, + contentId, + mt.toString()); + LOG.warning(errorMsg.toString()); + } + } else { + stream = is; + } + if (stream != null) { + MediaType partType = MediaType.WILDCARD_TYPE; + String ct = mt.getParameters().get("type"); + if (ct != null) { + partType = MediaType.valueOf(ct.replace("\"", "").replace("'", "")); + } + if (id != null) { + checkMediaTypes(partType, id.type()); + } + if (DataSource.class.isAssignableFrom(c)) { + return new MultipartInfo(new ByteArrayDataSource(stream, mt.toString()), partType); + } else if (DataHandler.class.isAssignableFrom(c)) { + return new MultipartInfo(new DataHandler(new ByteArrayDataSource(stream, mt.toString())), + partType); + } else { + return new MultipartInfo(stream, partType); + } + } + return null; + } + + private static void checkMediaTypes(MediaType mt1, String mt2) { + if (!mt1.isCompatible(MediaType.valueOf(mt2))) { + throw new WebApplicationException(415); + } + } +} Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/multipart/AttachmentUtils.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/multipart/AttachmentUtils.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Added: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/multipart/MultipartInfo.java URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/multipart/MultipartInfo.java?rev=737046&view=auto ============================================================================== --- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/multipart/MultipartInfo.java (added) +++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/multipart/MultipartInfo.java Fri Jan 23 07:16:21 2009 @@ -0,0 +1,41 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.cxf.jaxrs.utils.multipart; + +import javax.ws.rs.core.MediaType; + +public class MultipartInfo { + + private Object part; + private MediaType contentType; + + public MultipartInfo(Object o, MediaType type) { + part = o; + contentType = type; + } + + public Object getPart() { + return part; + } + + public MediaType getType() { + return contentType; + } + +} Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/multipart/MultipartInfo.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/multipart/MultipartInfo.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Modified: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultipartTest.java URL: http://svn.apache.org/viewvc/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultipartTest.java?rev=737046&r1=737045&r2=737046&view=diff ============================================================================== --- cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultipartTest.java (original) +++ cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultipartTest.java Fri Jan 23 07:16:21 2009 @@ -37,76 +37,94 @@ @BeforeClass public static void startServers() throws Exception { assertTrue("server did not launch correctly", - launchServer(MultipartServer.class, true)); + launchServer(MultipartServer.class)); } @Test public void testBookAsRootAttachmentStreamSource() throws Exception { String address = "http://localhost:9080/bookstore/books/stream"; - doAddBook(address); + doAddBook(address, "attachmentData", 200); } @Test public void testBookAsRootAttachmentInputStream() throws Exception { String address = "http://localhost:9080/bookstore/books/istream"; - doAddBook(address); + doAddBook(address, "attachmentData", 200); } @Test public void testBookAsMessageContextDataHandler() throws Exception { String address = "http://localhost:9080/bookstore/books/mchandlers"; - doAddBook(address); + doAddBook(address, "attachmentData", 200); } @Test public void testAddBookAsRootAttachmentJAXB() throws Exception { String address = "http://localhost:9080/bookstore/books/jaxb"; - doAddBook(address); + doAddBook(address, "attachmentData", 200); } @Test public void testAddBookAsDataSource() throws Exception { String address = "http://localhost:9080/bookstore/books/dsource"; - doAddBook(address); + doAddBook(address, "attachmentData", 200); } @Test public void testAddBookAsDataSource2() throws Exception { String address = "http://localhost:9080/bookstore/books/dsource2"; - doAddBook(address); + doAddBook(address, "attachmentData", 200); } @Test public void testAddBookAsJAXB2() throws Exception { String address = "http://localhost:9080/bookstore/books/jaxb2"; - doAddBook(address); + doAddBook(address, "attachmentData", 200); + } + + @Test + public void testAddBookAsJAXBJSON() throws Exception { + String address = "http://localhost:9080/bookstore/books/jaxbjson"; + doAddBook(address, "attachmentData2", 200); + } + + @Test + public void testConsumesMismatch() throws Exception { + String address = "http://localhost:9080/bookstore/books/mismatch1"; + doAddBook(address, "attachmentData2", 415); + } + + @Test + public void testConsumesMismatch2() throws Exception { + String address = "http://localhost:9080/bookstore/books/mismatch2"; + doAddBook(address, "attachmentData2", 415); } @Test public void testAddBookAsDataHandler() throws Exception { String address = "http://localhost:9080/bookstore/books/dhandler"; - doAddBook(address); + doAddBook(address, "attachmentData", 200); } - private void doAddBook(String address) throws Exception { + private void doAddBook(String address, String resourceName, int status) throws Exception { PostMethod post = new PostMethod(address); String ct = "multipart/related; type=\"text/xml\"; " + "start=\"rootPart\"; " + "boundary=\"----=_Part_4_701508.1145579811786\""; post.setRequestHeader("Content-Type", ct); InputStream is = - getClass().getResourceAsStream("/org/apache/cxf/systest/jaxrs/attachmentData"); + getClass().getResourceAsStream("/org/apache/cxf/systest/jaxrs/" + resourceName); RequestEntity entity = new InputStreamRequestEntity(is); post.setRequestEntity(entity); HttpClient httpclient = new HttpClient(); try { int result = httpclient.executeMethod(post); - assertEquals(200, result); - - InputStream expected = getClass().getResourceAsStream("resources/expected_add_book.txt"); - - assertEquals(getStringFromInputStream(expected), post.getResponseBodyAsString()); + assertEquals(status, result); + if (status == 200) { + InputStream expected = getClass().getResourceAsStream("resources/expected_add_book.txt"); + assertEquals(getStringFromInputStream(expected), post.getResponseBodyAsString()); + } } finally { // Release current connection to the connection pool once you are done post.releaseConnection(); Modified: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/MultipartStore.java URL: http://svn.apache.org/viewvc/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/MultipartStore.java?rev=737046&r1=737045&r2=737046&view=diff ============================================================================== --- cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/MultipartStore.java (original) +++ cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/MultipartStore.java Fri Jan 23 07:16:21 2009 @@ -25,6 +25,7 @@ import javax.activation.DataHandler; import javax.activation.DataSource; +import javax.ws.rs.Consumes; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; @@ -37,7 +38,7 @@ import org.apache.cxf.jaxrs.ext.MessageContext; import org.apache.cxf.jaxrs.ext.MultipartID; -import org.apache.cxf.jaxrs.utils.AttachmentUtils; +import org.apache.cxf.jaxrs.utils.multipart.AttachmentUtils; @Path("/bookstore") public class MultipartStore { @@ -75,9 +76,10 @@ @POST @Path("/books/jaxb2") + @Consumes("multipart/related;type=\"text/xml\"") @Produces("text/xml") - public Response addBook2(@MultipartID("rootPart") Book b1, - @MultipartID("book2") Book b2) + public Response addBookParts(@MultipartID("rootPart") Book b1, + @MultipartID("book2") Book b2) throws Exception { if (b1.equals(b2)) { throw new WebApplicationException(); @@ -90,6 +92,21 @@ } @POST + @Path("/books/jaxbjson") + @Produces("text/xml") + public Response addBookJaxbJson( + @MultipartID(value = "rootPart", type = "text/xml") Book2 b1, + @MultipartID(value = "book2", type = "application/json") Book b2) + throws Exception { + if (!"CXF in Action".equals(b1.getName()) + || !"CXF in Action - 2".equals(b2.getName())) { + throw new WebApplicationException(); + } + b2.setId(124); + return Response.ok(b2).build(); + } + + @POST @Path("/books/dsource2") @Produces("text/xml") public Response addBookFromDataSource2(@MultipartID("rootPart") DataSource ds1, @@ -136,6 +153,21 @@ return Response.ok(b).build(); } + @POST + @Path("/books/mismatch1") + @Consumes("multipart/related;type=\"bar/foo\"") + @Produces("text/xml") + public Response addBookMismatched(Book b) { + throw new WebApplicationException(); + } + + @POST + @Path("/books/mismatch2") + @Produces("text/xml") + public Response addBookMismatched2(@MultipartID(value = "rootPart", type = "f/b") Book b) { + throw new WebApplicationException(); + } + private Response readBookFromInputStream(InputStream is) throws Exception { JAXBContext c = JAXBContext.newInstance(new Class[]{Book.class}); Unmarshaller u = c.createUnmarshaller(); Added: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/attachmentData2 URL: http://svn.apache.org/viewvc/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/attachmentData2?rev=737046&view=auto ============================================================================== --- cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/attachmentData2 (added) +++ cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/attachmentData2 Fri Jan 23 07:16:21 2009 @@ -0,0 +1,18 @@ + +------=_Part_4_701508.1145579811786 +Content-Type: text/xml +Content-ID: + +CXF in Action123 +------=_Part_4_701508.1145579811786 +Content-Type: image/jpeg +Content-Transfer-Encoding: binary +Content-ID: + +foobar +------=_Part_4_701508.1145579811786-- +Content-Type: application/json +Content-ID: + +{"Book":{"name":"CXF in Action - 2","id":123}} +------=_Part_4_701508.1145579811786-- \ No newline at end of file