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:18:49 UTC

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

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

commit ffb9343ff2e4f351e8e90ad8d79f61817a80939c
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;
         }