Return-Path: X-Original-To: apmail-cxf-commits-archive@www.apache.org Delivered-To: apmail-cxf-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 5A17BD0C4 for ; Wed, 10 Oct 2012 11:57:59 +0000 (UTC) Received: (qmail 26615 invoked by uid 500); 10 Oct 2012 11:57:59 -0000 Delivered-To: apmail-cxf-commits-archive@cxf.apache.org Received: (qmail 26480 invoked by uid 500); 10 Oct 2012 11:57:58 -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 26462 invoked by uid 99); 10 Oct 2012 11:57:57 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 10 Oct 2012 11:57:57 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED 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; Wed, 10 Oct 2012 11:57:55 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 4A89C238890D; Wed, 10 Oct 2012 11:57:12 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1396553 - in /cxf/branches/2.6.x-fixes: ./ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ systes... Date: Wed, 10 Oct 2012 11:57:11 -0000 To: commits@cxf.apache.org From: sergeyb@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20121010115712.4A89C238890D@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: sergeyb Date: Wed Oct 10 11:57:11 2012 New Revision: 1396553 URL: http://svn.apache.org/viewvc?rev=1396553&view=rev Log: Merged revisions 1396302,1396550 via svnmerge from https://svn.apache.org/repos/asf/cxf/trunk ........ r1396302 | sergeyb | 2012-10-09 21:42:29 +0100 (Tue, 09 Oct 2012) | 1 line [CXF-4552] Collections of parts annotated with @Multipart are nor processed with form data payloads containing a single file only ........ r1396550 | sergeyb | 2012-10-10 12:40:35 +0100 (Wed, 10 Oct 2012) | 1 line [CXF-4349] Reverting some of the updates, using a workaround to get xsi:type generated ........ Modified: cxf/branches/2.6.x-fixes/ (props changed) cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/MultipartProvider.java cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultipartTest.java cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/MultipartStore.java Propchange: cxf/branches/2.6.x-fixes/ ------------------------------------------------------------------------------ Merged /cxf/trunk:r1396302,1396550 Propchange: cxf/branches/2.6.x-fixes/ ------------------------------------------------------------------------------ Binary property 'svnmerge-integrated' - no diff available. Modified: cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java?rev=1396553&r1=1396552&r2=1396553&view=diff ============================================================================== --- cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java (original) +++ cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java Wed Oct 10 11:57:11 2012 @@ -637,13 +637,9 @@ public class ClientProxyImpl extends Abs Object body = objs.get(0); try { if (bodyIndex != -1) { - Class paramClass = method.getParameterTypes()[bodyIndex]; Type paramType = method.getGenericParameterTypes()[bodyIndex]; - boolean isAssignable = paramClass.isAssignableFrom(body.getClass()); - writeBody(body, outMessage, - isAssignable ? paramClass : body.getClass(), - isAssignable ? paramType : body.getClass(), + writeBody(body, outMessage, body.getClass(), paramType, anns, headers, os); } else { writeBody(body, outMessage, body.getClass(), body.getClass(), Modified: cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java?rev=1396553&r1=1396552&r2=1396553&view=diff ============================================================================== --- cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java (original) +++ cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java Wed Oct 10 11:57:11 2012 @@ -207,8 +207,7 @@ public class JAXRSOutInterceptor extends invoked = ori == null ? null : ori.getAnnotatedMethod() == null ? ori.getMethodToInvoke() : ori.getAnnotatedMethod(); } - - Class targetType = getRawResponseClass(invoked, responseObj); + Class targetType = getRawResponseClass(responseObj); Type genericType = getGenericResponseType(invoked, responseObj, targetType); if (genericType instanceof TypeVariable) { genericType = InjectionUtils.getSuperType(ori.getClassResourceInfo().getServiceClass(), @@ -433,14 +432,12 @@ public class JAXRSOutInterceptor extends } - private Class getRawResponseClass(Method invoked, Object targetObject) { + private Class getRawResponseClass(Object targetObject) { if (GenericEntity.class.isAssignableFrom(targetObject.getClass())) { return ((GenericEntity)targetObject).getRawType(); } else { Class targetClass = targetObject.getClass(); - Class responseClass = invoked == null - || !invoked.getReturnType().isAssignableFrom(targetClass) ? targetClass : invoked.getReturnType(); - return ClassHelper.getRealClassFromClass(responseClass); + return ClassHelper.getRealClassFromClass(targetClass); } } Modified: cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java?rev=1396553&r1=1396552&r2=1396553&view=diff ============================================================================== --- cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java (original) +++ cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java Wed Oct 10 11:57:11 2012 @@ -118,7 +118,7 @@ public abstract class AbstractJAXBProvid private String collectionWrapperName; private Map collectionWrapperMap; - private List jaxbElementClassNames = Collections.emptyList(); + private List jaxbElementClassNames; private Map cProperties; private Map uProperties; @@ -226,19 +226,34 @@ public abstract class AbstractJAXBProvid protected Object convertToJaxbElementIfNeeded(Object obj, Class cls, Type genericType) throws Exception { - boolean asJaxbElement = jaxbElementClassNames.contains(cls.getName()); + Class jaxbElementCls = jaxbElementClassNames == null ? null : getJaxbElementClass(cls); + boolean asJaxbElement = jaxbElementCls != null; if (!asJaxbElement && isXmlRoot(cls)) { return obj; } - + if (jaxbElementCls == null) { + jaxbElementCls = cls; + } QName name = null; - String expandedName = jaxbElementClassMap.get(cls.getName()); + String expandedName = jaxbElementClassMap.get(jaxbElementCls.getName()); if (expandedName != null) { name = JAXRSUtils.convertStringToQName(expandedName); } else if (marshalAsJaxbElement || asJaxbElement) { - name = getJaxbQName(cls, genericType, obj, false); + name = getJaxbQName(jaxbElementCls, genericType, obj, false); } - return name != null ? new JAXBElement(name, (Class)cls, null, obj) : obj; + return name != null ? new JAXBElement(name, (Class)jaxbElementCls, null, obj) : obj; + } + + protected Class getJaxbElementClass(Class cls) { + if (cls == Object.class) { + return null; + } + if (jaxbElementClassNames.contains(cls.getName())) { + return cls; + } else { + return getJaxbElementClass(cls.getSuperclass()); + } + } public void setCollectionWrapperName(String wName) { Modified: cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/MultipartProvider.java URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/MultipartProvider.java?rev=1396553&r1=1396552&r2=1396553&view=diff ============================================================================== --- cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/MultipartProvider.java (original) +++ cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/MultipartProvider.java Wed Oct 10 11:57:11 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 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 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 Class convertTypeToClass(Type t) { + return (Class)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/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java?rev=1396553&r1=1396552&r2=1396553&view=diff ============================================================================== --- cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java (original) +++ cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java Wed Oct 10 11:57:11 2012 @@ -126,6 +126,12 @@ public class BookStore { } @GET + @Path("object") + public Object getBookAsObject() { + return new Book("Book as Object", 125L); + } + + @GET @Path("/default") @Produces("application/xml") public Book getDefaultBook() { Modified: cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java?rev=1396553&r1=1396552&r2=1396553&view=diff ============================================================================== --- cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java (original) +++ cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java Wed Oct 10 11:57:11 2012 @@ -78,7 +78,7 @@ public class JAXRSClientServerBookTest e public static void startServers() throws Exception { AbstractResourceInfo.clearAllMaps(); assertTrue("server did not launch correctly", - launchServer(BookServer.class)); + launchServer(BookServer.class, true)); createStaticBus(); } @@ -184,6 +184,16 @@ public class JAXRSClientServerBookTest e } @Test + public void testGetBookAsObject() throws Exception { + + String endpointAddress = + "http://localhost:" + PORT + "/bookstore/object"; + WebClient wc = WebClient.create(endpointAddress); + Book b = wc.get(Book.class); + assertEquals("Book as Object", b.getName()); + } + + @Test public void testProcessingInstruction() throws Exception { String base = "http://localhost:" + PORT; String endpointAddress = base + "/bookstore/name-in-query"; Modified: cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultipartTest.java URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultipartTest.java?rev=1396553&r1=1396552&r2=1396553&view=diff ============================================================================== --- cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultipartTest.java (original) +++ cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultipartTest.java Wed Oct 10 11:57:11 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/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/MultipartStore.java URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/MultipartStore.java?rev=1396553&r1=1396552&r2=1396553&view=diff ============================================================================== --- cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/MultipartStore.java (original) +++ cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/MultipartStore.java Wed Oct 10 11:57:11 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 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")