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>
