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/10 13:57:11 UTC

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...

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<String, String> collectionWrapperMap;
-    private List<String> jaxbElementClassNames = Collections.emptyList();
+    private List<String> jaxbElementClassNames;
     private Map<String, Object> cProperties;
     private Map<String, Object> 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<Object>(name, (Class)cls, null, obj) : obj;
+        return name != null ? new JAXBElement<Object>(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<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/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<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")