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/02/12 12:19:24 UTC

[camel] branch camel-3.x updated (b01c2174098 -> 652d16535c1)

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

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


    from b01c2174098 CAMEL-19033: camel-jbang - Add trace command
     new b162f66dcf9 camel-jbang - CatalogLoader
     new 652d16535c1 CAMEL-19030: camel-jbang - doc and catalog to support --camel-version option

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../dsl/jbang/core/commands/ExportQuarkus.java     |  89 +-------
 .../dsl/jbang/core/commands/ExportSpringBoot.java  | 103 +--------
 .../core/commands/catalog/CatalogBaseCommand.java  |  23 +-
 .../jbang/core/commands/catalog/CatalogDoc.java    |  24 +-
 .../camel/dsl/jbang/core/common/CatalogLoader.java | 246 +++++++++++++++++++++
 5 files changed, 298 insertions(+), 187 deletions(-)
 create mode 100644 dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/CatalogLoader.java


[camel] 02/02: CAMEL-19030: camel-jbang - doc and catalog to support --camel-version option

Posted by da...@apache.org.
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 652d16535c1a7742758d1faa086536c3b4cd65b0
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sun Feb 12 13:18:18 2023 +0100

    CAMEL-19030: camel-jbang - doc and catalog to support --camel-version option
---
 .../core/commands/catalog/CatalogBaseCommand.java  | 23 ++++++++++-
 .../jbang/core/commands/catalog/CatalogDoc.java    | 24 ++++++++++-
 .../camel/dsl/jbang/core/common/CatalogLoader.java | 47 ++++++++++++++++++++--
 3 files changed, 89 insertions(+), 5 deletions(-)

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 5cb43bfe1ae..727d2c0cb57 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,8 @@ 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.CatalogLoader;
+import org.apache.camel.dsl.jbang.core.common.RuntimeUtil;
 import org.apache.camel.dsl.jbang.core.common.VersionHelper;
 import org.apache.camel.main.download.MavenGav;
 import org.apache.camel.tooling.model.ArtifactModel;
