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