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 366c79fc8ff CAMEL-18989: camel-jbang - Run custom distributions of Camel 366c79fc8ff is described below commit 366c79fc8ff0bcec1166add80ef9654fd657d0ce Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Tue Jan 31 19:30:24 2023 +0100 CAMEL-18989: camel-jbang - Run custom distributions of Camel --- .../apache/camel/dsl/jbang/core/commands/Run.java | 87 +++++++++++++++++++++- .../core/commands/catalog/CatalogBaseCommand.java | 1 + .../catalog => common}/VersionHelper.java | 4 +- .../templates/run-custom-camel-version.tmpl | 40 ++++++++++ 4 files changed, 129 insertions(+), 3 deletions(-) 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 f5130d8123c..9166d8a17c1 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 @@ -51,6 +51,7 @@ import io.apicurio.datamodels.openapi.models.OasDocument; import org.apache.camel.CamelContext; import org.apache.camel.catalog.DefaultCamelCatalog; 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.lw.LightweightCamelContext; import org.apache.camel.main.KameletMain; @@ -547,7 +548,14 @@ class Run extends CamelCommand { // okay we have validated all input and are ready to run if (camelVersion != null) { // run in another JVM with different camel version (foreground or background) - return runCamelVersion(main); + boolean custom = camelVersion.contains("-"); + if (custom) { + // custom camel distribution + return runCustomCamelVersion(main); + } else { + // apache camel distribution + return runCamelVersion(main); + } } else if (background) { // spawn new JVM to run in background return runBackground(main); @@ -645,6 +653,83 @@ class Run extends CamelCommand { return 0; } + protected int runCustomCamelVersion(KameletMain main) throws Exception { + InputStream is = Run.class.getClassLoader().getResourceAsStream("templates/run-custom-camel-version.tmpl"); + String content = IOHelper.loadText(is); + IOHelper.close(is); + + content = content.replaceFirst("\\{\\{ \\.JavaVersion }}", "17"); // TODO: java 11 or 17 + if (repos != null) { + content = content.replaceFirst("\\{\\{ \\.MavenRepositories }}", "//REPOS " + repos); + } + + // use custom distribution of camel + StringBuilder sb = new StringBuilder(); + sb.append(String.format("//DEPS org.apache.camel:camel-bom:%s@pom\n", camelVersion)); + sb.append(String.format("//DEPS org.apache.camel:camel-core:%s\n", camelVersion)); + sb.append(String.format("//DEPS org.apache.camel:camel-core-engine:%s\n", camelVersion)); + sb.append(String.format("//DEPS org.apache.camel:camel-main:%s\n", camelVersion)); + sb.append(String.format("//DEPS org.apache.camel:camel-java-joor-dsl:%s\n", camelVersion)); + sb.append(String.format("//DEPS org.apache.camel:camel-kamelet:%s\n", camelVersion)); + content = content.replaceFirst("\\{\\{ \\.CamelDependencies }}", sb.toString()); + + // use apache distribution of camel-jbang + String v = camelVersion.substring(0, camelVersion.lastIndexOf('.')); + sb = new StringBuilder(); + sb.append(String.format("//DEPS org.apache.camel:camel-jbang-core:%s\n", v)); + sb.append(String.format("//DEPS org.apache.camel:camel-kamelet-main:%s\n", v)); + sb.append(String.format("//DEPS org.apache.camel:camel-resourceresolver-github:%s\n", v)); + if (VersionHelper.isGE(v, "3.19.0")) { + sb.append(String.format("//DEPS org.apache.camel:camel-cli-connector:%s\n", v)); + } + content = content.replaceFirst("\\{\\{ \\.CamelJBangDependencies }}", sb.toString()); + + String fn = WORK_DIR + "/CustomCamelJBang.java"; + Files.write(Paths.get(fn), content.getBytes(StandardCharsets.UTF_8)); + + String cmd = ProcessHandle.current().info().commandLine().orElse(null); + if (cmd != null) { + cmd = StringHelper.after(cmd, "main.CamelJBang "); + } + if (cmd == null) { + System.err.println("No Camel integration files to run"); + return 1; + } + if (background) { + cmd = cmd.replaceFirst("--background=true", ""); + cmd = cmd.replaceFirst("--background", ""); + } + if (repos != null) { + if (!VersionHelper.isGE(v, "3.18.1")) { + // --repos is not supported in 3.18.0 or older, so remove + cmd = cmd.replaceFirst("--repos=" + repos, ""); + } + } + + cmd = cmd.replaceFirst("--camel-version=" + camelVersion, ""); + // need to use jbang command to specify camel version + String jbang = "jbang " + WORK_DIR + "/CustomCamelJBang.java "; + cmd = jbang + cmd; + + System.out.println(">>> " + cmd); + + ProcessBuilder pb = new ProcessBuilder(); + String[] arr = cmd.split("\\s+"); // TODO: safe split + List<String> args = Arrays.asList(arr); + pb.command(args); + if (background) { + Process p = pb.start(); + System.out.println("Running Camel integration: " + name + " (version: " + camelVersion + + ") in background with PID: " + p.pid()); + return 0; + } else { + pb.inheritIO(); // run in foreground (with IO so logs are visible) + Process p = pb.start(); + // wait for that process to exit as we run in foreground + return p.waitFor(); + } + } + protected int runKameletMain(KameletMain main) throws Exception { main.start(); main.run(); diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogBaseCommand.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogBaseCommand.java index 448bba7a364..5cb43bfe1ae 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogBaseCommand.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogBaseCommand.java @@ -28,6 +28,7 @@ import org.apache.camel.catalog.CamelCatalog; import org.apache.camel.catalog.DefaultCamelCatalog; import org.apache.camel.dsl.jbang.core.commands.CamelCommand; import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain; +import org.apache.camel.dsl.jbang.core.common.VersionHelper; import org.apache.camel.main.download.MavenGav; import org.apache.camel.tooling.model.ArtifactModel; import picocli.CommandLine; diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/VersionHelper.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/VersionHelper.java similarity index 95% rename from dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/VersionHelper.java rename to dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/VersionHelper.java index 587a56b70d8..cc22c2985e5 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/VersionHelper.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/VersionHelper.java @@ -14,11 +14,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.dsl.jbang.core.commands.catalog; +package org.apache.camel.dsl.jbang.core.common; import org.apache.camel.util.StringHelper; -final class VersionHelper { +public final class VersionHelper { private VersionHelper() { } diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/run-custom-camel-version.tmpl b/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/run-custom-camel-version.tmpl new file mode 100644 index 00000000000..cd15762a79f --- /dev/null +++ b/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/run-custom-camel-version.tmpl @@ -0,0 +1,40 @@ +///usr/bin/env jbang "$0" "$@" ; exit $? + +/* + * 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. + */ + +//JAVA {{ .JavaVersion }}+ +{{ .MavenRepositories }} +//REPOS mavencentral,apache-snapshot=http://repository.apache.org/content/groups/snapshots/ +{{ .CamelDependencies }} +{{ .CamelJBangDependencies }} +//DEPS org.apache.camel.kamelets:camel-kamelets:${camel-kamelets.version:3.20.1.1} + +package main; + +import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain; + +/** + * Main to run CamelJBang + */ +public class CustomCamelJBang { + + public static void main(String... args) { + CamelJBangMain.run(args); + } + +}