You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by re...@apache.org on 2020/01/26 03:47:03 UTC
[cxf] 01/02: CXF-7814: wadl2java: support the JAX-RS 2.1 reactive
results
This is an automated email from the ASF dual-hosted git repository.
reta pushed a commit to branch 3.3.x-fixes
in repository https://gitbox.apache.org/repos/asf/cxf.git
commit 5c3e0c93b6b50cad8a99e4e8a8316f324de68ffd
Author: reta <dr...@gmail.com>
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)
# Conflicts:
# tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/jaxrs/SourceGenerator.java
---
.../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 bf9119a..1bc6243 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 75e122a..4c46f40 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 12b049c..7525908 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 601d637..6fa7e09 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 991c56c..af72010 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
@@ -228,6 +228,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());
@@ -235,6 +237,7 @@ public class SourceGenerator {
public SourceGenerator(Map<String, String> properties) {
this.properties = properties;
+ responseWrapper = ResponseWrapper.create(rx);
}
public void setSupportMultipleXmlReps(boolean support) {
@@ -1199,7 +1202,7 @@ public class SourceGenerator {
info, imports, true);
}
if (elementType != null) {
- sbCode.append(elementType).append(' ');
+ sbCode.append(responseWrapper.wrap(elementType, imports)).append(' ');
} else {
writeJaxrResponse(sbCode, imports);
}
@@ -1208,7 +1211,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) {
@@ -2100,6 +2103,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 6d4f979..5865d3a 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
@@ -92,6 +92,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 {
try (URLClassLoader cl = new URLClassLoader(new URL[] {output.toURI().toURL()},
Thread.currentThread().getContextClassLoader())) {