Repository: cxf
Updated Branches:
  refs/heads/master ff1da204f -> c4185d5c2


[CXF-5701,CXF-5706] More flexible support for Response


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

Branch: refs/heads/master
Commit: c4185d5c23d943a65bd9914827a51388988776e0
Parents: ff1da20
Author: Sergey Beryozkin <[email protected]>
Authored: Fri Apr 25 17:49:56 2014 +0100
Committer: Sergey Beryozkin <[email protected]>
Committed: Fri Apr 25 17:49:56 2014 +0100

----------------------------------------------------------------------
 .../cxf/tools/wadlto/WadlToolConstants.java     |  8 +--
 .../cxf/tools/wadlto/jaxrs/JAXRSContainer.java  | 13 ++++-
 .../cxf/tools/wadlto/jaxrs/SourceGenerator.java | 58 ++++++++++++++++----
 .../cxf/tools/wadlto/jaxrs/jaxrs-toolspec.xml   | 26 +++++++++
 .../tools/wadlto/jaxrs/JAXRSContainerTest.java  |  2 +
 .../jaxrs/src/test/resources/wadl/bookstore.xml |  1 +
 6 files changed, 91 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cxf/blob/c4185d5c/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/WadlToolConstants.java
----------------------------------------------------------------------
diff --git 
a/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/WadlToolConstants.java
 