@@ -35,6 +37,14 @@ import picocli.CommandLine;
 
 public abstract class CatalogBaseCommand extends CamelCommand {
 
+    @CommandLine.Option(names = { "--camel-version" },
+                        description = "To run using a different Camel version than the default version.")
+    String camelVersion;
+
+    @CommandLine.Option(names = { "--repos" },
+                        description = "Additional maven repositories for download on-demand (Use commas to separate multiple repositories)")
+    String repos;
+
     @CommandLine.Option(names = { "--sort" },
                         description = "Sort by name, support-level, or description", defaultValue = "name")
     String sort;
@@ -55,7 +65,7 @@ public abstract class CatalogBaseCommand extends CamelCommand {
                         description = "Filter by version more recent (inclusive)")
     String sinceAfter;
 
-    final CamelCatalog catalog = new DefaultCamelCatalog(true);
+    CamelCatalog catalog;
 
     public CatalogBaseCommand(CamelJBangMain main) {
         super(main);
@@ -67,8 +77,19 @@ public abstract class CatalogBaseCommand extends CamelCommand {
         return model.getGroupId() + ":" + model.getArtifactId() + ":" + model.getVersion();
     }
 
+    CamelCatalog loadCatalog() throws Exception {
+        if (camelVersion == null) {
+            return new DefaultCamelCatalog(true);
+        } else {
+            // silent logging when download catalogs
+            RuntimeUtil.configureLog("off", false, false, false, false);
+            return CatalogLoader.loadCatalog(repos, camelVersion);
+        }
+    }
+
     @Override
     public Integer call() throws Exception {
+        this.catalog = loadCatalog();
         List<Row> rows = collectRows();
 
         if (filterName != null) {
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogDoc.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogDoc.java
index 33297b470f2..0fdf309abc9 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogDoc.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogDoc.java
@@ -32,6 +32,8 @@ 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.CatalogLoader;
+import org.apache.camel.dsl.jbang.core.common.RuntimeUtil;
 import org.apache.camel.main.download.MavenGav;
 import org.apache.camel.main.util.SuggestSimilarHelper;
 import org.apache.camel.tooling.model.BaseOptionModel;
@@ -51,6 +53,14 @@ public class CatalogDoc extends CamelCommand {
                             arity = "1")
     String name;
 
+    @CommandLine.Option(names = { "--camel-version" },
+                        description = "To run using a different Camel version than the default version.")
+    String camelVersion;
+
+    @CommandLine.Option(names = { "--repos" },
+                        description = "Additional maven repositories for download on-demand (Use commas to separate multiple repositories)")
+    String repos;
+
     @CommandLine.Option(names = { "--url" },
                         description = "Prints the link to the online documentation on the Camel website",
                         defaultValue = "false")
@@ -73,14 +83,26 @@ public class CatalogDoc extends CamelCommand {
             "--kamelets-version" }, description = "Apache Camel Kamelets version", defaultValue = "3.20.1.1")
     String kameletsVersion;
 
-    final CamelCatalog catalog = new DefaultCamelCatalog(true);
+    CamelCatalog catalog;
 
     public CatalogDoc(CamelJBangMain main) {
         super(main);
     }
 
+    CamelCatalog loadCatalog() throws Exception {
+        if (camelVersion == null) {
+            return new DefaultCamelCatalog(true);
+        } else {
+            // silent logging when download catalogs
+            RuntimeUtil.configureLog("off", false, false, false, false);
+            return CatalogLoader.loadCatalog(repos, camelVersion);
+        }
+    }
+
     @Override
     public Integer call() throws Exception {
+        this.catalog = loadCatalog();
+
         String prefix = StringHelper.before(name, ":");
         if (prefix != null) {
             name = StringHelper.after(name, ":");
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/CatalogLoader.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/CatalogLoader.java
index 5ca7ca450d5..2403073df81 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/CatalogLoader.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/CatalogLoader.java
@@ -47,6 +47,47 @@ public final class CatalogLoader {
     private CatalogLoader() {
     }
 
+    public static CamelCatalog loadCatalog(String repos, String version) throws Exception {
+        if (version == null) {
+            CamelCatalog answer = new DefaultCamelCatalog();
+            answer.enableCache();
+            return answer;
+        }
+
+        // use kamelet-main to dynamic download dependency via maven
+        KameletMain main = new KameletMain();
+        try {
+            main.setRepos(repos);
+            // enable stub in silent mode so we do not use real components
+            main.setStub(true);
+            main.start();
+
+            // wrap downloaded catalog files in an isolated classloader
+            DependencyDownloaderClassLoader cl
+                    = new DependencyDownloaderClassLoader(null);
+
+            // download camel-catalog for that specific version
+            MavenDependencyDownloader downloader = main.getCamelContext().hasService(MavenDependencyDownloader.class);
+            MavenArtifact ma = downloader.downloadArtifact("org.apache.camel", "camel-catalog", version);
+            if (ma != null) {
+                cl.addFile(ma.getFile());
+            } else {
+                throw new IOException("Cannot download org.apache.camel:camel-catalog:" + version);
+            }
+
+            // re-create answer with the classloader to be able to load resources in this catalog
+            Class<CamelCatalog> clazz2
+                    = main.getCamelContext().getClassResolver().resolveClass(DEFAULT_CAMEL_CATALOG,
+                            CamelCatalog.class);
+            CamelCatalog answer = main.getCamelContext().getInjector().newInstance(clazz2);
+            answer.setVersionManager(new DownloadCatalogVersionManager(version, cl));
+            answer.enableCache();
+            return answer;
+        } finally {
+            main.stop();
+        }
+    }
+
     public static CamelCatalog loadSpringBootCatalog(String repos, String version) throws Exception {
         CamelCatalog answer = new DefaultCamelCatalog();
         if (version == null) {
@@ -79,7 +120,7 @@ public final class CatalogLoader {
                         "Cannot download org.apache.camel.springboot:camel-catalog-provider-springboot:" + version);
             }
 
-            answer.setVersionManager(new SpringBootCatalogVersionManager(version, cl));
+            answer.setVersionManager(new DownloadCatalogVersionManager(version, cl));
             Class<RuntimeProvider> clazz = (Class<RuntimeProvider>) cl.loadClass(SPRING_BOOT_CATALOG_PROVIDER);
             if (clazz != null) {
                 RuntimeProvider provider = main.getCamelContext().getInjector().newInstance(clazz);
@@ -161,12 +202,12 @@ public final class CatalogLoader {
         return answer;
     }
 
-    private static final class SpringBootCatalogVersionManager implements VersionManager {
+    private static final class DownloadCatalogVersionManager implements VersionManager {
 
         private ClassLoader classLoader;
         private final String version;
 
-        public SpringBootCatalogVersionManager(String version, ClassLoader classLoader) {
+        public DownloadCatalogVersionManager(String version, ClassLoader classLoader) {
             this.version = version;
             this.classLoader = classLoader;
         }


[camel] 01/02: camel-jbang - CatalogLoader

Posted by da...@apache.org.
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 b162f66dcf90fe06ec12ff4b0b047ff956245060
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sun Feb 12 11:24:22 2023 +0100

    camel-jbang - CatalogLoader
---
 .../dsl/jbang/core/commands/ExportQuarkus.java     |  89 +--------
 .../dsl/jbang/core/commands/ExportSpringBoot.java  | 103 +----------
 .../camel/dsl/jbang/core/common/CatalogLoader.java | 205 +++++++++++++++++++++
 3 files changed, 212 insertions(+), 185 deletions(-)

diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportQuarkus.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportQuarkus.java
index bdfcda47383..6731c7528c8 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportQuarkus.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportQuarkus.java
@@ -28,21 +28,9 @@ import java.util.Set;
 import java.util.StringJoiner;
 import java.util.stream.Collectors;
 
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-
 import org.apache.camel.catalog.CamelCatalog;
-import org.apache.camel.catalog.DefaultCamelCatalog;
-import org.apache.camel.catalog.RuntimeProvider;
+import org.apache.camel.dsl.jbang.core.common.CatalogLoader;
 import org.apache.camel.dsl.jbang.core.common.RuntimeUtil;
-import org.apache.camel.dsl.jbang.core.common.XmlHelper;
-import org.apache.camel.main.KameletMain;
-import org.apache.camel.main.download.MavenArtifact;
-import org.apache.camel.main.download.MavenDependencyDownloader;
 import org.apache.camel.main.download.MavenGav;
 import org.apache.camel.tooling.model.ArtifactModel;
 import org.apache.camel.util.CamelCaseOrderedProperties;
@@ -53,11 +41,7 @@ import org.apache.commons.io.FileUtils;
 
 class ExportQuarkus extends Export {
 
-    private static final String DEFAULT_CAMEL_CATALOG = "org.apache.camel.catalog.DefaultCamelCatalog";
-    private static final String QUARKUS_CATALOG_PROVIDER = "org.apache.camel.catalog.quarkus.QuarkusRuntimeProvider";
-
     private String camelVersion;
-    private String camelQuarkusVersion;
 
     public ExportQuarkus(CamelJBangMain main) {
         super(main);
@@ -242,11 +226,12 @@ class ExportQuarkus extends Export {
         // quarkus controls the camel version
         String repos = getMavenRepos(prop, quarkusVersion);
 
-        CamelCatalog catalog = loadQuarkusCatalog(repos);
+        CamelCatalog catalog = CatalogLoader.loadQuarkusCatalog(repos, quarkusVersion);
         if (camelVersion == null) {
             camelVersion = catalog.getCatalogVersion();
         }
         String camelVersion = catalog.getCatalogVersion();
+        String camelQuarkusVersion = catalog.otherModel("camel-core-engine").getVersion();
 
         context = context.replaceFirst("\\{\\{ \\.GroupId }}", ids[0]);
         context = context.replaceFirst("\\{\\{ \\.ArtifactId }}", ids[1]);
@@ -350,7 +335,7 @@ class ExportQuarkus extends Export {
         // quarkus controls the camel version
         String repos = getMavenRepos(prop, quarkusVersion);
 
-        CamelCatalog catalog = loadQuarkusCatalog(repos);
+        CamelCatalog catalog = CatalogLoader.loadQuarkusCatalog(repos, quarkusVersion);
         if (camelVersion == null) {
             camelVersion = catalog.getCatalogVersion();
         }
@@ -454,70 +439,4 @@ class ExportQuarkus extends Export {
         return answer;
     }
 
-    private CamelCatalog loadQuarkusCatalog(String repos) {
-        CamelCatalog answer = new DefaultCamelCatalog(true);
-
-        // use kamelet-main to dynamic download dependency via maven
-        KameletMain main = new KameletMain();
-        try {
-            main.setRepos(repos);
-            main.start();
-
-            // shrinkwrap does not return POM file as result (they are hardcoded to be filtered out)
-            // so after this we download a JAR and then use its File location to compute the file for the downloaded POM
-            MavenDependencyDownloader downloader = main.getCamelContext().hasService(MavenDependencyDownloader.class);
-            MavenArtifact ma = downloader.downloadArtifact("io.quarkus.platform", "quarkus-camel-bom:pom", quarkusVersion);
-            if (ma != null && ma.getFile() != null) {
-                String name = ma.getFile().getAbsolutePath();
-                File file = new File(name);
-                if (file.exists()) {
-                    DocumentBuilderFactory dbf = XmlHelper.createDocumentBuilderFactory();
-                    DocumentBuilder db = dbf.newDocumentBuilder();
-                    Document dom = db.parse(file);
-
-                    // grab what exact camelVersion and camelQuarkusVersion we are using
-                    NodeList nl = dom.getElementsByTagName("dependency");
-                    for (int i = 0; i < nl.getLength(); i++) {
-                        Element node = (Element) nl.item(i);
-                        String g = node.getElementsByTagName("groupId").item(0).getTextContent();
-                        String a = node.getElementsByTagName("artifactId").item(0).getTextContent();
-                        if ("org.apache.camel".equals(g) && "camel-core-engine".equals(a)) {
-                            camelVersion = node.getElementsByTagName("version").item(0).getTextContent();
-                        } else if ("org.apache.camel.quarkus".equals(g) && "camel-quarkus-catalog".equals(a)) {
-                            camelQuarkusVersion = node.getElementsByTagName("version").item(0).getTextContent();
-                        }
-                    }
-                }
-            }
-
-            if (camelQuarkusVersion != null) {
-                // download camel-quarkus-catalog we use to know if we have an extension or not
-                downloader.downloadDependency("org.apache.camel.quarkus", "camel-quarkus-catalog", camelQuarkusVersion);
-
-                Class<RuntimeProvider> clazz = main.getCamelContext().getClassResolver().resolveClass(QUARKUS_CATALOG_PROVIDER,
-                        RuntimeProvider.class);
-                if (clazz != null) {
-                    RuntimeProvider provider = main.getCamelContext().getInjector().newInstance(clazz);
-                    if (provider != null) {
-                        // re-create answer with the classloader that loaded quarkus to be able to load resources in this catalog
-                        Class<CamelCatalog> clazz2
-                                = main.getCamelContext().getClassResolver().resolveClass(DEFAULT_CAMEL_CATALOG,
-                                        CamelCatalog.class);
-                        answer = main.getCamelContext().getInjector().newInstance(clazz2);
-                        answer.setRuntimeProvider(provider);
-                        // use classloader that loaded quarkus provider to ensure we can load its resources
-                        answer.getVersionManager().setClassLoader(main.getCamelContext().getApplicationContextClassLoader());
-                        answer.enableCache();
-                    }
-                }
-            }
-        } catch (Exception e) {
-            // ignore
-        } finally {
-            main.stop();
-        }
-
-        return answer;
-    }
-
 }
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 ad1f94149ad..ef0264add9d 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
@@ -29,14 +29,8 @@ import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import org.apache.camel.catalog.CamelCatalog;
-import org.apache.camel.catalog.DefaultCamelCatalog;
-import org.apache.camel.catalog.RuntimeProvider;
-import org.apache.camel.catalog.VersionManager;
+import org.apache.camel.dsl.jbang.core.common.CatalogLoader;
 import org.apache.camel.dsl.jbang.core.common.RuntimeUtil;
-import org.apache.camel.main.KameletMain;
-import org.apache.camel.main.download.DependencyDownloaderClassLoader;
-import org.apache.camel.main.download.MavenArtifact;
-import org.apache.camel.main.download.MavenDependencyDownloader;
 import org.apache.camel.main.download.MavenGav;
 import org.apache.camel.tooling.model.ArtifactModel;
 import org.apache.camel.util.CamelCaseOrderedProperties;
@@ -47,7 +41,6 @@ import org.apache.commons.io.FileUtils;
 class ExportSpringBoot extends Export {
 
     private static final String DEFAULT_CAMEL_CATALOG = "org.apache.camel.catalog.DefaultCamelCatalog";
-    private static final String SPRING_BOOT_CATALOG_PROVIDER = "org.apache.camel.springboot.catalog.SpringBootRuntimeProvider";
 
     public ExportSpringBoot(CamelJBangMain main) {
         super(main);
@@ -152,7 +145,7 @@ class ExportSpringBoot extends Export {
         RuntimeUtil.loadProperties(prop, settings);
         String repos = getMavenRepos(prop, camelSpringBootVersion);
 
-        CamelCatalog catalog = loadSpringBootCatalog(repos, camelSpringBootVersion);
+        CamelCatalog catalog = CatalogLoader.loadSpringBootCatalog(repos, camelSpringBootVersion);
         String camelVersion = catalog.getLoadedVersion();
 
         context = context.replaceFirst("\\{\\{ \\.GroupId }}", ids[0]);
@@ -265,7 +258,7 @@ class ExportSpringBoot extends Export {
         RuntimeUtil.loadProperties(prop, settings);
         String repos = getMavenRepos(prop, camelSpringBootVersion);
 
-        CamelCatalog catalog = loadSpringBootCatalog(repos, camelSpringBootVersion);
+        CamelCatalog catalog = CatalogLoader.loadSpringBootCatalog(repos, camelSpringBootVersion);
         String camelVersion = catalog.getLoadedVersion();
 
         context = context.replaceFirst("\\{\\{ \\.GroupId }}", ids[0]);
@@ -377,55 +370,6 @@ class ExportSpringBoot extends Export {
         return super.applicationPropertyLine(key, value);
     }
 
-    private CamelCatalog loadSpringBootCatalog(String repos, String version) throws Exception {
-        CamelCatalog answer = new DefaultCamelCatalog();
-        if (version == null) {
-            version = answer.getCatalogVersion();
-        }
-
-        // use kamelet-main to dynamic download dependency via maven
-        KameletMain main = new KameletMain();
-        try {
-            main.setRepos(repos);
-            main.start();
-
-            // wrap downloaded catalog files in an isolated classloader
-            DependencyDownloaderClassLoader cl
-                    = new DependencyDownloaderClassLoader(main.getCamelContext().getApplicationContextClassLoader());
-
-            // download camel-catalog for that specific version
-            MavenDependencyDownloader downloader = main.getCamelContext().hasService(MavenDependencyDownloader.class);
-            MavenArtifact ma = downloader.downloadArtifact("org.apache.camel", "camel-catalog", version);
-            if (ma != null) {
-                cl.addFile(ma.getFile());
-            } else {
-                throw new IOException("Cannot download org.apache.camel:camel-catalog:" + version);
-            }
-            ma = downloader.downloadArtifact("org.apache.camel.springboot", "camel-catalog-provider-springboot", version);
-            if (ma != null) {
-                cl.addFile(ma.getFile());
-            } else {
-                throw new IOException(
-                        "Cannot download org.apache.camel.springboot:camel-catalog-provider-springboot:" + version);
-            }
-
-            answer.setVersionManager(new SpringBootCatalogVersionManager(version, cl));
-            Class<RuntimeProvider> clazz = (Class<RuntimeProvider>) cl.loadClass(SPRING_BOOT_CATALOG_PROVIDER);
-            if (clazz != null) {
-                RuntimeProvider provider = main.getCamelContext().getInjector().newInstance(clazz);
-                if (provider != null) {
-                    answer.setRuntimeProvider(provider);
-                }
-            }
-            answer.enableCache();
-
-        } finally {
-            main.stop();
-        }
-
-        return answer;
-    }
-
     private String readResourceTemplate(String name) throws IOException {
         InputStream is = ExportSpringBoot.class.getClassLoader().getResourceAsStream(name);
         String text = IOHelper.loadText(is);
@@ -433,45 +377,4 @@ class ExportSpringBoot extends Export {
         return text;
     }
 
-    private final class SpringBootCatalogVersionManager implements VersionManager {
-
-        private ClassLoader classLoader;
-        private final String version;
-
-        public SpringBootCatalogVersionManager(String version, ClassLoader classLoader) {
-            this.version = version;
-            this.classLoader = classLoader;
-        }
-
-        @Override
-        public void setClassLoader(ClassLoader classLoader) {
-            this.classLoader = classLoader;
-        }
-
-        @Override
-        public String getLoadedVersion() {
-            return version;
-        }
-
-        @Override
-        public boolean loadVersion(String version) {
-            return this.version.equals(version);
-        }
-
-        @Override
-        public String getRuntimeProviderLoadedVersion() {
-            return version;
-        }
-
-        @Override
-        public boolean loadRuntimeProviderVersion(String groupId, String artifactId, String version) {
-            return true;
-        }
-
-        @Override
-        public InputStream getResourceAsStream(String name) {
-            return classLoader.getResourceAsStream(name);
-        }
-    }
-
 }
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/CatalogLoader.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/CatalogLoader.java
new file mode 100644
index 00000000000..5ca7ca450d5
--- /dev/null
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/CatalogLoader.java
@@ -0,0 +1,205 @@
+/*
+ * 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.
+ */
+package org.apache.camel.dsl.jbang.core.common;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+import org.apache.camel.catalog.CamelCatalog;
+import org.apache.camel.catalog.DefaultCamelCatalog;
+import org.apache.camel.catalog.RuntimeProvider;
+import org.apache.camel.catalog.VersionManager;
+import org.apache.camel.main.KameletMain;
+import org.apache.camel.main.download.DependencyDownloaderClassLoader;
+import org.apache.camel.main.download.MavenArtifact;
+import org.apache.camel.main.download.MavenDependencyDownloader;
+
+public final class CatalogLoader {
+
+    private static final String DEFAULT_CAMEL_CATALOG = "org.apache.camel.catalog.DefaultCamelCatalog";
+
+    private static final String SPRING_BOOT_CATALOG_PROVIDER = "org.apache.camel.springboot.catalog.SpringBootRuntimeProvider";
+
+    private static final String QUARKUS_CATALOG_PROVIDER = "org.apache.camel.catalog.quarkus.QuarkusRuntimeProvider";
+
+    private CatalogLoader() {
+    }
+
+    public static CamelCatalog loadSpringBootCatalog(String repos, String version) throws Exception {
+        CamelCatalog answer = new DefaultCamelCatalog();
+        if (version == null) {
+            version = answer.getCatalogVersion();
+        }
+
+        // use kamelet-main to dynamic download dependency via maven
+        KameletMain main = new KameletMain();
+        try {
+            main.setRepos(repos);
+            main.start();
+
+            // wrap downloaded catalog files in an isolated classloader
+            DependencyDownloaderClassLoader cl
+                    = new DependencyDownloaderClassLoader(main.getCamelContext().getApplicationContextClassLoader());
+
+            // download camel-catalog for that specific version
+            MavenDependencyDownloader downloader = main.getCamelContext().hasService(MavenDependencyDownloader.class);
+            MavenArtifact ma = downloader.downloadArtifact("org.apache.camel", "camel-catalog", version);
+            if (ma != null) {
+                cl.addFile(ma.getFile());
+            } else {
+                throw new IOException("Cannot download org.apache.camel:camel-catalog:" + version);
+            }
+            ma = downloader.downloadArtifact("org.apache.camel.springboot", "camel-catalog-provider-springboot", version);
+            if (ma != null) {
+                cl.addFile(ma.getFile());
+            } else {
+                throw new IOException(
+                        "Cannot download org.apache.camel.springboot:camel-catalog-provider-springboot:" + version);
+            }
+
+            answer.setVersionManager(new SpringBootCatalogVersionManager(version, cl));
+            Class<RuntimeProvider> clazz = (Class<RuntimeProvider>) cl.loadClass(SPRING_BOOT_CATALOG_PROVIDER);
+            if (clazz != null) {
+                RuntimeProvider provider = main.getCamelContext().getInjector().newInstance(clazz);
+                if (provider != null) {
+                    answer.setRuntimeProvider(provider);
+                }
+            }
+            answer.enableCache();
+
+        } finally {
+            main.stop();
+        }
+
+        return answer;
+    }
+
+    public static CamelCatalog loadQuarkusCatalog(String repos, String quarkusVersion) {
+        String camelQuarkusVersion = null;
+        CamelCatalog answer = new DefaultCamelCatalog(true);
+
+        // use kamelet-main to dynamic download dependency via maven
+        KameletMain main = new KameletMain();
+        try {
+            main.setRepos(repos);
+            main.start();
+
+            // shrinkwrap does not return POM file as result (they are hardcoded to be filtered out)
+            // so after this we download a JAR and then use its File location to compute the file for the downloaded POM
+            MavenDependencyDownloader downloader = main.getCamelContext().hasService(MavenDependencyDownloader.class);
+            MavenArtifact ma = downloader.downloadArtifact("io.quarkus.platform", "quarkus-camel-bom:pom", quarkusVersion);
+            if (ma != null && ma.getFile() != null) {
+                String name = ma.getFile().getAbsolutePath();
+                File file = new File(name);
+                if (file.exists()) {
+                    DocumentBuilderFactory dbf = XmlHelper.createDocumentBuilderFactory();
+                    DocumentBuilder db = dbf.newDocumentBuilder();
+                    Document dom = db.parse(file);
+
+                    // grab what exact camelVersion and camelQuarkusVersion we are using
+                    NodeList nl = dom.getElementsByTagName("dependency");
+                    for (int i = 0; i < nl.getLength(); i++) {
+                        Element node = (Element) nl.item(i);
+                        String g = node.getElementsByTagName("groupId").item(0).getTextContent();
+                        String a = node.getElementsByTagName("artifactId").item(0).getTextContent();
+                        if ("org.apache.camel.quarkus".equals(g) && "camel-quarkus-catalog".equals(a)) {
+                            camelQuarkusVersion = node.getElementsByTagName("version").item(0).getTextContent();
+                        }
+                    }
+                }
+            }
+
+            if (camelQuarkusVersion != null) {
+                // download camel-quarkus-catalog we use to know if we have an extension or not
+                downloader.downloadDependency("org.apache.camel.quarkus", "camel-quarkus-catalog", camelQuarkusVersion);
+
+                Class<RuntimeProvider> clazz = main.getCamelContext().getClassResolver().resolveClass(QUARKUS_CATALOG_PROVIDER,
+                        RuntimeProvider.class);
+                if (clazz != null) {
+                    RuntimeProvider provider = main.getCamelContext().getInjector().newInstance(clazz);
+                    if (provider != null) {
+                        // re-create answer with the classloader that loaded quarkus to be able to load resources in this catalog
+                        Class<CamelCatalog> clazz2
+                                = main.getCamelContext().getClassResolver().resolveClass(DEFAULT_CAMEL_CATALOG,
+                                        CamelCatalog.class);
+                        answer = main.getCamelContext().getInjector().newInstance(clazz2);
+                        answer.setRuntimeProvider(provider);
+                        // use classloader that loaded quarkus provider to ensure we can load its resources
+                        answer.getVersionManager().setClassLoader(main.getCamelContext().getApplicationContextClassLoader());
+                        answer.enableCache();
+                    }
+                }
+            }
+        } catch (Exception e) {
+            // ignore
+        } finally {
+            main.stop();
+        }
+
+        return answer;
+    }
+
+    private static final class SpringBootCatalogVersionManager implements VersionManager {
+
+        private ClassLoader classLoader;
+        private final String version;
+
+        public SpringBootCatalogVersionManager(String version, ClassLoader classLoader) {
+            this.version = version;
+            this.classLoader = classLoader;
+        }
+
+        @Override
+        public void setClassLoader(ClassLoader classLoader) {
+            this.classLoader = classLoader;
+        }
+
+        @Override
+        public String getLoadedVersion() {
+            return version;
+        }
+
+        @Override
+        public boolean loadVersion(String version) {
+            return this.version.equals(version);
+        }
+
+        @Override
+        public String getRuntimeProviderLoadedVersion() {
+            return version;
+        }
+
+        @Override
+        public boolean loadRuntimeProviderVersion(String groupId, String artifactId, String version) {
+            return true;
+        }
+
+        @Override
+        public InputStream getResourceAsStream(String name) {
+            return classLoader.getResourceAsStream(name);
+        }
+    }
+
+}