You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2023/01/18 14:30:59 UTC

[camel] 01/02: CAMEL-18909: DTO generator option in camel-jbang generate command (#9154)

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

davsclaus pushed a commit to branch camel-3.x
in repository https://gitbox.apache.org/repos/asf/camel.git

commit f52714514cf05efdfa9f4fafc37bfbcc820c5ce0
Author: Marat Gubaidullin <ma...@gmail.com>
AuthorDate: Wed Jan 18 09:29:13 2023 -0500

    CAMEL-18909: DTO generator option in camel-jbang generate command (#9154)
---
 dsl/camel-jbang/camel-jbang-core/pom.xml           | 15 +++++
 .../dsl/jbang/core/commands/CodeRestGenerator.java | 68 +++++++++++++++++++---
 parent/pom.xml                                     |  1 +
 3 files changed, 76 insertions(+), 8 deletions(-)

diff --git a/dsl/camel-jbang/camel-jbang-core/pom.xml b/dsl/camel-jbang/camel-jbang-core/pom.xml
index 58ec1e48f36..cb854754ea5 100644
--- a/dsl/camel-jbang/camel-jbang-core/pom.xml
+++ b/dsl/camel-jbang/camel-jbang-core/pom.xml
@@ -124,6 +124,21 @@
             <artifactId>camel-openapi-rest-dsl-generator</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.openapitools</groupId>
+            <artifactId>openapi-generator</artifactId>
+            <version>${openapi-generator}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-api</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-simple</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
         <dependency>
             <groupId>com.fasterxml.jackson.core</groupId>
             <artifactId>jackson-databind</artifactId>
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CodeRestGenerator.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CodeRestGenerator.java
index df225fd407b..77de42e177e 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CodeRestGenerator.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CodeRestGenerator.java
@@ -16,8 +16,10 @@
  */
 package org.apache.camel.dsl.jbang.core.commands;
 
+import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
+import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.util.Map;
@@ -31,10 +33,16 @@ import org.apache.camel.generator.openapi.RestDslGenerator;
 import org.apache.camel.impl.lw.LightweightCamelContext;
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.core.config.Configurator;
+import org.openapitools.codegen.ClientOptInput;
+import org.openapitools.codegen.DefaultGenerator;
+import org.openapitools.codegen.config.CodegenConfigurator;
 import org.yaml.snakeyaml.Yaml;
 import org.yaml.snakeyaml.constructor.SafeConstructor;
 import picocli.CommandLine;
 
+import static org.openapitools.codegen.CodegenConstants.GENERATE_MODELS;
+import static org.openapitools.codegen.CodegenConstants.SERIALIZABLE_MODEL;
+
 @CommandLine.Command(name = "rest", description = "Generate REST DSL source code from OpenApi specification")
 public class CodeRestGenerator extends CamelCommand {
 
@@ -42,10 +50,16 @@ public class CodeRestGenerator extends CamelCommand {
     private String input;
     @CommandLine.Option(names = { "-o", "--output" }, description = "Output REST DSL file name")
     private String output;
-    @CommandLine.Option(names = { "-t", "--type" }, description = "REST DSL type (YAML or XML)", defaultValue = "yaml")
+    @CommandLine.Option(names = { "-t", "--type" }, description = "REST DSL type (YAML or XML)")
     private String type;
     @CommandLine.Option(names = { "-r", "--routes" }, description = "Generate routes (YAML)")
     private boolean generateRoutes;
+    @CommandLine.Option(names = { "-d", "--dto" }, description = "Data Objects")
+    private boolean generateDataObjects;
+    @CommandLine.Option(names = { "-run", "--runtime" }, description = "Runtime (quarkus, spring-boot)", defaultValue = "quarkus")
+    private String runtime;
+    @CommandLine.Option(names = { "-p", "--package" }, description = "Package for generated models", defaultValue = "model")
+    private String packageName;
 
     public CodeRestGenerator(CamelJBangMain main) {
         super(main);
@@ -57,15 +71,23 @@ public class CodeRestGenerator extends CamelCommand {
         OasDocument document = (OasDocument) Library.readDocument(node);
         Configurator.setRootLevel(Level.OFF);
         try (CamelContext context = new LightweightCamelContext()) {
-            final String yaml = type.equalsIgnoreCase("yaml")
-                    ? RestDslGenerator.toYaml(document).generate(context, generateRoutes)
-                    : RestDslGenerator.toXml(document).generate(context);
-            if (output == null) {
-                System.out.println(yaml);
-            } else {
-                Files.write(Paths.get(output), yaml.getBytes());
+            String text = null;
+            if (type.equalsIgnoreCase("yaml")) {
+                text = RestDslGenerator.toYaml(document).generate(context, generateRoutes);
+            } else if (type.equalsIgnoreCase("xml")) {
+                text = RestDslGenerator.toXml(document).generate(context);
+            }
+            if (text != null) {
+                if (output == null) {
+                    System.out.println(text);
+                } else {
+                    Files.write(Paths.get(output), text.getBytes());
+                }
             }
         }
+        if (generateDataObjects) {
+            generateDto();
+        }
         return 0;
     }
 
@@ -80,4 +102,34 @@ public class CodeRestGenerator extends CamelCommand {
         Map map = loader.load(new FileInputStream(Paths.get(input).toFile()));
         return mapper.convertValue(map, JsonNode.class);
     }
+
+    private void generateDto() throws IOException {
+        final String CODE = "code";
+        final String GENERATOR_NAME = "quarkus".equals(runtime) ? "jaxrs-spec" : "java-camel";
+        final String LIBRARY = "quarkus".equals(runtime) ? "quarkus" : "spring-boot";
+        File output = Files.createTempDirectory("gendto").toFile();
+
+        final CodegenConfigurator configurator = new CodegenConfigurator()
+                .setGeneratorName(GENERATOR_NAME)
+                .setLibrary(LIBRARY)
+                .setInputSpec(input)
+                .setModelPackage(packageName)
+                .setAdditionalProperties(
+                        Map.of(
+                                SERIALIZABLE_MODEL, "false",
+                                "useJakartaEe", "true",
+                                "useSwaggerAnnotations", "false",
+                                GENERATE_MODELS, "true",
+                                "generatePom", "false",
+                                "generateApis", "false",
+                                "sourceFolder", CODE
+                        )
+                )
+                .setOutputDir(output.getAbsolutePath());
+
+        final ClientOptInput clientOptInput = configurator.toClientOptInput();
+        new DefaultGenerator().opts(clientOptInput).generate();
+        File generated = new File(Paths.get(output.getAbsolutePath(), CODE, packageName).toUri());
+        generated.renameTo(new File(packageName));
+    }
 }
diff --git a/parent/pom.xml b/parent/pom.xml
index 335da04ab88..b97ae08e1f0 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -425,6 +425,7 @@
         <olingo2-version>2.0.11</olingo2-version>
         <olingo4-version>4.8.0</olingo4-version>
         <ognl-version>3.1.12</ognl-version>
+        <openapi-generator>6.2.1</openapi-generator>
         <openjpa-version>3.2.2</openjpa-version>
         <openstack4j-version>3.10</openstack4j-version>
         <opentelemetry-version>1.21.0</opentelemetry-version>