b/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/WadlToolConstants.java
index 9ba9fa2..3eaa831 100644
--- 
a/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/WadlToolConstants.java
+++ 
b/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/WadlToolConstants.java
@@ -54,14 +54,12 @@ public final class WadlToolConstants {
     public static final String CFG_WADL_NAMESPACE = "wadlNamespace";
     public static final String CFG_GENERATE_ENUMS = "generateEnums";
     public static final String CFG_INHERIT_PARAMS = "inheritResourceParams";
+    public static final String CFG_GENERATE_RESPONSE_IF_HEADERS_SET = 
"generateResponseIfHeadersSet";
+    public static final String CFG_GENERATE_RESPONSE_FOR_METHODS = 
"generateResponseForMethods";
     
     // JAX-RS 2.0 @Suspended AsyncResponse
     public static final String CFG_SUSPENDED_ASYNC = "async";
-    
-    // CXF @UseAsyncMethod - equivalent of the proposed @ManagedAsync which
-    // which did not make it into JAX-RS 2.0
-    //public static final String CFG_MANAGED_ASYNC = "managedAsync";
-    
+        
     public static final String CFG_WADLURL = "wadl";
     
     

http://git-wip-us.apache.org/repos/asf/cxf/blob/c4185d5c/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/jaxrs/JAXRSContainer.java
----------------------------------------------------------------------
diff --git 
a/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/jaxrs/JAXRSContainer.java
 
b/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/jaxrs/JAXRSContainer.java
index 348693e..2d91498 100644
--- 
a/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/jaxrs/JAXRSContainer.java
+++ 
b/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/jaxrs/JAXRSContainer.java
@@ -151,6 +151,7 @@ public class JAXRSContainer extends 
AbstractCXFToolContainer {
         sg.setMediaTypeMap(getMediaTypeMap());
 
         sg.setSuspendedAsyncMethods(getSuspendedAsyncMethods());
+        sg.setResponseMethods(getResponseMethods());
         
         
sg.setGenerateEnums(context.optionSet(WadlToolConstants.CFG_GENERATE_ENUMS));
         
sg.setInheritResourceParams(context.optionSet(WadlToolConstants.CFG_INHERIT_PARAMS));
@@ -161,6 +162,8 @@ public class JAXRSContainer extends 
AbstractCXFToolContainer {
             sg.setUseVoidForEmptyResponses(false);
         }
         
+        
sg.setGenerateResponseIfHeadersSet(context.optionSet(WadlToolConstants.CFG_GENERATE_RESPONSE_IF_HEADERS_SET));
+        
         // generate
         String codeType = context.optionSet(WadlToolConstants.CFG_TYPES)
             ? SourceGenerator.CODE_TYPE_GRAMMAR : 
SourceGenerator.CODE_TYPE_PROXY;
@@ -209,7 +212,15 @@ public class JAXRSContainer extends 
AbstractCXFToolContainer {
     }
     
     public Set<String> getSuspendedAsyncMethods() {
-        Object value = context.get(WadlToolConstants.CFG_SUSPENDED_ASYNC);
+        return parseMethodList(WadlToolConstants.CFG_SUSPENDED_ASYNC);
+    }
+    
+    public Set<String> getResponseMethods() {
+        return 
parseMethodList(WadlToolConstants.CFG_GENERATE_RESPONSE_FOR_METHODS);
+    }
+    
+    private Set<String> parseMethodList(String paramName) {
+        Object value = context.get(paramName);
         if (value != null) {
             Set<String> methods = new HashSet<String>();
             String[] values = value.toString().split(",");

http://git-wip-us.apache.org/repos/asf/cxf/blob/c4185d5c/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 4082163..2d695f4 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
@@ -188,6 +188,7 @@ public class SourceGenerator {
     private boolean skipSchemaGeneration;
     private boolean inheritResourceParams;
     private boolean useVoidForEmptyResponses = true;
+    private boolean generateResponseIfHeadersSet;
     
     private Map<String, String> properties; 
     
@@ -197,6 +198,7 @@ public class SourceGenerator {
     private List<InputSource> schemaPackageFiles = Collections.emptyList();
     private List<String> compilerArgs = new ArrayList<String>();
     private Set<String> suspendedAsyncMethods = Collections.emptySet();
+    private Set<String> responseMethods = Collections.emptySet();
     private Map<String, String> schemaPackageMap = Collections.emptyMap();
     private Map<String, String> javaTypeMap = Collections.emptyMap();
     private Map<String, String> schemaTypeMap = Collections.emptyMap();
@@ -225,6 +227,11 @@ public class SourceGenerator {
     public void setUseVoidForEmptyResponses(boolean use) {
         this.useVoidForEmptyResponses = use;
     }
+    
+    public void setGenerateResponseIfHeadersSet(boolean set) {
+        this.generateResponseIfHeadersSet = true;
+    }
+    
     public String getWadlNamespace() {
         return wadlNamespace;
     }
@@ -241,6 +248,10 @@ public class SourceGenerator {
         this.suspendedAsyncMethods = asyncMethods;
     }
     
+    public void setResponseMethods(Set<String> responseMethods) {
+        this.responseMethods = responseMethods;
+    }
+    
     private String getClassPackageName(String wadlPackageName) {
         if (resourcePackageName != null) {
             return resourcePackageName;
@@ -673,8 +684,9 @@ public class SourceGenerator {
         if (id.length() == 0) {
             id = methodNameLowerCase;
         }
-        final boolean suspendedAsync = 
suspendedAsyncMethods.contains(methodNameLowerCase)
-            || methodNameLowerCase != id && 
suspendedAsyncMethods.contains(id.toLowerCase());
+        final boolean responseRequired = isMethodMatched(responseMethods, 
methodNameLowerCase, id);
+        final boolean suspendedAsync = responseRequired ? false
+            : isMethodMatched(suspendedAsyncMethods, methodNameLowerCase, id);
         
         boolean jaxpSourceRequired = xmlRequestReps.size() > 1 && 
!supportMultipleXmlReps;
         int numOfMethods = jaxpSourceRequired ? 1 : xmlRequestReps.size(); 
@@ -713,8 +725,10 @@ public class SourceGenerator {
                 sbCode.append("public ");
             }
             boolean responseTypeAvailable = true;
+            
             if (methodNameLowerCase.length() > 0) {
-                responseTypeAvailable = writeResponseType(responseEls, sbCode, 
imports, info, suspendedAsync);
+                responseTypeAvailable = writeResponseType(responseEls, sbCode, 
imports, info, 
+                                                          responseRequired, 
suspendedAsync);
                 String genMethodName = id + suffixName;
                 if (methodNameLowerCase.equals(genMethodName)) {
                     List<PathSegment> segments = 
JAXRSUtils.getPathSegments(currentPath, true, true);
@@ -769,6 +783,15 @@ public class SourceGenerator {
             sbCode.append(getLineSep()).append(getLineSep());
         }
     }
+    
+    private static boolean isMethodMatched(Set<String> methodNames, String 
methodNameLowerCase, String id) {
+        if (methodNames.isEmpty()) {
+            return false;
+        }
+        return methodNames.contains(methodNameLowerCase) 
+            || methodNameLowerCase != id && 
methodNames.contains(id.toLowerCase())
+            || methodNames.size() == 1 && 
"*".equals(methodNames.iterator().next());
+    }
 
     private List<Element> getXmlReps(List<Element> repElements) {
         Set<String> values = new HashSet<String>(repElements.size());
@@ -857,6 +880,7 @@ public class SourceGenerator {
                                       StringBuilder sbCode,
                                       Set<String> imports,  
                                       ContextInfo info,
+                                      boolean responseRequired,
                                       boolean suspendedAsync) {
         
         Element okResponse = !suspendedAsync ? getOKResponse(responseEls) : 
null;
@@ -867,27 +891,39 @@ public class SourceGenerator {
         } else {
             repElements = CastUtils.cast(Collections.emptyList(), 
Element.class);
         }
-        
+        if (!suspendedAsync && !responseRequired && responseEls.size() == 1 && 
generateResponseIfHeadersSet) {
+            List<Element> outResponseParamElements = 
+                getParameters(responseEls.get(0), info.getInheritedParams(), 
false);
+            if (outResponseParamElements.size() > 0) {
+                writeJaxrResponse(sbCode, imports);
+                return true;
+            }
+        }
         if (repElements.size() == 0) {
-            if (useVoidForEmptyResponses || suspendedAsync) {
+            if (useVoidForEmptyResponses && !responseRequired || 
suspendedAsync) {
                 sbCode.append("void ");
+                return false;
             } else {
-                addImport(imports, Response.class.getName());
-                sbCode.append("Response ");
+                writeJaxrResponse(sbCode, imports);
+                return true;
             }
-            return false;
         }
-        String elementName = getElementRefName(
+        
+        String elementName = responseRequired ? null : getElementRefName(
                 getActualRepElement(repElements, 
getXmlReps(repElements).get(0)), info, imports);
         if (elementName != null) {
             sbCode.append(elementName + " ");
         } else {
-            addImport(imports, Response.class.getName());
-            sbCode.append("Response ");
+            writeJaxrResponse(sbCode, imports);
         }
         return true;
     }
     
+    private void writeJaxrResponse(StringBuilder sbCode, Set<String> imports) {
+        addImport(imports, Response.class.getName());
+        sbCode.append(Response.class.getSimpleName()).append(" ");
+    }
+    
     private Element getOKResponse(List<Element> responseEls) {
         for (int i = 0; i < responseEls.size(); i++) {
             String statusValue = responseEls.get(i).getAttribute("status");

http://git-wip-us.apache.org/repos/asf/cxf/blob/c4185d5c/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/jaxrs/jaxrs-toolspec.xml
----------------------------------------------------------------------
diff --git 
a/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/jaxrs/jaxrs-toolspec.xml
 
b/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/jaxrs/jaxrs-toolspec.xml
index 2a66a24..a894c4c 100644
--- 
a/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/jaxrs/jaxrs-toolspec.xml
+++ 
b/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/jaxrs/jaxrs-toolspec.xml
@@ -143,6 +143,16 @@ Examples:
                 </annotation>
                 <switch>impl</switch>
             </option>
+            <option id="async" maxOccurs="unbounded">
+                <annotation>
+                    Specifies a comma separated list of method names or 
identifiers 
+                    which need to support suspended asynchronous invocations   
                  
+                </annotation>
+                <associatedArgument placement="immediate">
+                    <annotation>methodNames</annotation>
+                </associatedArgument>
+                <switch>async</switch>
+            </option>
             <option id="generateEnums" maxOccurs="1">
                 <annotation>
                     Specifies that Enum classes can be generated to represent
@@ -185,6 +195,22 @@ Examples:
                 </annotation>
                 <switch>supportMultipleXmlReps</switch>
             </option>
+            <option id="generateResponseIfHeadersSet" maxOccurs="1">
+                <annotation>
+                   Use JAX-RS Response return type if WADL Response element 
has 'header' parameters   
+                </annotation>
+                <switch>generateResponseIfHeadersSet</switch>
+            </option>
+            <option id="generateResponseForMethods" maxOccurs="unbounded">
+                <annotation>
+                    Specifies a comma separated list of method names or 
identifiers 
+                    which need to have JAXRS Response return type generated    
                 
+                </annotation>
+                <associatedArgument placement="immediate">
+                    <annotation>methodNames</annotation>
+                </associatedArgument>
+                <switch>generateResponseForMethods</switch>
+            </option>
             <option id="async" maxOccurs="unbounded">
                 <annotation>
                     Specifies a comma separated list of method names or 
identifiers 

http://git-wip-us.apache.org/repos/asf/cxf/blob/c4185d5c/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 002ffd0..7d58f4d 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
@@ -45,6 +45,8 @@ public class JAXRSContainerTest extends ProcessorTestBase {
             context.put(WadlToolConstants.CFG_MEDIA_TYPE_MAP, 
                         
"multipart/form-data=org.apache.cxf.jaxrs.ext.multipart.MultipartBody");
             context.put(WadlToolConstants.CFG_NO_VOID_FOR_EMPTY_RESPONSES, 
"true");
+            
context.put(WadlToolConstants.CFG_GENERATE_RESPONSE_IF_HEADERS_SET, "true");
+            context.put(WadlToolConstants.CFG_GENERATE_RESPONSE_FOR_METHODS, 
"getName");
             context.put(WadlToolConstants.CFG_COMPILE, "true");
             
             container.setContext(context);

http://git-wip-us.apache.org/repos/asf/cxf/blob/c4185d5c/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 eb5d938..3488e0f 100644
--- a/tools/wadlto/jaxrs/src/test/resources/wadl/bookstore.xml
+++ b/tools/wadlto/jaxrs/src/test/resources/wadl/bookstore.xml
@@ -172,6 +172,7 @@
                     <response>
                         <representation mediaType="application/xml" 
element="prefix1:thechapter"/>
                         <representation mediaType="application/json"/>
+                        <param name="Cache-Control" style="header" 
type="xsd:string"/>
                     </response>
                 </method>
             </resource>

Reply via email to