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

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

commit b162f66dcf90fe06ec12ff4b0b047ff956245060
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Sun Feb 12 11:24:22 2023 +0100

    camel-jbang - CatalogLoader
---
 .../dsl/jbang/core/commands/ExportQuarkus.java     |  89 +--------
 .../dsl/jbang/core/commands/ExportSpringBoot.java  | 103 +----------
 .../camel/dsl/jbang/core/common/CatalogLoader.java | 205 +++++++++++++++++++++
 3 files changed, 212 insertions(+), 185 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 bdfcda47383..6731c7528c8 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);
@@ -242,11 +226,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]);
@@ -350,7 +335,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();
         }
@@ -454,70 +439,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 ad1f94149ad..ef0264add9d 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
@@ -29,14 +29,8 @@ import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 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;
@@ -47,7 +41,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);
@@ -152,7 +145,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]);
@@ -265,7 +258,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]);
@@ -377,55 +370,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);
@@ -433,45 +377,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);
-        }
-    }
-
 }
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
new file mode 100644
index 00000000000..5ca7ca450d5
--- /dev/null
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/CatalogLoader.java
@@ -0,0 +1,205 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.dsl.jbang.core.common;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+
+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.catalog.VersionManager;
+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;
+
+public final class CatalogLoader {
+
+    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";
+
+    private static final String QUARKUS_CATALOG_PROVIDER = 
"org.apache.camel.catalog.quarkus.QuarkusRuntimeProvider";
+
+    private CatalogLoader() {
+    }
+
+    public static 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;
+    }
+
+    public static CamelCatalog loadQuarkusCatalog(String repos, String 
quarkusVersion) {
+        String camelQuarkusVersion = null;
+        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.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;
+    }
+
+    private static 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);
+        }
+    }
+
+}

Reply via email to