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>