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 14:11:37 UTC

[camel] branch camel-3.x updated: CAMEL-19120: export configurable template

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

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


The following commit(s) were added to refs/heads/camel-3.x by this push:
     new 4a8b4a93450 CAMEL-19120: export configurable template
4a8b4a93450 is described below

commit 4a8b4a9345051793874bfb40f96850701a3e4475
Author: Croway <fe...@gmail.com>
AuthorDate: Mon Mar 6 16:35:40 2023 +0100

    CAMEL-19120: export configurable template
---
 .../org/apache/camel/catalog/CamelCatalog.java     | 10 +++++++
 .../apache/camel/catalog/DefaultCamelCatalog.java  |  6 ++++
 .../org/apache/camel/catalog/CamelCatalogTest.java | 18 ++++++++++++
 .../resources/org/apache/camel/catalog/bar/foo.txt |  1 +
 .../camel/dsl/jbang/core/commands/Export.java      |  1 +
 .../dsl/jbang/core/commands/ExportBaseCommand.java |  4 +++
 .../dsl/jbang/core/commands/ExportSpringBoot.java  | 34 +++++++++++++++++++---
 .../apache/camel/dsl/jbang/core/commands/Run.java  |  1 -
 .../camel/dsl/jbang/core/common/CatalogLoader.java | 14 +++++++--
 9 files changed, 82 insertions(+), 7 deletions(-)

diff --git a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/CamelCatalog.java b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/CamelCatalog.java
index ff9bcf1d13c..6938c48e009 100644
--- a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/CamelCatalog.java
+++ b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/CamelCatalog.java
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.catalog;
 
+import java.io.InputStream;
 import java.net.URISyntaxException;
 import java.util.List;
 import java.util.Map;
@@ -570,4 +571,13 @@ public interface CamelCatalog {
      */
     ArtifactModel<?> modelFromMavenGAV(String groupId, String artifactId, String version);
 
+    /**
+     * Load resource from catalog classpath
+     *
+     * @param  kind The resource kind, ex. camel-jbang
+     * @param  name The resource name
+     * @return      An input stream for reading the resource; null if the resource could not be found
+     */
+    InputStream loadResource(String kind, String name);
+
 }
diff --git a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java
index 8791b097985..775294144f3 100644
--- a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java
+++ b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java
@@ -63,6 +63,7 @@ public class DefaultCamelCatalog extends AbstractCamelCatalog implements CamelCa
     private static final String ARCHETYPES_CATALOG = "org/apache/camel/catalog/archetypes/archetype-catalog.xml";
     private static final String SCHEMAS_XML = "org/apache/camel/catalog/schemas";
     private static final String MAIN_DIR = "org/apache/camel/catalog/main";
+    private static final String BASE_RESOURCE_DIR = "org/apache/camel/catalog";
 
     private final VersionHelper version = new VersionHelper();
 
@@ -495,6 +496,11 @@ public class DefaultCamelCatalog extends AbstractCamelCatalog implements CamelCa
         return null;
     }
 
+    @Override
+    public InputStream loadResource(String kind, String name) {
+        return versionManager.getResourceAsStream(BASE_RESOURCE_DIR + "/" + kind + "/" + name);
+    }
+
     private static boolean matchArtifact(ArtifactModel<?> am, String groupId, String artifactId, String version) {
         return groupId.equals(am.getGroupId()) && artifactId.equals(am.getArtifactId())
                 && (version == null || version.isBlank() || version.equals(am.getVersion()));
diff --git a/catalog/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java b/catalog/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java
index 407ec076ce2..97f09b0eba5 100644
--- a/catalog/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java
+++ b/catalog/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java
@@ -17,6 +17,9 @@
 package org.apache.camel.catalog;
 
 import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -1577,4 +1580,19 @@ public class CamelCatalogTest {
         Assertions.assertEquals("Sent and receive messages to/from a JMS Queue or Topic.", am.getDescription());
     }
 
+    @Test
+    public void loadFooResourceWithBarKind() throws IOException {
+        InputStream is = catalog.loadResource("bar", "foo.txt");
+        Assertions.assertNotNull(is);
+
+        String content = new String(is.readAllBytes(), StandardCharsets.UTF_8);
+        Assertions.assertEquals("Hello Camel", content);
+    }
+
+    @Test
+    public void loadNotExistingResource() {
+        InputStream is = catalog.loadResource("bar", "not_exists");
+        Assertions.assertNull(is);
+    }
+
 }
