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

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


The following commit(s) were added to refs/heads/camel-4.0.x by this push:
     new 2941d69517f CAMEL-19798: Consistently set camel-kamelets version in 
Camel JBang (#11270)
2941d69517f is described below

commit 2941d69517f118893de71407b1a4f49262680365
Author: Claus Ibsen <[email protected]>
AuthorDate: Fri Sep 1 12:17:00 2023 +0200

    CAMEL-19798: Consistently set camel-kamelets version in Camel JBang (#11270)
    
    - Avoids inconsistent versions on camel-kamelets dependencies (e.g. 
camel-kamelets-utils library)
    - Make sure to use same version for camel-kamelets and camel-kamelets-utils 
dependency
    - Add --kamelets-version setting on Camel JBang run command
    - Propagate camel-kamelets version to KameletMain as initial property and 
use this version in Kamelet dependency downloader
    - Fallback to deriving the camel-kamelets version from classpath only if 
version has not been set
    - Support camel-kamelets: prefix when referencing dependencies in Kamelets 
and Pipe/KameletBinding resources and resolve with proper camel-kamelets version
    
    Co-authored-by: Christoph Deppisch <[email protected]>
---
 .../dsl/jbang/core/commands/ExportBaseCommand.java |  7 +++-
 .../apache/camel/dsl/jbang/core/commands/Init.java |  6 ++-
 .../apache/camel/dsl/jbang/core/commands/Run.java  | 21 ++++++++++
 .../core/commands/catalog/CatalogKamelet.java      |  7 +++-
 .../camel/dsl/jbang/core/common/VersionHelper.java |  3 ++
 .../templates/run-custom-camel-version.tmpl        |  2 +-
 .../java/org/apache/camel/main/KameletMain.java    | 18 +++++++-
 .../main/download/DependencyDownloaderKamelet.java | 44 ++++++++------------
 .../download/DependencyDownloaderRoutesLoader.java |  8 +++-
 .../download/KnownKameletRoutesBuilderLoader.java  | 48 +++++++++++-----------
 .../org/apache/camel/main/util/VersionHelper.java  | 25 +++++++++++
 11 files changed, 131 insertions(+), 58 deletions(-)

diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java
index 89d024e23fe..c8054a0c2b3 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java
@@ -47,6 +47,7 @@ import java.util.stream.Collectors;
 import org.apache.camel.catalog.DefaultCamelCatalog;
 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.tooling.maven.MavenGav;
 import org.apache.camel.util.CamelCaseOrderedProperties;
 import org.apache.camel.util.FileUtil;
@@ -108,7 +109,7 @@ abstract class ExportBaseCommand extends CamelCommand {
     protected String camelVersion;
 
     @CommandLine.Option(names = {
-            "--kamelets-version" }, description = "Apache Camel Kamelets 
version", defaultValue = "4.0.0-RC1")
+            "--kamelets-version" }, description = "Apache Camel Kamelets 
version")
     protected String kameletsVersion;
 
     @CommandLine.Option(names = { "--local-kamelet-dir" },
@@ -281,6 +282,10 @@ abstract class ExportBaseCommand extends CamelCommand {
             return o1.compareTo(o2);
         });
 
+        if (kameletsVersion == null) {
+            kameletsVersion = VersionHelper.extractKameletsVersion();
+        }
+
         // custom dependencies
         if (dependencies != null) {
             for (String d : dependencies.split(",")) {
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Init.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Init.java
index 75f46f30290..2264980c80c 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Init.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Init.java
@@ -26,6 +26,7 @@ import java.util.StringJoiner;
 import org.apache.camel.CamelContext;
 import org.apache.camel.dsl.jbang.core.commands.catalog.KameletCatalogHelper;
 import org.apache.camel.dsl.jbang.core.common.ResourceDoesNotExist;
+import org.apache.camel.dsl.jbang.core.common.VersionHelper;
 import org.apache.camel.github.GistResourceResolver;
 import org.apache.camel.github.GitHubResourceResolver;
 import org.apache.camel.impl.DefaultCamelContext;
@@ -60,7 +61,7 @@ public class Init extends CamelCommand {
     private String fromKamelet;
 
     @Option(names = {
-            "--kamelets-version" }, description = "Apache Camel Kamelets 
version", defaultValue = "4.0.0-RC1")
+            "--kamelets-version" }, description = "Apache Camel Kamelets 
version")
     private String kameletsVersion;
 
     @Option(names = { "--integration" },
@@ -95,6 +96,9 @@ public class Init extends CamelCommand {
         InputStream is = null;
         if ("kamelet.yaml".equals(ext)) {
             if (fromKamelet != null) {
+                if (kameletsVersion == null) {
+                    kameletsVersion = VersionHelper.extractKameletsVersion();
+                }
                 // load existing kamelet
                 is = KameletCatalogHelper.loadKameletYamlSchema(fromKamelet, 
kameletsVersion);
             } else if (file.contains("source")) {
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 6e56380f37b..cda6ac22697 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
@@ -129,6 +129,9 @@ public class Run extends CamelCommand {
     @Option(names = { "--camel-version" }, description = "To run using a 
different Camel version than the default version.")
     String camelVersion;
 
+    @Option(names = { "--kamelets-version" }, description = "Apache Camel 
Kamelets version")
+    String kameletsVersion;
+
     @Option(names = { "--profile" }, scope = CommandLine.ScopeType.INHERIT, 
defaultValue = "application",
             description = "Profile to use, which refers to loading properties 
file with the given profile name. By default application.properties is loaded.")
     String profile;
@@ -439,6 +442,8 @@ public class Run extends CamelCommand {
         writeSetting(main, profileProperties, "camel.jbang.jfr", jfr || 
jfrProfile != null ? "jfr" : null); // TODO: "true" instead of "jfr" ?
         writeSetting(main, profileProperties, "camel.jbang.jfr-profile", 
jfrProfile != null ? jfrProfile : null);
 
+        writeSetting(main, profileProperties, "camel.jbang.kameletsVersion", 
kameletsVersion);
+
         StringJoiner js = new StringJoiner(",");
         StringJoiner sjReload = new StringJoiner(",");
         StringJoiner sjClasspathFiles = new StringJoiner(",");
@@ -703,8 +708,13 @@ public class Run extends CamelCommand {
             background = 
"true".equals(answer.getProperty("camel.jbang.background", background ? "true" 
: "false"));
             jvmDebug = 
"true".equals(answer.getProperty("camel.jbang.jvmDebug", jvmDebug ? "true" : 
"false"));
             camelVersion = answer.getProperty("camel.jbang.camel-version", 
camelVersion);
+            kameletsVersion = 
answer.getProperty("camel.jbang.kameletsVersion", kameletsVersion);
             gav = answer.getProperty("camel.jbang.gav", gav);
         }
+
+        if (kameletsVersion == null) {
+            kameletsVersion = VersionHelper.extractKameletsVersion();
+        }
         return answer;
     }
 
@@ -718,6 +728,9 @@ public class Run extends CamelCommand {
         if (camelVersion != null) {
             cmds.remove("--camel-version=" + camelVersion);
         }
+        if (kameletsVersion != null) {
+            cmds.remove("--kamelets-version=" + kameletsVersion);
+        }
         // need to use jbang command to specify camel version
         List<String> jbangArgs = new ArrayList<>();
         jbangArgs.add("jbang");
@@ -725,6 +738,9 @@ public class Run extends CamelCommand {
         if (camelVersion != null) {
             jbangArgs.add("-Dcamel.jbang.version=" + camelVersion);
         }
+        if (kameletsVersion != null) {
+            jbangArgs.add("-Dcamel-kamelets.version=" + kameletsVersion);
+        }
         if (jvmDebug) {
             jbangArgs.add("--debug"); // jbang --debug
             cmds.remove("--jvm-debug");
@@ -799,6 +815,10 @@ public class Run extends CamelCommand {
         }
         content = content.replaceFirst("\\{\\{ \\.CamelJBangDependencies }}", 
sb.toString());
 
+        sb = new StringBuilder();
+        sb.append(String.format("//DEPS 
org.apache.camel.kamelets:camel-kamelets:%s\n", kameletsVersion));
+        content = content.replaceFirst("\\{\\{ \\.CamelKameletsDependencies 
}}", sb.toString());
+
         String fn = WORK_DIR + "/CustomCamelJBang.java";
         Files.write(Paths.get(fn), content.getBytes(StandardCharsets.UTF_8));
 
@@ -816,6 +836,7 @@ public class Run extends CamelCommand {
         }
 
         cmds.remove("--camel-version=" + camelVersion);
+        cmds.remove("--kamelets-version=" + kameletsVersion);
         // need to use jbang command to specify camel version
         List<String> jbangArgs = new ArrayList<>();
         jbangArgs.add("jbang");
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogKamelet.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogKamelet.java
index e9ab75b38e1..2a80520a5e6 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogKamelet.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogKamelet.java
@@ -29,6 +29,7 @@ import com.github.freva.asciitable.Column;
 import com.github.freva.asciitable.HorizontalAlign;
 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.DependencyDownloaderClassLoader;
 import org.apache.camel.main.download.MavenDependencyDownloader;
 import org.apache.camel.support.ObjectHelper;
@@ -52,7 +53,7 @@ public class CatalogKamelet extends CamelCommand {
     String filterName;
 
     @CommandLine.Option(names = {
-            "--kamelets-version" }, description = "Apache Camel Kamelets 
version", defaultValue = "4.0.0-RC1")
+            "--kamelets-version" }, description = "Apache Camel Kamelets 
version")
     String kameletsVersion;
 
     public CatalogKamelet(CamelJBangMain main) {
@@ -63,6 +64,10 @@ public class CatalogKamelet extends CamelCommand {
     public Integer doCall() throws Exception {
         List<KameletModel> rows = new ArrayList<>();
 
+        if (kameletsVersion == null) {
+            kameletsVersion = VersionHelper.extractKameletsVersion();
+        }
+
         Map<String, Object> kamelets;
         try {
             ClassLoader cl = createClassLoader();
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/VersionHelper.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/VersionHelper.java
index b2362cc445d..b5024359174 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/VersionHelper.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/VersionHelper.java
@@ -111,4 +111,7 @@ public final class VersionHelper {
         return s.compareTo(t);
     }
 
+    public static String extractKameletsVersion() {
+        return 
org.apache.camel.main.util.VersionHelper.extractKameletsVersion();
+    }
 }
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
index c707abfb58c..e8843fa8509 100644
--- 
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
@@ -22,7 +22,7 @@
 //REPOS 
central=https://repo1.maven.org/maven2,apache-snapshot=http://repository.apache.org/content/groups/snapshots/
 {{ .CamelDependencies }}
 {{ .CamelJBangDependencies }}
-//DEPS 
org.apache.camel.kamelets:camel-kamelets:${camel-kamelets.version:4.0.0-RC1}
+{{ .CamelKameletsDependencies }}
 
 package main;
 
diff --git 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java
index a6c4580f7d9..b16680ea7ec 100644
--- 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java
+++ 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java
@@ -518,7 +518,12 @@ public class KameletMain extends MainCommandLineSupport {
             }
             answer.setInjector(new KameletMainInjector(answer.getInjector(), 
stub));
             if (download) {
-                answer.addService(new DependencyDownloaderKamelet(answer));
+                Object kameletsVersion = 
getInitialProperties().get("camel.jbang.kameletsVersion");
+                if (kameletsVersion != null) {
+                    answer.addService(new DependencyDownloaderKamelet(answer, 
kameletsVersion.toString()));
+                } else {
+                    answer.addService(new DependencyDownloaderKamelet(answer));
+                }
                 
answer.getCamelContextExtension().getRegistry().bind(DownloadModelineParser.class.getSimpleName(),
                         new DownloadModelineParser(answer));
             }
@@ -607,9 +612,18 @@ public class KameletMain extends MainCommandLineSupport {
     @Override
     protected void configureRoutesLoader(CamelContext camelContext) {
         if (download) {
+            DependencyDownloaderRoutesLoader routesLoader;
+
+            Object kameletsVersion = 
getInitialProperties().get("camel.jbang.kameletsVersion");
+            if (kameletsVersion != null) {
+                routesLoader = new 
DependencyDownloaderRoutesLoader(camelContext, kameletsVersion.toString());
+            } else {
+                routesLoader = new 
DependencyDownloaderRoutesLoader(camelContext);
+            }
+
             // use resolvers that can auto downloaded
             camelContext.getCamelContextExtension()
-                    .addContextPlugin(RoutesLoader.class, new 
DependencyDownloaderRoutesLoader(camelContext));
+                    .addContextPlugin(RoutesLoader.class, routesLoader);
         } else {
             super.configureRoutesLoader(camelContext);
         }
diff --git 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderKamelet.java
 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderKamelet.java
index 919daa13914..3955166ed44 100644
--- 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderKamelet.java
+++ 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderKamelet.java
@@ -16,8 +16,6 @@
  */
 package org.apache.camel.main.download;
 
-import java.lang.management.ManagementFactory;
-import java.lang.management.RuntimeMXBean;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
@@ -31,12 +29,12 @@ import org.apache.camel.component.kamelet.KameletComponent;
 import org.apache.camel.dsl.yaml.YamlRoutesBuilderLoaderSupport;
 import org.apache.camel.dsl.yaml.common.YamlDeserializationContext;
 import org.apache.camel.dsl.yaml.common.YamlDeserializerSupport;
+import org.apache.camel.main.util.VersionHelper;
 import org.apache.camel.spi.Resource;
 import org.apache.camel.spi.RouteTemplateLoaderListener;
 import org.apache.camel.support.service.ServiceHelper;
 import org.apache.camel.support.service.ServiceSupport;
 import org.apache.camel.tooling.maven.MavenGav;
-import org.apache.camel.util.StringHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.snakeyaml.engine.v2.nodes.Node;
@@ -52,12 +50,17 @@ import static 
org.apache.camel.dsl.yaml.common.YamlDeserializerSupport.nodeAt;
 public final class DependencyDownloaderKamelet extends ServiceSupport
         implements CamelContextAware, RouteTemplateLoaderListener {
 
-    private static final String KAMELETS_VERSION = "3.20.4";
+    private String kameletsVersion;
     private KameletDependencyDownloader downloader;
     private CamelContext camelContext;
 
     public DependencyDownloaderKamelet(CamelContext camelContext) {
+        this(camelContext, null);
+    }
+
+    public DependencyDownloaderKamelet(CamelContext camelContext, String 
kameletsVersion) {
         this.camelContext = camelContext;
+        this.kameletsVersion = kameletsVersion;
     }
 
     @Override
@@ -78,13 +81,11 @@ public final class DependencyDownloaderKamelet extends 
ServiceSupport
 
     @Override
     protected void doInit() throws Exception {
-        String version = KAMELETS_VERSION;
-        RuntimeMXBean mb = ManagementFactory.getRuntimeMXBean();
-        if (mb != null) {
-            String[] bootClasspath = mb.getClassPath().split("[:|;]");
-            version = extractKameletsVersion(bootClasspath);
+        if (kameletsVersion == null) {
+            kameletsVersion = VersionHelper.extractKameletsVersion();
         }
-        this.downloader = new KameletDependencyDownloader(camelContext, 
"yaml", version);
+
+        this.downloader = new KameletDependencyDownloader(camelContext, 
"yaml", kameletsVersion);
         this.downloader.setCamelContext(camelContext);
         ServiceHelper.initService(downloader);
     }
@@ -110,21 +111,6 @@ public final class DependencyDownloaderKamelet extends 
ServiceSupport
         }
     }
 
-    private static String extractKameletsVersion(String[] bootClasspath) {
-        if (bootClasspath != null) {
-            for (String s : bootClasspath) {
-                if (s.contains("camel-kamelets-")) {
-                    String version = StringHelper.after(s, "camel-kamelets-");
-                    version = StringHelper.before(version, ".jar");
-                    if (version != null) {
-                        return version;
-                    }
-                }
-            }
-        }
-        return KAMELETS_VERSION;
-    }
-
     /**
      * To automatic downloaded dependencies that Kamelets requires.
      */
@@ -152,8 +138,6 @@ public final class DependencyDownloaderKamelet extends 
ServiceSupport
             }
 
             final List<String> dependencies = new ArrayList<>();
-            // always include kamelets-utils
-            dependencies.add("org.apache.camel.kamelets:camel-kamelets-utils:" 
+ kameletsVersion);
 
             Node deps = nodeAt(node, "/spec/dependencies");
             if (deps != null && deps.getNodeType() == NodeType.SEQUENCE) {
@@ -189,7 +173,11 @@ public final class DependencyDownloaderKamelet extends 
ServiceSupport
                 String gav = dep;
                 if (dep.startsWith("camel:")) {
                     // it's a known camel component
-                    gav = "org.apache.camel:camel-" + dep.substring(6) + ":" + 
camelContext.getVersion();
+                    gav = "org.apache.camel:camel-" + 
dep.substring("camel:".length()) + ":" + camelContext.getVersion();
+                } else if (dep.startsWith("camel-kamelets:")) {
+                    // it's a known camel kamelets dependency
+                    gav = "org.apache.camel.kamelets:camel-kamelets-" + 
dep.substring("camel-kamelets:".length()) + ":"
+                          + kameletsVersion;
                 }
                 if (isValidGav(gav)) {
                     gavs.add(gav);
diff --git 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderRoutesLoader.java
 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderRoutesLoader.java
index a4cdd2ac87c..421a6c39868 100644
--- 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderRoutesLoader.java
+++ 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderRoutesLoader.java
@@ -31,10 +31,16 @@ import org.apache.camel.support.service.ServiceHelper;
 public class DependencyDownloaderRoutesLoader extends DefaultRoutesLoader {
 
     private final DependencyDownloader downloader;
+    private final String kameletsVersion;
 
     public DependencyDownloaderRoutesLoader(CamelContext camelContext) {
+        this(camelContext, null);
+    }
+
+    public DependencyDownloaderRoutesLoader(CamelContext camelContext, String 
kameletsVersion) {
         setCamelContext(camelContext);
         this.downloader = camelContext.hasService(DependencyDownloader.class);
+        this.kameletsVersion = kameletsVersion;
     }
 
     @Override
@@ -65,7 +71,7 @@ public class DependencyDownloaderRoutesLoader extends 
DefaultRoutesLoader {
         // special for kamelet as we want to track loading kamelets
         RoutesBuilderLoader loader;
         if (KameletRoutesBuilderLoader.EXTENSION.equals(extension)) {
-            loader = new KnownKameletRoutesBuilderLoader();
+            loader = new KnownKameletRoutesBuilderLoader(kameletsVersion);
             CamelContextAware.trySetCamelContext(loader, getCamelContext());
             // allows for custom initialization
             initRoutesBuilderLoader(loader);
diff --git 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/KnownKameletRoutesBuilderLoader.java
 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/KnownKameletRoutesBuilderLoader.java
index 709f9ea5652..1e6588379e7 100644
--- 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/KnownKameletRoutesBuilderLoader.java
+++ 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/KnownKameletRoutesBuilderLoader.java
@@ -19,12 +19,11 @@ package org.apache.camel.main.download;
 import java.lang.reflect.Method;
 import java.util.Collections;
 import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.dsl.yaml.KameletRoutesBuilderLoader;
 import org.apache.camel.main.util.SuggestSimilarHelper;
+import org.apache.camel.main.util.VersionHelper;
 import org.apache.camel.spi.Resource;
 import org.apache.camel.support.ObjectHelper;
 import org.apache.camel.util.FileUtil;
@@ -32,7 +31,11 @@ import org.apache.camel.util.ReflectionHelper;
 
 public class KnownKameletRoutesBuilderLoader extends 
KameletRoutesBuilderLoader {
 
-    private static final String CP = System.getProperty("java.class.path");
+    private String kameletsVersion;
+
+    public KnownKameletRoutesBuilderLoader(String kameletsVersion) {
+        this.kameletsVersion = kameletsVersion;
+    }
 
     @Override
     public RouteBuilder doLoadRouteBuilder(Resource resource) throws Exception 
{
@@ -52,27 +55,26 @@ public class KnownKameletRoutesBuilderLoader extends 
KameletRoutesBuilderLoader
 
     private List<String> findKameletNames() {
         // download kamelet catalog for the correct version
-        Pattern pattern = 
Pattern.compile("camel-kamelets-(\\d+.\\d+.\\d+).jar", Pattern.DOTALL);
-        Matcher matcher = pattern.matcher(CP);
-        if (matcher.find() && matcher.groupCount() > 0) {
-            String version = matcher.group(1);
-            try {
-                // dynamic download kamelets-catalog that has the known names
-                MavenDependencyDownloader downloader = 
getCamelContext().hasService(MavenDependencyDownloader.class);
-                if 
(!downloader.alreadyOnClasspath("org.apache.camel.kamelets", 
"camel-kamelets-catalog", version)) {
-                    downloader.downloadDependency("org.apache.camel.kamelets", 
"camel-kamelets-catalog", version);
-                }
-                // create an instance of the catalog and invoke its 
getKameletsName method
-                Class<?> clazz = getCamelContext().getClassResolver()
-                        
.resolveClass("org.apache.camel.kamelets.catalog.KameletsCatalog");
-                if (clazz != null) {
-                    Object catalog = 
getCamelContext().getInjector().newInstance(clazz);
-                    Method m = ReflectionHelper.findMethod(clazz, 
"getKameletsName");
-                    return (List<String>) ObjectHelper.invokeMethod(m, 
catalog);
-                }
-            } catch (Exception e) {
-                // ignore
+        if (kameletsVersion == null) {
+            kameletsVersion = VersionHelper.extractKameletsVersion();
+        }
+
+        try {
+            // dynamic download kamelets-catalog that has the known names
+            MavenDependencyDownloader downloader = 
getCamelContext().hasService(MavenDependencyDownloader.class);
+            if (!downloader.alreadyOnClasspath("org.apache.camel.kamelets", 
"camel-kamelets-catalog", kameletsVersion)) {
+                downloader.downloadDependency("org.apache.camel.kamelets", 
"camel-kamelets-catalog", kameletsVersion);
+            }
+            // create an instance of the catalog and invoke its 
getKameletsName method
+            Class<?> clazz = getCamelContext().getClassResolver()
+                    
.resolveClass("org.apache.camel.kamelets.catalog.KameletsCatalog");
+            if (clazz != null) {
+                Object catalog = 
getCamelContext().getInjector().newInstance(clazz);
+                Method m = ReflectionHelper.findMethod(clazz, 
"getKameletsName");
+                return (List<String>) ObjectHelper.invokeMethod(m, catalog);
             }
+        } catch (Exception e) {
+            // ignore
         }
 
         return Collections.emptyList();
diff --git 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/util/VersionHelper.java
 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/util/VersionHelper.java
index 5ada3e4c766..b8b0bf230a4 100644
--- 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/util/VersionHelper.java
+++ 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/util/VersionHelper.java
@@ -16,10 +16,19 @@
  */
 package org.apache.camel.main.util;
 
+import java.lang.management.ManagementFactory;
+import java.lang.management.RuntimeMXBean;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
 import org.apache.camel.util.StringHelper;
 
 public final class VersionHelper {
 
+    private static final String KAMELETS_DEFAULT_VERSION = "4.0.0-RC1";
+    private static final Pattern KAMELETS_LIBRARY = 
Pattern.compile("camel-kamelets-(\\d[A-Z\\d.-]*).jar", Pattern.DOTALL);
+    private static final String CP = System.getProperty("java.class.path");
+
     private VersionHelper() {
     }
 
@@ -83,4 +92,20 @@ public final class VersionHelper {
         return s.compareTo(t);
     }
 
+    public static String extractKameletsVersion() {
+        Matcher matcher = KAMELETS_LIBRARY.matcher(CP);
+        if (matcher.find() && matcher.groupCount() > 0) {
+            return matcher.group(1);
+        }
+
+        RuntimeMXBean mb = ManagementFactory.getRuntimeMXBean();
+        if (mb != null) {
+            matcher = KAMELETS_LIBRARY.matcher(mb.getClassPath());
+            if (matcher.find() && matcher.groupCount() > 0) {
+                return matcher.group(1);
+            }
+        }
+
+        return KAMELETS_DEFAULT_VERSION;
+    }
 }

Reply via email to