You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by fm...@apache.org on 2023/03/07 15:01:08 UTC

[camel] 02/08: Backport catalog

This is an automated email from the ASF dual-hosted git repository.

fmariani pushed a commit to branch camel-3.20.x
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 20de31317a525e9c0892fa94bf5257ba73ac9333
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sun Feb 12 11:24:22 2023 +0100

    Backport catalog
---
 .../dsl/jbang/core/commands/ExportQuarkus.java     |  89 +-----------------
 .../dsl/jbang/core/commands/ExportSpringBoot.java  | 100 +--------------------
 2 files changed, 5 insertions(+), 184 deletions(-)

diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportQuarkus.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportQuarkus.java
index 4c1010eaafe..fd4bafaf3c3 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportQuarkus.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportQuarkus.java
@@ -28,21 +28,9 @@ import java.util.Set;
 import java.util.StringJoiner;
 import java.util.stream.Collectors;
 
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-
 import org.apache.camel.catalog.CamelCatalog;
-import org.apache.camel.catalog.DefaultCamelCatalog;
-import org.apache.camel.catalog.RuntimeProvider;
+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.XmlHelper;
-import org.apache.camel.main.KameletMain;
-import org.apache.camel.main.download.MavenArtifact;
-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.CamelCaseOrderedProperties;
@@ -53,11 +41,7 @@ import org.apache.commons.io.FileUtils;
 
 class ExportQuarkus extends Export {
 
-    private static final String DEFAULT_CAMEL_CATALOG = "org.apache.camel.catalog.DefaultCamelCatalog";
-    private static final String QUARKUS_CATALOG_PROVIDER = "org.apache.camel.catalog.quarkus.QuarkusRuntimeProvider";
-
     private String camelVersion;
-    private String camelQuarkusVersion;
 
     public ExportQuarkus(CamelJBangMain main) {
         super(main);
@@ -243,11 +227,12 @@ class ExportQuarkus extends Export {
         // quarkus controls the camel version
         String repos = getMavenRepos(prop, quarkusVersion);
 
-        CamelCatalog catalog = loadQuarkusCatalog(repos);
+        CamelCatalog catalog = CatalogLoader.loadQuarkusCatalog(repos, quarkusVersion);
         if (camelVersion == null) {
             camelVersion = catalog.getCatalogVersion();
         }
         String camelVersion = catalog.getCatalogVersion();
+        String camelQuarkusVersion = catalog.otherModel("camel-core-engine").getVersion();
 
         context = context.replaceFirst("\\{\\{ \\.GroupId }}", ids[0]);
         context = context.replaceFirst("\\{\\{ \\.ArtifactId }}", ids[1]);
@@ -351,7 +336,7 @@ class ExportQuarkus extends Export {
         // quarkus controls the camel version
         String repos = getMavenRepos(prop, quarkusVersion);
 
-        CamelCatalog catalog = loadQuarkusCatalog(repos);
+        CamelCatalog catalog = CatalogLoader.loadQuarkusCatalog(repos, quarkusVersion);
         if (camelVersion == null) {
             camelVersion = catalog.getCatalogVersion();
         }
@@ -455,70 +440,4 @@ class ExportQuarkus extends Export {
         return answer;
     }
 
-    private CamelCatalog loadQuarkusCatalog(String repos) {
-        CamelCatalog answer = new DefaultCamelCatalog(true);
-
-        // use kamelet-main to dynamic download dependency via maven
-        KameletMain main = new KameletMain();
-        try {
-            main.setRepos(repos);
-            main.start();
-
-            // shrinkwrap does not return POM file as result (they are hardcoded to be filtered out)
-            // so after this we download a JAR and then use its File location to compute the file for the downloaded POM
-            MavenDependencyDownloader downloader = main.getCamelContext().hasService(MavenDependencyDownloader.class);
-            MavenArtifact ma = downloader.downloadArtifact("io.quarkus.platform", "quarkus-camel-bom:pom", quarkusVersion);
-            if (ma != null && ma.getFile() != null) {
-                String name = ma.getFile().getAbsolutePath();
-                File file = new File(name);
-                if (file.exists()) {
-                    DocumentBuilderFactory dbf = XmlHelper.createDocumentBuilderFactory();
-                    DocumentBuilder db = dbf.newDocumentBuilder();
-                    Document dom = db.parse(file);
-
-                    // grab what exact camelVersion and camelQuarkusVersion we are using
-                    NodeList nl = dom.getElementsByTagName("dependency");
-                    for (int i = 0; i < nl.getLength(); i++) {
-                        Element node = (Element) nl.item(i);
-                        String g = node.getElementsByTagName("groupId").item(0).getTextContent();
-                        String a = node.getElementsByTagName("artifactId").item(0).getTextContent();
-                        if ("org.apache.camel".equals(g) && "camel-core-engine".equals(a)) {
-                            camelVersion = node.getElementsByTagName("version").item(0).getTextContent();
-                        } else if ("org.apache.camel.quarkus".equals(g) && "camel-quarkus-catalog".equals(a)) {
-                            camelQuarkusVersion = node.getElementsByTagName("version").item(0).getTextContent();
-                        }
-                    }
-                }
-            }
-
-            if (camelQuarkusVersion != null) {
-                // download camel-quarkus-catalog we use to know if we have an extension or not
-                downloader.downloadDependency("org.apache.camel.quarkus", "camel-quarkus-catalog", camelQuarkusVersion);
-
-                Class<RuntimeProvider> clazz = main.getCamelContext().getClassResolver().resolveClass(QUARKUS_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 quarkus 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 quarkus provider to ensure we can load its resources
-                        answer.getVersionManager().setClassLoader(main.getCamelContext().getApplicationContextClassLoader());
-                        answer.enableCache();
-                    }
-                }
-            }
-        } catch (Exception e) {
-            // ignore
-        } finally {
-            main.stop();
-        }
-
-        return answer;
-    }
-
 }
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 b839674fd34..76519f658a2 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
@@ -31,15 +31,8 @@ import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
 import org.apache.camel.catalog.CamelCatalog;
-import org.apache.camel.catalog.DefaultCamelCatalog;
-import org.apache.camel.catalog.RuntimeProvider;
-import org.apache.camel.catalog.VersionManager;
 import org.apache.camel.dsl.jbang.core.common.CatalogLoader;
 import org.apache.camel.dsl.jbang.core.common.RuntimeUtil;
-import org.apache.camel.main.KameletMain;
-import org.apache.camel.main.download.DependencyDownloaderClassLoader;
-import org.apache.camel.main.download.MavenArtifact;
-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.CamelCaseOrderedProperties;
@@ -50,7 +43,6 @@ 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);
@@ -293,7 +285,7 @@ class ExportSpringBoot extends Export {
         RuntimeUtil.loadProperties(prop, settings);
         String repos = getMavenRepos(prop, camelSpringBootVersion);
 
-        CamelCatalog catalog = loadSpringBootCatalog(repos, camelSpringBootVersion);
+        CamelCatalog catalog = CatalogLoader.loadSpringBootCatalog(repos, camelSpringBootVersion);
         String camelVersion = catalog.getLoadedVersion();
 
         context = context.replaceFirst("\\{\\{ \\.GroupId }}", ids[0]);
@@ -405,55 +397,6 @@ class ExportSpringBoot extends Export {
         return super.applicationPropertyLine(key, value);
     }
 
-    private CamelCatalog loadSpringBootCatalog(String repos, String version) throws Exception {
-        CamelCatalog answer = new DefaultCamelCatalog();
-        if (version == null) {
-            version = answer.getCatalogVersion();
-        }
-
-        // use kamelet-main to dynamic download dependency via maven
-        KameletMain main = new KameletMain();
-        try {
-            main.setRepos(repos);
-            main.start();
-
-            // wrap downloaded catalog files in an isolated classloader
-            DependencyDownloaderClassLoader cl
-                    = new DependencyDownloaderClassLoader(main.getCamelContext().getApplicationContextClassLoader());
-
-            // 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);
-            }
-            ma = downloader.downloadArtifact("org.apache.camel.springboot", "camel-catalog-provider-springboot", version);
-            if (ma != null) {
-                cl.addFile(ma.getFile());
-            } else {
-                throw new IOException(
-                        "Cannot download org.apache.camel.springboot:camel-catalog-provider-springboot:" + version);
-            }
-
-            answer.setVersionManager(new SpringBootCatalogVersionManager(version, cl));
-            Class<RuntimeProvider> clazz = (Class<RuntimeProvider>) cl.loadClass(SPRING_BOOT_CATALOG_PROVIDER);
-            if (clazz != null) {
-                RuntimeProvider provider = main.getCamelContext().getInjector().newInstance(clazz);
-                if (provider != null) {
-                    answer.setRuntimeProvider(provider);
-                }
-            }
-            answer.enableCache();
-
-        } finally {
-            main.stop();
-        }
-
-        return answer;
-    }
-
     private String readResourceTemplate(String name) throws IOException {
         InputStream is = ExportSpringBoot.class.getClassLoader().getResourceAsStream(name);
         String text = IOHelper.loadText(is);
@@ -461,45 +404,4 @@ class ExportSpringBoot extends Export {
         return text;
     }
 
-    private final class SpringBootCatalogVersionManager implements VersionManager {
-
-        private ClassLoader classLoader;
-        private final String version;
-
-        public SpringBootCatalogVersionManager(String version, ClassLoader classLoader) {
-            this.version = version;
-            this.classLoader = classLoader;
-        }
-
-        @Override
-        public void setClassLoader(ClassLoader classLoader) {
-            this.classLoader = classLoader;
-        }
-
-        @Override
-        public String getLoadedVersion() {
-            return version;
-        }
-
-        @Override
-        public boolean loadVersion(String version) {
-            return this.version.equals(version);
-        }
-
-        @Override
-        public String getRuntimeProviderLoadedVersion() {
-            return version;
-        }
-
-        @Override
-        public boolean loadRuntimeProviderVersion(String groupId, String artifactId, String version) {
-            return true;
-        }
-
-        @Override
-        public InputStream getResourceAsStream(String name) {
-            return classLoader.getResourceAsStream(name);
-        }
-    }
-
 }