Repository: cxf
Updated Branches:
  refs/heads/master ae44ed7e5 -> 77d7a4628


[CXF-5944] Better support for multipart representations, patch from Alexey 
Markevich applied with modifications


Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/77d7a462
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/77d7a462
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/77d7a462

Branch: refs/heads/master
Commit: 77d7a46286ddd45896ab8a939d6278fb66127c95
Parents: ae44ed7
Author: Sergey Beryozkin <sberyoz...@talend.com>
Authored: Wed Aug 13 21:36:45 2014 +0100
Committer: Sergey Beryozkin <sberyoz...@talend.com>
Committed: Wed Aug 13 21:36:45 2014 +0100

----------------------------------------------------------------------
 .../cxf/tools/wadlto/jaxrs/SourceGenerator.java | 46 +++++++++++++-------
 .../tools/wadlto/jaxrs/JAXRSContainerTest.java  | 28 ++++++------
 .../cxf/tools/wadlto/jaxrs/WADLToJavaTest.java  |  2 +-
 .../jaxrs/src/test/resources/wadl/bookstore.xml | 29 +++++++++++-
 4 files changed, 73 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cxf/blob/77d7a462/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/jaxrs/SourceGenerator.java
----------------------------------------------------------------------
diff --git 
a/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/jaxrs/SourceGenerator.java
 
b/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/jaxrs/SourceGenerator.java
index 65646a3..1706053 100644
--- 
a/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/jaxrs/SourceGenerator.java
+++ 
b/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/jaxrs/SourceGenerator.java
@@ -90,6 +90,8 @@ import org.apache.cxf.common.xmlschema.SchemaCollection;
 import org.apache.cxf.helpers.CastUtils;
 import org.apache.cxf.helpers.DOMUtils;
 import org.apache.cxf.helpers.JavaUtils;
+import org.apache.cxf.jaxrs.ext.multipart.Multipart;
+import org.apache.cxf.jaxrs.ext.multipart.MultipartBody;
 import org.apache.cxf.jaxrs.model.wadl.WadlGenerator;
 import org.apache.cxf.jaxrs.utils.JAXRSUtils;
 import org.apache.cxf.jaxrs.utils.ResourceUtils;
@@ -175,6 +177,7 @@ public class SourceGenerator {
         XSD_SPECIFIC_TYPE_MAP.put("date", "java.util.Date");
         XSD_SPECIFIC_TYPE_MAP.put("dateTime", "java.util.Date");
         XSD_SPECIFIC_TYPE_MAP.put("time", "java.util.Date");
+        XSD_SPECIFIC_TYPE_MAP.put("anyType", "String");
     }
 
     private Comparator<String> importsComparator;
