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 2023/10/03 09:58:06 UTC

[camel] branch main updated: CAMEL-19932: camel-jbang - Run/Transform from existing maven based structure

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 d1d8a5ed9a1 CAMEL-19932: camel-jbang - Run/Transform from existing maven based structure
d1d8a5ed9a1 is described below

commit d1d8a5ed9a1796cc6f823879c18122b97afa6a6e
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Oct 3 11:57:37 2023 +0200

    CAMEL-19932: camel-jbang - Run/Transform from existing maven based structure
---
 .../modules/ROOT/pages/camel-jbang.adoc            | 25 ++++++++++++++++
 .../apache/camel/dsl/jbang/core/commands/Run.java  | 34 ++++++++++++++++++++++
 2 files changed, 59 insertions(+)

diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc b/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
index 27feb9c33ea..f3ab6737ffb 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
@@ -185,6 +185,31 @@ camel run *
 
 TIP: The run goal can also detect files that are `properties`, such as `application.properties`.
 
+=== Running a Maven or Gradle based project
+
+Camel JBang is intended for flat-file based projects, where you run small integrations.
+However, Camel JBang may be used as a tool for migrating existing Maven or Gradle based projects.
+To make the migration easier, then JBang can do _best effort_ to run, export, or transform these projects.
+
+For example if you have a Maven based project, you can execute
+
+[source,bash]
+----
+camel run pom.xml
+----
+
+or for a Gradle project
+
+[source,bash]
+----
+camel run build.gradle
+----
+
+Camel JBang will then scan in `src/main/java` and `src/main/resources` for files to include (recursive).
+
+NOTE: Using `camel run pom.xml` is not intended as a fully compatible way of running an existing Maven based project.
+
+
 === Running Route from input parameter
 
 For very small Java routes then it is possible to provide the route as CLI argument, as shown below:
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 fd5ce4e3b94..cec9bdfe5e2 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
@@ -44,6 +44,7 @@ import java.util.function.Supplier;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
@@ -515,6 +516,11 @@ public class Run extends CamelCommand {
             files.add(OPENAPI_GENERATED_FILE);
         }
 
+        // if we only run pom.xml/build.gradle then auto discover from the Maven/Gradle based project
+        if (files.size() == 1 && ("pom.xml".equals(files.get(0)) || "build.gradle".equals(files.get(0)))) {
+            files = scanMavenOrGradleProject();
+        }
+
         for (String file : files) {
             if (file.startsWith("clipboard") && !(new File(file).exists())) {
                 file = loadFromClipboard(file);
@@ -709,6 +715,28 @@ public class Run extends CamelCommand {
         }
     }
 
+    private static List<String> scanMavenOrGradleProject() {
+        List<String> answer = new ArrayList<>();
+        // scan as maven based project
+        Stream<Path> s = Stream.concat(walk(Path.of("src/main/java")), walk(Path.of("src/main/resources")));
+        s.filter(p -> p.toFile().isFile())
+                .map(p -> p.toFile().getPath())
+                .forEach(answer::add);
+        return answer;
+    }
+
+    public static Stream<Path> walk(Path dir) {
+        try {
+            if (Files.isDirectory(dir)) {
+                return Files.walk(dir);
+            } else {
+                return Stream.empty();
+            }
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
     protected void doAddInitialProperty(KameletMain main) {
         // noop
     }
@@ -1157,6 +1185,9 @@ public class Run extends CamelCommand {
     }
 
     private boolean skipFile(String name) {
+        // flatten file
+        name = FileUtil.stripPath(name);
+
         if (OPENAPI_GENERATED_FILE.equals(name)) {
             return false;
         }
@@ -1173,6 +1204,9 @@ public class Run extends CamelCommand {
                 || "compose.yaml".equals(name)) {
             return true;
         }
+        if (name.equals("NOTICE.txt") || name.equals("LICENSE.txt")) {
+            return true;
+        }
 
         if (name.startsWith(".")) {
             // relative file is okay, otherwise we assume it's a hidden file