This is an automated email from the ASF dual-hosted git repository. reta pushed a commit to branch 3.2.x-fixes in repository https://gitbox.apache.org/repos/asf/cxf.git
commit ea39b79ea60c596c7773d0ffb694668ae3ad82b4 Author: reta <[email protected]> AuthorDate: Sat Jan 25 16:52:07 2020 -0500 CXF-7814: wadl2java: support the JAX-RS 2.1 reactive results (cherry picked from commit 5ed6310b1621f8a61172c3be85ab66af0310af67) --- .../src/it/wadl-generate-rx/cxf7814.wadl | 31 ++++++++ .../src/it/wadl-generate-rx/pom.xml | 86 +++++++++++++++++++++ .../wadlto/AbstractCodeGeneratorMojo.java | 1 + .../org/apache/cxf/maven_plugin/wadlto/Option.java | 18 ++++- .../apache/cxf/maven_plugin/wadlto/WadlOption.java | 1 + .../apache/cxf/tools/wadlto/WadlToolConstants.java | 3 + .../cxf/tools/wadlto/jaxrs/JAXRSContainer.java | 1 + .../cxf/tools/wadlto/jaxrs/ResponseWrapper.java | 88 ++++++++++++++++++++++ .../cxf/tools/wadlto/jaxrs/SourceGenerator.java | 12 ++- .../cxf/tools/wadlto/jaxrs/jaxrs-toolspec.xml | 10 +++ .../cxf/tools/wadlto/jaxrs/WADLToJavaTest.java | 30 ++++++++ 11 files changed, 277 insertions(+), 4 deletions(-) diff --git a/maven-plugins/wadl2java-plugin/src/it/wadl-generate-rx/cxf7814.wadl b/maven-plugins/wadl2java-plugin/src/it/wadl-generate-rx/cxf7814.wadl new file mode 100644 index 0000000..92bbddb --- /dev/null +++ b/maven-plugins/wadl2java-plugin/src/it/wadl-generate-rx/cxf7814.wadl @@ -0,0 +1,31 @@ +<application xmlns="http://wadl.dev.java.net/2009/02" xmlns:xs="http://www.w3.org/2001/XMLSchema" > + <grammars /> + <resources> + <resource id="Test1" path="/1"> + <method name="PUT" > + <request> + <param name="standalone" style="query" type="xs:boolean" /> + <representation mediaType="multipart/mixed"> + <param name="action" style="query" type="xs:anyType" /> + <param name="sources" style="query" type="xs:anyType" required="false" /> + </representation> + </request> + <response> + <representation mediaType="text/plain"> + <param name="result" style="plain" type="xs:string"/> + </representation> + </response> + </method> + </resource> + <resource id="Test2" path="/2"> + <method name="PUT" > + <request> + <param name="snapshot" style="query" type="xs:boolean" required="true" /> + <representation mediaType="application/json"> + <param name="flow" style="plain" type="xs:anyType" required="true" /> + </representation> + </request> + </method> + </resource> + </resources> +</application> diff --git a/maven-plugins/wadl2java-plugin/src/it/wadl-generate-rx/pom.xml b/maven-plugins/wadl2java-plugin/src/it/wadl-generate-rx/pom.xml new file mode 100644 index 0000000..ea72046 --- /dev/null +++ b/maven-plugins/wadl2java-plugin/src/it/wadl-generate-rx/pom.xml @@ -0,0 +1,86 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>org.apache.cxf</groupId> + <artifactId>cxf7814-codegen</artifactId> + <version>1.0.0-SNAPSHOT</version> + <packaging>jar</packaging> + <name>cxf7511-codegen</name> + + <properties> + <wadl.groupid>org.apache.cxf.cxf7814</wadl.groupid> + <wadl.artifactid>cxf7814wadl</wadl.artifactid> + <wadl.version>1.0.0</wadl.version> + </properties> + + + <dependencies> + <dependency> + <groupId>org.apache.cxf</groupId> + <artifactId>cxf-rt-frontend-jaxrs</artifactId> + <version>@project.version@</version> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <artifactId>maven-install-plugin</artifactId> + <version>2.5.2</version> + <executions> + <execution> + <phase>initialize</phase> + <goals> + <goal>install-file</goal> + </goals> + <configuration> + <groupId>${wadl.groupid}</groupId> + <artifactId>${wadl.artifactid}</artifactId> + <version>${wadl.version}</version> + <packaging>wadl</packaging> + <file>cxf7814.wadl</file> + </configuration> + </execution> + </executions> + </plugin> + <plugin> + <artifactId>maven-compiler-plugin</artifactId> + <version>3.8.1</version> + <configuration> + <source>1.8</source> + <target>1.8</target> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.cxf</groupId> + <artifactId>cxf-wadl2java-plugin</artifactId> + <version>@project.version@</version> + <executions> + <execution> + <id>generate-sources</id> + <phase>generate-sources</phase> + <configuration> + <wadlOptions> + <wadlOption> + <wadlArtifact> + <groupId>${wadl.groupid}</groupId> + <artifactId>${wadl.artifactid}</artifactId> + <version>${wadl.version}</version> + <type>wadl</type> + </wadlArtifact> + <rx>java8</rx> + <extraargs> + <extraarg>-verbose</extraarg> + </extraargs> + </wadlOption> + </wadlOptions> + </configuration> + <goals> + <goal>wadl2java</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> + </build> +</project> diff --git a/maven-plugins/wadl2java-plugin/src/main/java/org/apache/cxf/maven_plugin/wadlto/AbstractCodeGeneratorMojo.java b/maven-plugins/wadl2java-plugin/src/main/java/org/apache/cxf/maven_plugin/wadlto/AbstractCodeGeneratorMojo.java index f2a621e..9980cd2 100644 --- a/maven-plugins/wadl2java-plugin/src/main/java/org/apache/cxf/maven_plugin/wadlto/AbstractCodeGeneratorMojo.java +++ b/maven-plugins/wadl2java-plugin/src/main/java/org/apache/cxf/maven_plugin/wadlto/AbstractCodeGeneratorMojo.java @@ -411,6 +411,7 @@ public abstract class AbstractCodeGeneratorMojo extends AbstractMojo { BusFactory.setThreadDefaultBus(bus); } try { + System.out.print(java.util.Arrays.toString(args)); new WADLToJava(args).run(new ToolContext()); } catch (Throwable e) { getLog().debug(e); diff --git a/maven-plugins/wadl2java-plugin/src/main/java/org/apache/cxf/maven_plugin/wadlto/Option.java b/maven-plugins/wadl2java-plugin/src/main/java/org/apache/cxf/maven_plugin/wadlto/Option.java index 785c7ce..8d796a6 100644 --- a/maven-plugins/wadl2java-plugin/src/main/java/org/apache/cxf/maven_plugin/wadlto/Option.java +++ b/maven-plugins/wadl2java-plugin/src/main/java/org/apache/cxf/maven_plugin/wadlto/Option.java @@ -89,6 +89,12 @@ public class Option { * */ private List<String> schemaPackagenames = new ArrayList<>(); + + /** + * Specifies the library to use for JAX-RS 2.1 reactive extensions + */ + private String rx; + public Option() { super(); @@ -188,6 +194,14 @@ public class Option { this.extraargs.addAll(ea); } + public String getRx() { + return rx; + } + + public void setRx(String rx) { + this.rx = rx; + } + public void copyOptions(Option destination) { destination.setBindingFiles(getBindingFiles()); destination.setCatalog(getCatalog()); @@ -197,10 +211,9 @@ public class Option { destination.setDependencies(getDependencies()); destination.setOutputDir(getOutputDir()); destination.setExtraargs(getExtraargs()); + destination.setRx(getRx()); } - - private <T> T setIfNull(T dest, T source) { if (dest == null) { dest = source; @@ -218,6 +231,7 @@ public class Option { dependencies = mergeList(dependencies, defaultOptions.dependencies, File.class); redundantDirs = mergeList(redundantDirs, defaultOptions.redundantDirs, File.class); schemaPackagenames.addAll(defaultOptions.schemaPackagenames); + rx = setIfNull(rx, defaultOptions.rx); extraargs.addAll(defaultOptions.extraargs); } diff --git a/maven-plugins/wadl2java-plugin/src/main/java/org/apache/cxf/maven_plugin/wadlto/WadlOption.java b/maven-plugins/wadl2java-plugin/src/main/java/org/apache/cxf/maven_plugin/wadlto/WadlOption.java index 8e6a008..735add7 100644 --- a/maven-plugins/wadl2java-plugin/src/main/java/org/apache/cxf/maven_plugin/wadlto/WadlOption.java +++ b/maven-plugins/wadl2java-plugin/src/main/java/org/apache/cxf/maven_plugin/wadlto/WadlOption.java @@ -155,6 +155,7 @@ public class WadlOption extends Option { addList(list, "-sp", true, getSchemaPackagenames()); addIfTrue(list, isImpl(), "-impl"); addIfTrue(list, isInterface(), "-interface"); + addIfNotNull(list, getRx(), "-rx"); addList(list, "", false, getExtraargs()); list.add(wadlURI.toString()); return list; 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 6754a81..8c7412a 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 @@ -66,6 +66,9 @@ public final class WadlToolConstants { // JAX-RS 2.0 @Suspended AsyncResponse public static final String CFG_SUSPENDED_ASYNC = "async"; + // JAX-RS 2.1 Reactive Extensions + public static final String CFG_RX = "rx"; + public static final String CFG_WADLURL = "wadl"; 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 82bc11b..8ef51b7 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 @@ -164,6 +164,7 @@ public class JAXRSContainer extends AbstractCXFToolContainer { sg.setGenerateEnums(context.optionSet(WadlToolConstants.CFG_GENERATE_ENUMS)); sg.setValidateWadl(context.optionSet(WadlToolConstants.CFG_VALIDATE_WADL)); + sg.setRx(context.get(WadlToolConstants.CFG_RX, String.class)); boolean inheritResourceParams = context.optionSet(WadlToolConstants.CFG_INHERIT_PARAMS); sg.setInheritResourceParams(inheritResourceParams); if (inheritResourceParams) { diff --git a/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/jaxrs/ResponseWrapper.java b/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/jaxrs/ResponseWrapper.java new file mode 100644 index 0000000..c855117 --- /dev/null +++ b/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/jaxrs/ResponseWrapper.java @@ -0,0 +1,88 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.cxf.tools.wadlto.jaxrs; + +import java.util.Set; + +import org.apache.cxf.common.util.StringUtils; + +/** + * Wraps response into the container if necessary (for example, when code is generated + * using the JAX-RS 2.1 Reactive Extensions). + */ +interface ResponseWrapper { + /** + * Wraps response into the container if necessary + * @param type the response type + * @param imports current set of import statements to enrich + * @return response wrapped into the container if necessary + */ + String wrap(String type, Set<String> imports); + + /** + * Wraps response into the container if necessary + * @param type the response type + * s@param imports current set of import statements to enrich + * @return response wrapped into the container if necessary + */ + default String wrap(Class<?> type, Set<String> imports) { + return wrap(type.getSimpleName(), imports); + } + + /** + * Creates a new instance of the response wrapper + * @param library the reactive library to use (or null if none) + * @return the instance of the response wrapper + */ + static ResponseWrapper create(String library) { + if (StringUtils.isEmpty(library)) { + return new NoopResponseWrapper(); + } else if ("java8".equalsIgnoreCase(library.trim())) { + return new Java8ResponseWrapper(); + } else { + throw new IllegalArgumentException("The Reactive Extensions library is not supported: " + library); + } + } +} + +/** + * Noop response wrapper, returns the response as-is. + */ +class NoopResponseWrapper implements ResponseWrapper { + @Override + public String wrap(String type, Set<String> imports) { + return type; + } +} + +/** + * Response wrapper for java.util.concurrent.CompletableFuture, returns + * the response wrapped into CompletableFuture<?> container. + */ +class Java8ResponseWrapper implements ResponseWrapper { + @Override + public String wrap(String type, Set<String> imports) { + if (imports != null) { + imports.add("java.util.concurrent.CompletableFuture"); + } + + return "CompletableFuture<" + type + ">"; + } +} \ No newline at end of file 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 7cce4ad..d5f93c6 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 @@ -230,6 +230,8 @@ public class SourceGenerator { private String authentication; private boolean createJavaDocs; private String jaxbClassNameSuffix; + private String rx; + private ResponseWrapper responseWrapper; public SourceGenerator() { this(Collections.<String, String>emptyMap()); @@ -237,6 +239,7 @@ public class SourceGenerator { public SourceGenerator(Map<String, String> properties) { this.properties = properties; + responseWrapper = ResponseWrapper.create(rx); } public void setSupportMultipleXmlReps(boolean support) { @@ -1201,7 +1204,7 @@ public class SourceGenerator { info, imports, true); } if (elementType != null) { - sbCode.append(elementType + " "); + sbCode.append(responseWrapper.wrap(elementType, imports)).append(' '); } else { writeJaxrResponse(sbCode, imports); } @@ -1210,7 +1213,7 @@ public class SourceGenerator { private void writeJaxrResponse(StringBuilder sbCode, Set<String> imports) { addImport(imports, Response.class.getName()); - sbCode.append(Response.class.getSimpleName()).append(" "); + sbCode.append(responseWrapper.wrap(Response.class, imports)).append(' '); } private static Element getOKResponse(List<Element> responseEls) { @@ -2108,6 +2111,11 @@ public class SourceGenerator { this.jaxbClassNameSuffix = jaxbClassNameSuffix; } + public void setRx(String rx) { + this.rx = rx; + this.responseWrapper = ResponseWrapper.create(rx); + } + private static class GrammarInfo { private Map<String, String> nsMap = new HashMap<>(); private Map<String, String> elementTypeMap = new HashMap<>(); 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 2c32e10..8b400f8 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 @@ -289,6 +289,16 @@ Examples: </associatedArgument> <switch>oneway</switch> </option> + <option id="rx" maxOccurs="1"> + <annotation> + Specifies the use of the JAX-RS 2.1 reactive extensions for generating + method signatures. The supported values are: java8 + </annotation> + <switch>rx</switch> + <associatedArgument placement="afterSpace"> + <annotation>library</annotation> + </associatedArgument> + </option> </optionGroup> <optionGroup id="common_options"> <option id="help" maxOccurs="1"> 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 f3b89cf..3e9211e 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 @@ -98,6 +98,36 @@ public class WADLToJavaTest extends ProcessorTestBase { } } + @Test + public void testGenerateRxJava8() throws Exception { + String[] args = new String[] { + "-d", + output.getCanonicalPath(), + "-p", + "custom.service", + "-rx", + "java8", + "-compile", + "-xjc-episode " + output.getAbsolutePath() + "/test.episode", + "-xjc-XtoString", + getLocation("/wadl/bookstore.xml"), + }; + + WADLToJava tool = new WADLToJava(args); + tool.run(new ToolContext()); + assertNotNull(output.list()); + + verifyFiles("java", true, false, "superbooks", "custom.service"); + verifyFiles("class", true, false, "superbooks", "custom.service"); + assertTrue(new File(output.getAbsolutePath() + "/test.episode").exists()); + + List<Class<?>> schemaClassFiles = getSchemaClassFiles(); + assertEquals(4, schemaClassFiles.size()); + for (Class<?> c : schemaClassFiles) { + c.getMethod("toString"); + } + } + private List<Class<?>> getSchemaClassFiles() throws Exception { URLClassLoader cl = new URLClassLoader(new URL[] {output.toURI().toURL()}, Thread.currentThread().getContextClassLoader());
