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