@@ -576,7 +579,7 @@ public class SourceGenerator {
     private void writeImplementsInterface(StringBuilder sb, String clsName, 
                                              boolean interfaceIsGenerated) {
         if (generateInterfaces && !interfaceIsGenerated) {
-            sb.append(" implements " + clsName);
+            sb.append(" implements " + StringUtils.capitalize(clsName));
         }
     }
     
@@ -861,13 +864,15 @@ public class SourceGenerator {
         sbCode.append("}");
     }
     
-    private boolean addFormParameters(List<Element> inParamElements, Element 
requestEl) {
-        List<Element> repElements = getWadlElements(requestEl, 
"representation");
- 
+    private boolean addFormParameters(List<Element> inParamElements, 
+                                      Element requestEl,
+                                      List<Element> repElements) {
         if (repElements.size() == 1) {
             String mediaType = repElements.get(0).getAttribute("mediaType");
-            if (MediaType.APPLICATION_FORM_URLENCODED.equals(mediaType)) { 
-                inParamElements.addAll(getWadlElements(repElements.get(0), 
"param"));
+            if (MediaType.APPLICATION_FORM_URLENCODED.equals(mediaType) || 
mediaType.startsWith("multipart/")) {
+                if (!mediaTypesMap.containsKey(mediaType)) {
+                    inParamElements.addAll(getWadlElements(repElements.get(0), 
"param"));
+                }
                 return true;
             }
         }
@@ -971,12 +976,19 @@ public class SourceGenerator {
                                    boolean suspendedAsync) {
     //CHECKSTYLE:ON    
         boolean form = false;
-        boolean formParamsAvailable = false;
+        boolean multipart = false;
+        boolean formOrMultipartParamsAvailable = false;
+        String requestMediaType = null;
         if (requestEl != null) {
             inParamEls.addAll(getWadlElements(requestEl, "param"));
             int currentSize = inParamEls.size();
-            form = addFormParameters(inParamEls, requestEl);
-            formParamsAvailable = currentSize < inParamEls.size(); 
+            List<Element> repElements = getWadlElements(requestEl, 
"representation");
+            form = addFormParameters(inParamEls, requestEl, repElements);
+            if (form) {
+                formOrMultipartParamsAvailable = currentSize < 
inParamEls.size();
+                requestMediaType = 
repElements.get(0).getAttribute("mediaType");
+                multipart = form && requestMediaType.startsWith("multipart/");
+            }
         }
                   
         for (int i = 0; i < inParamEls.size(); i++) {
@@ -984,8 +996,8 @@ public class SourceGenerator {
             Element paramEl = inParamEls.get(i);
             
             Class<?> paramAnn = 
getParamAnnotation(paramEl.getAttribute("style"));
-            if (paramAnn == QueryParam.class && form) {
-                paramAnn = FormParam.class; 
+            if (paramAnn == QueryParam.class && 
formOrMultipartParamsAvailable) {
+                paramAnn = !multipart ? FormParam.class : Multipart.class; 
             } 
             String name = paramEl.getAttribute("name");
             boolean enumCreated = false;
@@ -1049,10 +1061,14 @@ public class SourceGenerator {
                 elementParamType = Source.class.getSimpleName();
                 elementParamName = "source";
             }
-        } else if (!formParamsAvailable) {
-            addImport(imports, MultivaluedMap.class.getName());
-            elementParamType = MultivaluedMap.class.getSimpleName();
-            elementParamName = "map";
+        } else if (!formOrMultipartParamsAvailable) {
+            if (requestMediaType != null && 
mediaTypesMap.containsKey(requestMediaType)) {
+                elementParamType = addImportsAndGetSimpleName(imports, 
mediaTypesMap.get(requestMediaType));
+            } else {
+                String fullClassName = !multipart ? 
MultivaluedMap.class.getName() : MultipartBody.class.getName();
+                elementParamType =  addImportsAndGetSimpleName(imports, 
fullClassName);
+            }
+            elementParamName = !multipart ? "map" : "body";
         }
         if (elementParamType != null) {
             if (inParamEls.size() > 0) {

http://git-wip-us.apache.org/repos/asf/cxf/blob/77d7a462/tools/wadlto/jaxrs/src/test/java/org/apache/cxf/tools/wadlto/jaxrs/JAXRSContainerTest.java
----------------------------------------------------------------------
diff --git 
a/tools/wadlto/jaxrs/src/test/java/org/apache/cxf/tools/wadlto/jaxrs/JAXRSContainerTest.java
 
b/tools/wadlto/jaxrs/src/test/java/org/apache/cxf/tools/wadlto/jaxrs/JAXRSContainerTest.java
index b82fca6..61ee5cd 100644
--- 
a/tools/wadlto/jaxrs/src/test/java/org/apache/cxf/tools/wadlto/jaxrs/JAXRSContainerTest.java
+++ 
b/tools/wadlto/jaxrs/src/test/java/org/apache/cxf/tools/wadlto/jaxrs/JAXRSContainerTest.java
@@ -80,8 +80,8 @@ public class JAXRSContainerTest extends ProcessorTestBase {
 
             assertNotNull(output.list());
             
-            verifyFiles("java", true, false, "superbooks", 
"org.apache.cxf.jaxrs.model.wadl", 10, true);
-            verifyFiles("class", true, false, "superbooks", 
"org.apache.cxf.jaxrs.model.wadl", 10, true);
+            verifyFiles("java", true, false, "superbooks", 
"org.apache.cxf.jaxrs.model.wadl", 11, true);
+            verifyFiles("class", true, false, "superbooks", 
"org.apache.cxf.jaxrs.model.wadl", 11, true);
             
         } catch (Exception e) {
             e.printStackTrace();
@@ -130,8 +130,8 @@ public class JAXRSContainerTest extends ProcessorTestBase {
 
             assertNotNull(output.list());
             
-            verifyFiles("java", true, false, "superbooks", 
"org.apache.cxf.jaxrs.model.wadl", 10, true);
-            verifyFiles("class", true, false, "superbooks", 
"org.apache.cxf.jaxrs.model.wadl", 10, true);
+            verifyFiles("java", true, false, "superbooks", 
"org.apache.cxf.jaxrs.model.wadl", 11, true);
+            verifyFiles("class", true, false, "superbooks", 
"org.apache.cxf.jaxrs.model.wadl", 11, true);
             
         } catch (Exception e) {
             e.printStackTrace();
@@ -155,8 +155,8 @@ public class JAXRSContainerTest extends ProcessorTestBase {
 
             assertNotNull(output.list());
             
-            verifyFiles("java", true, false, "superbooks", 
"org.apache.cxf.jaxrs.model.wadl", 10, true);
-            verifyFiles("class", true, false, "superbooks", 
"org.apache.cxf.jaxrs.model.wadl", 10, true);
+            verifyFiles("java", true, false, "superbooks", 
"org.apache.cxf.jaxrs.model.wadl", 11, true);
+            verifyFiles("class", true, false, "superbooks", 
"org.apache.cxf.jaxrs.model.wadl", 11, true);
             
         } catch (Exception e) {
             e.printStackTrace();
@@ -551,8 +551,8 @@ public class JAXRSContainerTest extends ProcessorTestBase {
 
             assertNotNull(output.list());
             
-            verifyFiles("java", true, false, "superbooks", "custom.books", 10, 
true);
-            verifyFiles("class", true, false, "superbooks", "custom.books", 
10, true);
+            verifyFiles("java", true, false, "superbooks", "custom.books", 11, 
true);
+            verifyFiles("class", true, false, "superbooks", "custom.books", 
11, true);
             
         } catch (Exception e) {
             e.printStackTrace();
@@ -577,8 +577,8 @@ public class JAXRSContainerTest extends ProcessorTestBase {
 
             assertNotNull(output.list());
             
-            verifyFiles("java", true, false, "custom.books.schema", 
"custom.books.service", 10, true);
-            verifyFiles("class", true, false, "custom.books.schema", 
"custom.books.service", 10, true);
+            verifyFiles("java", true, false, "custom.books.schema", 
"custom.books.service", 11, true);
+            verifyFiles("class", true, false, "custom.books.schema", 
"custom.books.service", 11, true);
             
         } catch (Exception e) {
             e.printStackTrace();
@@ -602,8 +602,8 @@ public class JAXRSContainerTest extends ProcessorTestBase {
 
             assertNotNull(output.list());
             
-            verifyFiles("java", true, false, "superbooks", 
"org.apache.cxf.jaxrs.model.wadl", 10, true);
-            verifyFiles("class", true, false, "superbooks", 
"org.apache.cxf.jaxrs.model.wadl", 10, true);
+            verifyFiles("java", true, false, "superbooks", 
"org.apache.cxf.jaxrs.model.wadl", 11, true);
+            verifyFiles("class", true, false, "superbooks", 
"org.apache.cxf.jaxrs.model.wadl", 11, true);
         } catch (Exception e) {
             fail();
             e.printStackTrace();
@@ -627,8 +627,8 @@ public class JAXRSContainerTest extends ProcessorTestBase {
 
             assertNotNull(output.list());
             
-            verifyFiles("java", true, true, "superbooks", 
"org.apache.cxf.jaxrs.model.wadl", 12, true);
-            verifyFiles("class", true, true, "superbooks", 
"org.apache.cxf.jaxrs.model.wadl", 12, true);
+            verifyFiles("java", true, true, "superbooks", 
"org.apache.cxf.jaxrs.model.wadl", 14, true);
+            verifyFiles("class", true, true, "superbooks", 
"org.apache.cxf.jaxrs.model.wadl", 14, true);
         } catch (Exception e) {
             fail();
             e.printStackTrace();

http://git-wip-us.apache.org/repos/asf/cxf/blob/77d7a462/tools/wadlto/jaxrs/src/test/java/org/apache/cxf/tools/wadlto/jaxrs/WADLToJavaTest.java
----------------------------------------------------------------------
diff --git 
a/tools/wadlto/jaxrs/src/test/java/org/apache/cxf/tools/wadlto/jaxrs/WADLToJavaTest.java
 
b/tools/wadlto/jaxrs/src/test/java/org/apache/cxf/tools/wadlto/jaxrs/WADLToJavaTest.java
index 892c8ab..51c3fbd 100644
--- 
a/tools/wadlto/jaxrs/src/test/java/org/apache/cxf/tools/wadlto/jaxrs/WADLToJavaTest.java
+++ 
b/tools/wadlto/jaxrs/src/test/java/org/apache/cxf/tools/wadlto/jaxrs/WADLToJavaTest.java
@@ -151,7 +151,7 @@ public class WADLToJavaTest extends ProcessorTestBase {
     private void verifyFiles(String ext, boolean subresourceExpected, boolean 
interfacesAndImpl, 
                              String schemaPackage, String resourcePackage) {   
 
         List<File> files = FileUtils.getFilesRecurse(output, ".+\\." + ext + 
"$");
-        int size = interfacesAndImpl ? 11 : 9;
+        int size = interfacesAndImpl ? 11 : 10;
         if (!subresourceExpected) {
             size--;
         }

http://git-wip-us.apache.org/repos/asf/cxf/blob/77d7a462/tools/wadlto/jaxrs/src/test/resources/wadl/bookstore.xml
----------------------------------------------------------------------
diff --git a/tools/wadlto/jaxrs/src/test/resources/wadl/bookstore.xml 
b/tools/wadlto/jaxrs/src/test/resources/wadl/bookstore.xml
index 3488e0f..ebf8bcd 100644
--- a/tools/wadlto/jaxrs/src/test/resources/wadl/bookstore.xml
+++ b/tools/wadlto/jaxrs/src/test/resources/wadl/bookstore.xml
@@ -182,7 +182,7 @@
                 <param name="bookid" style="template" type="xs:int"/>
                 <param name="mid" style="matrix" type="xs:int"/>
             </resource>
-            <resource path="/booksubresource" id="{http://superbooks}thebook";>
+            <resource path="/booksubresource" 
id="{http://superbooks}thebooksub";>
                 <doc>Book subresource</doc>
                 <param name="id" style="template" type="xs:int"/>
                 <param name="mid" style="matrix" type="xs:int"/>
@@ -240,7 +240,32 @@
                         </response>
                     </method>
                     <resource path="/form" 
id="org.apache.cxf.jaxrs.model.wadl.FormInterface">
-                        <resource path="/recursive" 
id="org.apache.cxf.jaxrs.model.wadl.FormInterface"/>
+                        <resource path="/multipart">
+                                   <method name="POST" id="multipart1">
+                                       <request>
+                                           <representation 
mediaType="multipart/mixed">
+                                               <param name="field1" 
style="query" type="xs:string"/>
+                                               <param name="field2" 
style="query" type="xs:anyType"/>
+                                           </representation>
+                                       </request>
+                                       <response>
+                                           <representation 
mediaType="text/plain">
+                                               <param name="result" 
style="plain" type="xs:string"/>
+                                           </representation>
+                                       </response>
+                                   </method>
+                                   <method name="PUT" id="multipart2">
+                                       <request>
+                                           <representation 
mediaType="multipart/form-data"/>
+                                       </request>
+                                       <response>
+                                           <representation 
mediaType="text/plain">
+                                               <param name="result" 
style="plain" type="xs:string"/>
+                                           </representation>
+                                       </response>
+                                   </method>
+                               </resource>
+                       <resource path="/recursive" 
id="org.apache.cxf.jaxrs.model.wadl.FormInterface"/>
                         <resource path="/c">
                             <resource path="/formSub" 
id="org.apache.cxf.jaxrs.model.wadl.FormInterface2">
                                 <param name="formid" style="template" 
type="xs:int"/>

Reply via email to