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:02 UTC

[cxf] branch 3.3.x-fixes updated (e690a84 -> f3b00f0)

This is an automated email from the ASF dual-hosted git repository.

reta pushed a change to branch 3.3.x-fixes
in repository https://gitbox.apache.org/repos/asf/cxf.git.


    from e690a84  Recording .gitmergeinfo Changes
     new 5c3e0c9  CXF-7814: wadl2java: support the JAX-RS 2.1 reactive results
     new f3b00f0  Recording .gitmergeinfo Changes

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .gitmergeinfo                                      |  1 +
 .../cxf7511.wadl => wadl-generate-rx/cxf7814.wadl} |  5 ++
 .../pom.xml                                        |  9 ++-
 .../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 ++++++++
 12 files changed, 171 insertions(+), 8 deletions(-)
 copy maven-plugins/wadl2java-plugin/src/it/{wsdl-artifact-resolution/cxf7511.wadl => wadl-generate-rx/cxf7814.wadl} (84%)
 copy maven-plugins/wadl2java-plugin/src/it/{wsdl-artifact-resolution => wadl-generate-rx}/pom.xml (92%)
 create mode 100644 tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/jaxrs/ResponseWrapper.java


[cxf] 02/02: Recording .gitmergeinfo Changes

Posted by re...@apache.org.
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 f3b00f002a4634a40d043bea856117f60aac4246
Author: reta <dr...@gmail.com>
AuthorDate: Sat Jan 25 22:22:53 2020 -0500

    Recording .gitmergeinfo Changes
---
 .gitmergeinfo | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.gitmergeinfo b/.gitmergeinfo
index b9cc0fc..30c1edb 100644
--- a/.gitmergeinfo
+++ b/.gitmergeinfo
@@ -127,6 +127,7 @@ M 55abc6f8416fd81f26627fa42a37f903f9ef7965
 M 589e321622b72ae57fab910d76b3e4fb0c160979
 M 59ba4821c92146723df063f9eb6e1c3ae0be5834
 M 5aa0660a9fe324e5c8f36e47e270971d0e85b6f8
+M 5ed6310b1621f8a61172c3be85ab66af0310af67
 M 61aeaff2d747379c64cdad40f82cf51e3bfaecf6
 M 69b805a97fa96716c8f76278e577ba122c2727e2
 M 6b7e50b87d74dc6b7d1e830b373c7e30c04e14a2


[cxf] 01/02: CXF-7814: wadl2java: support the JAX-RS 2.1 reactive results

Posted by re...@apache.org.
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())) {