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 <claus.ib...@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; }