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 10d5086721f6380af7f0de8c2342f26d3bd7e1d9 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); + } + } + +}