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());

Reply via email to