This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push: new 96327654e0b CAMEL-20651: camel-jbang - The open-api should use the new contract-first openapi 96327654e0b is described below commit 96327654e0baca6d4c1ca12753faf986cfcb5388 Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Mon Apr 29 09:32:25 2024 +0200 CAMEL-20651: camel-jbang - The open-api should use the new contract-first openapi --- .../component/rest/openapi/RestOpenApiHelper.java | 4 ++ .../dsl/jbang/core/commands/ExportCamelMain.java | 15 ++++++++ .../dsl/jbang/core/commands/ExportSpringBoot.java | 5 +++ .../apache/camel/dsl/jbang/core/commands/Run.java | 43 +++++++--------------- .../main/resources/templates/rest-dsl.yaml.tmpl | 5 +++ 5 files changed, 43 insertions(+), 29 deletions(-) diff --git a/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiHelper.java b/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiHelper.java index fc8e460c551..088db205b6e 100644 --- a/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiHelper.java +++ b/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiHelper.java @@ -107,6 +107,10 @@ final class RestOpenApiHelper { // strip off the first "/" if double "/" exists basePath = basePath.substring(1); } + // strip ending slash + if (basePath.endsWith("/")) { + basePath = basePath.substring(0, basePath.length() - 1); + } if ("/".equals(basePath)) { basePath = ""; } diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportCamelMain.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportCamelMain.java index c45e3e7a653..782589666ea 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportCamelMain.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportCamelMain.java @@ -316,6 +316,11 @@ class ExportCamelMain extends Export { answer.removeIf(s -> s.contains("camel-main")); answer.removeIf(s -> s.contains("camel-health")); + if (openapi != null) { + // include http server if using openapi + answer.add("mvn:org.apache.camel:camel-platform-http-main"); + } + // if platform-http is included then we need to switch to use camel-platform-http-main as implementation if (answer.stream().anyMatch(s -> s.contains("camel-platform-http") && !s.contains("camel-platform-http-main"))) { answer.removeIf(s -> s.contains("org.apache.camel:camel-platform-http:")); @@ -327,6 +332,16 @@ class ExportCamelMain extends Export { return answer; } + @Override + protected void prepareApplicationProperties(Properties properties) { + if (openapi != null) { + // enable http server if not explicit configured + if (properties.getProperty("camel.server.enabled") == null) { + properties.setProperty("camel.server.enabled", "true"); + } + } + } + private void createMainClassSource(File srcJavaDir, String packageName, String mainClassname) throws Exception { InputStream is = ExportCamelMain.class.getClassLoader().getResourceAsStream("templates/main.tmpl"); String context = IOHelper.loadText(is); diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportSpringBoot.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportSpringBoot.java index ce80383e76c..d5070320abf 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportSpringBoot.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportSpringBoot.java @@ -361,6 +361,11 @@ class ExportSpringBoot extends Export { // remove out of the box dependencies answer.removeIf(s -> s.contains("camel-core")); + if (openapi != null) { + // include http server if using openapi + answer.add("mvn:org.apache.camel:camel-platform-http"); + } + return answer; } diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java index e713975b98d..795b6ae8f5a 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java @@ -46,12 +46,6 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.fasterxml.jackson.dataformat.yaml.YAMLMapper; -import io.apicurio.datamodels.Library; -import io.apicurio.datamodels.models.openapi.OpenApiDocument; -import org.apache.camel.CamelContext; import org.apache.camel.catalog.CamelCatalog; import org.apache.camel.catalog.DefaultCamelCatalog; import org.apache.camel.dsl.jbang.core.common.CommandLineHelper; @@ -59,8 +53,6 @@ import org.apache.camel.dsl.jbang.core.common.LoggingLevelCompletionCandidates; import org.apache.camel.dsl.jbang.core.common.RuntimeCompletionCandidates; import org.apache.camel.dsl.jbang.core.common.RuntimeUtil; import org.apache.camel.dsl.jbang.core.common.VersionHelper; -import org.apache.camel.generator.openapi.RestDslGenerator; -import org.apache.camel.impl.DefaultCamelContext; import org.apache.camel.main.KameletMain; import org.apache.camel.main.download.DownloadListener; import org.apache.camel.spi.BacklogDebugger; @@ -1254,7 +1246,7 @@ public class Run extends CamelCommand { content = content.replaceFirst("\\{\\{ \\.CamelKameletsDependencies }}", sb.toString()); String fn = CommandLineHelper.CAMEL_JBANG_WORK_DIR + "/CustomCamelJBang.java"; - Files.write(Paths.get(fn), content.getBytes(StandardCharsets.UTF_8)); + Files.writeString(Paths.get(fn), content); List<String> cmds = new ArrayList<>(spec.commandLine().getParseResult().originalArgs()); @@ -1321,7 +1313,7 @@ public class Run extends CamelCommand { } content = content.replaceFirst("\\{\\{ \\.Name }}", "CodeRoute"); content = content.replaceFirst("\\{\\{ \\.Code }}", code); - Files.write(Paths.get(fn), content.getBytes(StandardCharsets.UTF_8)); + Files.writeString(Paths.get(fn), content); return "file:" + fn; } @@ -1406,7 +1398,7 @@ public class Run extends CamelCommand { } fn = cn + ".java"; } - Files.write(Paths.get(fn), t.toString().getBytes(StandardCharsets.UTF_8)); + Files.writeString(Paths.get(fn), t.toString()); file = "file:" + fn; } return file; @@ -1464,24 +1456,17 @@ public class Run extends CamelCommand { throw new FileNotFoundException("Cannot find file: " + file); } - ObjectMapper mapper; - boolean yaml = file.getName().endsWith(".yaml") || file.getName().endsWith(".yml"); - if (yaml) { - mapper = new YAMLMapper(); - } else { - mapper = new ObjectMapper(); - } - ObjectNode node = (ObjectNode) mapper.readTree(file); - OpenApiDocument document = (OpenApiDocument) Library.readDocument(node); - RuntimeUtil.setRootLoggingLevel("off"); - try { - try (CamelContext context = new DefaultCamelContext()) { - String out = RestDslGenerator.toYaml(document).generate(context, false); - Files.write(Paths.get(OPENAPI_GENERATED_FILE), out.getBytes()); - } - } finally { - RuntimeUtil.setRootLoggingLevel(loggingLevel); - } + InputStream is = Run.class.getClassLoader().getResourceAsStream("templates/rest-dsl.yaml.tmpl"); + String content = IOHelper.loadText(is); + IOHelper.close(is); + + String onlyName = FileUtil.stripPath(file.getName()); + content = content.replaceFirst("\\{\\{ \\.Spec }}", onlyName); + + Files.writeString(Paths.get(OPENAPI_GENERATED_FILE), content); + + // we need to include the spec on the classpath + files.add(openapi); } private boolean knownFile(String file) throws Exception { diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/rest-dsl.yaml.tmpl b/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/rest-dsl.yaml.tmpl new file mode 100644 index 00000000000..69f7526db7e --- /dev/null +++ b/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/rest-dsl.yaml.tmpl @@ -0,0 +1,5 @@ +- restConfiguration: + clientRequestValidation: true +- rest: + openApi: + specification: {{ .Spec }} \ No newline at end of file