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/25 21:52:26 UTC

[cxf] branch master updated: 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 master
in repository https://gitbox.apache.org/repos/asf/cxf.git


The following commit(s) were added to refs/heads/master by this push:
     new 5ed6310  CXF-7814: wadl2java: support the JAX-RS 2.1 reactive results
5ed6310 is described below

commit 5ed6310b1621f8a61172c3be85ab66af0310af67
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
---
 .../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 acfbb68..64a49ca 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.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 05773bc..82050e1 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
@@ -214,6 +214,8 @@ public class SourceGenerator {
     private String authentication;
     private boolean createJavaDocs;
     private String jaxbClassNameSuffix;
+    private String rx;
+    private ResponseWrapper responseWrapper;
 
     public SourceGenerator() {
         this(Collections.emptyMap());
@@ -222,6 +224,7 @@ public class SourceGenerator {
     public SourceGenerator(Map<String, String> properties) {
         String value = properties.get(LINE_SEP_PROPERTY);
         lineSeparator = value == null ? SystemPropertyAction.getProperty(LINE_SEP_PROPERTY) : value;
+        responseWrapper = ResponseWrapper.create(rx);
     }
 
     public void setSupportMultipleXmlReps(boolean support) {
@@ -1125,7 +1128,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);
         }
@@ -1134,7 +1137,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) {
@@ -2021,6 +2024,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())) {