diff --git a/catalog/camel-catalog/src/test/resources/org/apache/camel/catalog/bar/foo.txt b/catalog/camel-catalog/src/test/resources/org/apache/camel/catalog/bar/foo.txt
new file mode 100644
index 00000000000..1d9ad12b82a
--- /dev/null
+++ b/catalog/camel-catalog/src/test/resources/org/apache/camel/catalog/bar/foo.txt
@@ -0,0 +1 @@
+Hello Camel
\ No newline at end of file
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java
index 3eb0815a346..22d599ff96a 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java
@@ -107,6 +107,7 @@ class Export extends ExportBaseCommand {
         cmd.gradleWrapper = this.gradleWrapper;
         cmd.buildTool = this.buildTool;
         cmd.quiet = this.quiet;
+        cmd.additionalProperties = this.additionalProperties;
         // run export
         return cmd.export();
     }
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java
index 32913ca9812..b9a108a4885 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java
@@ -136,6 +136,10 @@ abstract class ExportBaseCommand extends CamelCommand {
     @CommandLine.Option(names = { "--fresh" }, description = "Make sure we use fresh (i.e. non-cached) resources")
     protected boolean fresh;
 
+    @CommandLine.Option(names = { "--additional-properties" },
+                        description = "Additional maven properties, ex. --additional-properties=prop1=foo,prop2=bar")
+    protected String additionalProperties;
+
     @CommandLine.Option(names = { "--logging" }, defaultValue = "false",
                         description = "Can be used to turn on logging (logs to file in <user home>/.camel directory)")
     boolean logging;
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 955e8502f28..3348211f2b3 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
@@ -22,11 +22,13 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Properties;
 import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import java.util.stream.Collectors;
 
 import org.apache.camel.catalog.CamelCatalog;
 import org.apache.camel.dsl.jbang.core.common.CatalogLoader;
@@ -140,13 +142,22 @@ class ExportSpringBoot extends Export {
     private void createMavenPom(File settings, File profile, File pom, Set<String> deps) throws Exception {
         String[] ids = gav.split(":");
 
-        String context = readResourceTemplate("templates/spring-boot-pom.tmpl");
-
         Properties prop = new CamelCaseOrderedProperties();
         RuntimeUtil.loadProperties(prop, settings);
         String repos = getMavenRepos(settings, prop, camelSpringBootVersion);
 
         CamelCatalog catalog = CatalogLoader.loadSpringBootCatalog(repos, camelSpringBootVersion);
+
+        // First try to load a specialized template from the catalog, if the catalog does not provide it
+        // fallback to the template defined in camel-jbang-core
+        String context;
+        InputStream template = catalog.loadResource("camel-jbang", "spring-boot-pom.tmpl");
+        if (template != null) {
+            context = IOHelper.loadText(template);
+        } else {
+            context = readResourceTemplate("templates/spring-boot-pom.tmpl");
+        }
+
         String camelVersion = catalog.getLoadedVersion();
 
         context = context.replaceFirst("\\{\\{ \\.GroupId }}", ids[0]);
@@ -155,6 +166,21 @@ class ExportSpringBoot extends Export {
         context = context.replaceAll("\\{\\{ \\.SpringBootVersion }}", springBootVersion);
         context = context.replaceFirst("\\{\\{ \\.JavaVersion }}", javaVersion);
         context = context.replaceFirst("\\{\\{ \\.CamelVersion }}", camelVersion);
+        if (camelSpringBootVersion != null) {
+            context = context.replaceFirst("\\{\\{ \\.CamelSpringBootVersion }}", camelSpringBootVersion);
+        }
+        if (additionalProperties != null) {
+            String properties = Arrays.stream(additionalProperties.split(","))
+                    .map(property -> {
+                        String[] keyValueProperty = property.split("=");
+                        String mavenProperty = String.format("\t\t<%s>%s</%s>", keyValueProperty[0], keyValueProperty[1],
+                                keyValueProperty[0]);
+                        return mavenProperty;
+                    })
+                    .map(property -> property + System.lineSeparator())
+                    .collect(Collectors.joining());
+            context = context.replaceFirst("\\{\\{ \\.AdditionalProperties }}", properties);
+        }
 
         // Convert jkube properties to maven properties
         Properties allProps = new CamelCaseOrderedProperties();
@@ -169,7 +195,7 @@ class ExportSpringBoot extends Export {
         context = context.replaceFirst(Pattern.quote("{{ .jkubeProperties }}"),
                 Matcher.quoteReplacement(sbJKube.toString()));
 
-        if (repos == null) {
+        if (repos == null || repos.isEmpty()) {
             context = context.replaceFirst("\\{\\{ \\.MavenRepositories }}", "");
         } else {
             int i = 1;
@@ -269,7 +295,7 @@ class ExportSpringBoot extends Export {
         context = context.replaceFirst("\\{\\{ \\.JavaVersion }}", javaVersion);
         context = context.replaceAll("\\{\\{ \\.CamelVersion }}", camelVersion);
 
-        if (repos == null) {
+        if (repos == null || repos.isEmpty()) {
             context = context.replaceFirst("\\{\\{ \\.MavenRepositories }}", "");
         } else {
             StringBuilder sb = new StringBuilder();
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
index 76a4f41f365..41f9b3d8637 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
@@ -1067,7 +1067,6 @@ class Run extends CamelCommand {
             onDownloadDependency(groupId, artifactId, version);
         }
 
-        @Override
         public void onExtraRepository(String repo) {
             if (!repos.contains(repo)) {
                 writeSettings("repository", repo);
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
index e29672496d5..49030808388 100644
--- 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
@@ -33,6 +33,7 @@ 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.DownloadException;
 import org.apache.camel.main.download.MavenArtifact;
 import org.apache.camel.main.download.MavenDependencyDownloader;
 
@@ -106,12 +107,21 @@ public final class CatalogLoader {
 
             // download camel-catalog for that specific version
             MavenDependencyDownloader downloader = main.getCamelContext().hasService(MavenDependencyDownloader.class);
-            MavenArtifact ma = downloader.downloadArtifact("org.apache.camel", "camel-catalog", version);
+            MavenArtifact ma;
+            String camelCatalogVersion = version;
+            try {
+                ma = downloader.downloadArtifact("org.apache.camel", "camel-catalog", camelCatalogVersion);
+            } catch (DownloadException ex) {
+                // fallback, in case camel spring boot version differ from camel version
+                camelCatalogVersion = answer.getCatalogVersion();
+                ma = downloader.downloadArtifact("org.apache.camel", "camel-catalog", camelCatalogVersion);
+            }
             if (ma != null) {
                 cl.addFile(ma.getFile());
             } else {
-                throw new IOException("Cannot download org.apache.camel:camel-catalog:" + version);
+                throw new IOException("Cannot download org.apache.camel:camel-catalog:" + camelCatalogVersion);
             }
+
             ma = downloader.downloadArtifact("org.apache.camel.springboot", "camel-catalog-provider-springboot", version);
             if (ma != null) {
                 cl.addFile(ma.getFile());