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);
+    }
+
+}

Reply via email to