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 2022/06/18 09:03:47 UTC
[camel] branch main updated: CAMEL-18204: camel-jbang - Export to spring boot should use spring-boot catalog to know if the JARs are a -starter or not to generate correct pom.xml
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
The following commit(s) were added to refs/heads/main by this push:
new d362be3a6df CAMEL-18204: camel-jbang - Export to spring boot should use spring-boot catalog to know if the JARs are a -starter or not to generate correct pom.xml
d362be3a6df is described below
commit d362be3a6df164c12d58e04d5ce7549048cfa6b8
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sat Jun 18 11:03:34 2022 +0200
CAMEL-18204: camel-jbang - Export to spring boot should use spring-boot catalog to know if the JARs are a -starter or not to generate correct pom.xml
---
.../camel/catalog/DefaultVersionManager.java | 15 +++++-
.../org/apache/camel/catalog/VersionManager.java | 5 ++
.../dsl/jbang/core/commands/ExportSpringBoot.java | 57 ++++++++++++++++++++--
3 files changed, 72 insertions(+), 5 deletions(-)
diff --git a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultVersionManager.java b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultVersionManager.java
index d8f7d16ceb0..e2a20e68cc1 100644
--- a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultVersionManager.java
+++ b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultVersionManager.java
@@ -21,11 +21,17 @@ import java.io.InputStream;
public class DefaultVersionManager implements VersionManager {
private final CamelCatalog camelCatalog;
+ private ClassLoader classLoader;
public DefaultVersionManager(CamelCatalog camelCatalog) {
this.camelCatalog = camelCatalog;
}
+ @Override
+ public void setClassLoader(ClassLoader classLoader) {
+ this.classLoader = classLoader;
+ }
+
@Override
public String getLoadedVersion() {
return camelCatalog.getCatalogVersion();
@@ -50,6 +56,13 @@ public class DefaultVersionManager implements VersionManager {
@Override
public InputStream getResourceAsStream(String name) {
- return DefaultCamelCatalog.class.getClassLoader().getResourceAsStream(name);
+ InputStream is = null;
+ if (classLoader != null) {
+ is = classLoader.getResourceAsStream(name);
+ }
+ if (is == null) {
+ is = DefaultCamelCatalog.class.getClassLoader().getResourceAsStream(name);
+ }
+ return is;
}
}
diff --git a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/VersionManager.java b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/VersionManager.java
index cb1b9799426..e9ac2f30d77 100644
--- a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/VersionManager.java
+++ b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/VersionManager.java
@@ -23,6 +23,11 @@ import java.io.InputStream;
*/
public interface VersionManager {
+ /**
+ * Sets an extra class loader to use first for loading resources.
+ */
+ void setClassLoader(ClassLoader classLoader);
+
/**
* Gets the current loaded Camel version used by the catalog.
*/
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 2c459bdaaeb..2d68d7a6e27 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
@@ -25,7 +25,11 @@ import java.util.Set;
import org.apache.camel.catalog.CamelCatalog;
import org.apache.camel.catalog.DefaultCamelCatalog;
+import org.apache.camel.catalog.RuntimeProvider;
+import org.apache.camel.main.KameletMain;
+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.FileUtil;
import org.apache.camel.util.IOHelper;
import org.apache.camel.util.OrderedProperties;
@@ -33,6 +37,9 @@ 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);
}
@@ -114,7 +121,7 @@ class ExportSpringBoot extends Export {
String context = IOHelper.loadText(is);
IOHelper.close(is);
- CamelCatalog catalog = new DefaultCamelCatalog();
+ CamelCatalog catalog = loadSpringBootCatalog();
String camelVersion = catalog.getCatalogVersion();
context = context.replaceFirst("\\{\\{ \\.GroupId }}", ids[0]);
@@ -149,11 +156,19 @@ class ExportSpringBoot extends Export {
String gid = gav.getGroupId();
String aid = gav.getArtifactId();
String v = gav.getVersion();
+
// transform to camel-spring-boot starter GAV
if ("org.apache.camel".equals(gid)) {
- gid = "org.apache.camel.springboot";
- aid = aid + "-starter";
- v = null;
+ ArtifactModel<?> am = catalog.modelFromMavenGAV("org.apache.camel.springboot", aid + "-starter", null);
+ if (am != null) {
+ // use spring-boot starter
+ gid = am.getGroupId();
+ aid = am.getArtifactId();
+ v = null; // uses BOM so version should not be included
+ } else {
+ // there is no spring boot starter so use plain camel
+ v = camelVersion;
+ }
}
sb.append(" <dependency>\n");
sb.append(" <groupId>").append(gid).append("</groupId>\n");
@@ -213,4 +228,38 @@ class ExportSpringBoot extends Export {
return super.applicationPropertyLine(key, value);
}
+ private CamelCatalog loadSpringBootCatalog() {
+ CamelCatalog answer = new DefaultCamelCatalog(true);
+
+ // use kamelet-main to dynamic download dependency via maven
+ KameletMain main = new KameletMain();
+ try {
+ main.start();
+
+ MavenDependencyDownloader downloader = main.getCamelContext().hasService(MavenDependencyDownloader.class);
+ downloader.downloadDependency("org.apache.camel.springboot", "camel-catalog-provider-springboot",
+ answer.getCatalogVersion());
+
+ Class<RuntimeProvider> clazz = main.getCamelContext().getClassResolver().resolveClass(SPRING_BOOT_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 spring-boot 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 spring-boot provider to ensure we can load its resources
+ answer.getVersionManager().setClassLoader(main.getCamelContext().getApplicationContextClassLoader());
+ answer.enableCache();
+ }
+ }
+ } finally {
+ main.stop();
+ }
+
+ return answer;
+ }
+
}