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

apupier 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 21c66f8f40e CAMEL-21175 - Create package name for file created with 
Camel Jbang
21c66f8f40e is described below

commit 21c66f8f40ef5765f4702c51ff9268e2df2ef561
Author: AurĂ©lien Pupier <[email protected]>
AuthorDate: Wed Sep 4 17:32:23 2024 +0200

    CAMEL-21175 - Create package name for file created with Camel Jbang
    
    when the file is created in a subfolder of a src/main/java directory
    
    Signed-off-by: AurĂ©lien Pupier <[email protected]>
---
 .../apache/camel/dsl/jbang/core/commands/Init.java | 26 ++++++++++++++++
 .../src/main/resources/templates/java.tmpl         |  2 +-
 .../camel/dsl/jbang/core/commands/InitTest.java    | 36 ++++++++++++++++++++++
 3 files changed, 63 insertions(+), 1 deletion(-)

diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Init.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Init.java
index 0140e702675..f6a202a5544 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Init.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Init.java
@@ -18,6 +18,7 @@ package org.apache.camel.dsl.jbang.core.commands;
 
 import java.io.File;
 import java.io.FileOutputStream;
+import java.io.IOException;
 import java.io.InputStream;
 import java.nio.file.Path;
 import java.util.Stack;
@@ -178,10 +179,35 @@ public class Init extends CamelCommand {
             }
             content = sb.toString();
         }
+        if ("java".equals(ext)) {
+            String packageDeclaration = computeJavaPackageDeclaration(target);
+            content = content.replaceFirst("\\{\\{ \\.PackageDeclaration }}", 
packageDeclaration);
+        }
         IOHelper.writeText(content, new FileOutputStream(target, false));
         return 0;
     }
 
+    /**
+     * @param  target
+     * @return             The package declaration lines to insert at the 
beginning of the file or empty string if no
+     *                     package found
+     * @throws IOException
+     */
+    private String computeJavaPackageDeclaration(File target) throws 
IOException {
+        String packageDeclaration = "";
+        String canonicalPath = target.getParentFile().getCanonicalPath();
+        String srcMainJavaPath = "src" + File.separatorChar + "main" + 
File.separatorChar + "java";
+        int index = canonicalPath.indexOf(srcMainJavaPath);
+        if (index != -1) {
+            String packagePath = canonicalPath.substring(index + 
srcMainJavaPath.length() + 1);
+            String packageName = packagePath.replace(File.separatorChar, '.');
+            if (!packageName.isEmpty()) {
+                packageDeclaration = "package " + packageName + ";\n\n";
+            }
+        }
+        return packageDeclaration;
+    }
+
     private void createWorkingDirectoryIfAbsent() {
         File work = CommandLineHelper.getWorkDir();
         if (!work.exists()) {
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/java.tmpl 
b/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/java.tmpl
index 468454c3fb2..1f922f1e6e7 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/java.tmpl
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/java.tmpl
@@ -1,4 +1,4 @@
-import org.apache.camel.builder.RouteBuilder;
+{{ .PackageDeclaration }}import org.apache.camel.builder.RouteBuilder;
 
 public class {{ .Name }} extends RouteBuilder {
 
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/InitTest.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/InitTest.java
index 215be781fee..f23f70d009b 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/InitTest.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/InitTest.java
@@ -20,6 +20,7 @@ import java.io.File;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
+import java.util.List;
 
 import org.apache.camel.util.FileUtil;
 import org.junit.jupiter.api.AfterEach;
@@ -85,4 +86,39 @@ class InitTest {
 
         assertTrue(existingFileInTargetDirectory.toFile().exists(), "The file 
in the target folder has been deleted");
     }
+
+    @Test
+    void initJavaWithPackageName() throws Exception {
+        Path packageFolderInsideMavenProject
+                = Files.createDirectories(new File(workingDir, 
"src/main/java/com/acme/demo").toPath());
+
+        Init initCommand = new Init(new CamelJBangMain());
+        CommandLine.populateCommand(initCommand, "MyRoute.java", "--dir=" + 
packageFolderInsideMavenProject);
+
+        int exit = initCommand.doCall();
+
+        assertEquals(0, exit);
+        File f = new File(packageFolderInsideMavenProject.toFile(), 
"MyRoute.java");
+        assertTrue(f.exists(), "Java file not created: " + f);
+        List<String> lines = Files.readAllLines(f.toPath());
+        assertEquals("package com.acme.demo;", lines.get(0));
+        assertEquals("", lines.get(1));
+        assertEquals("import org.apache.camel.builder.RouteBuilder;", 
lines.get(2));
+        f.delete();
+    }
+
+    @Test
+    void initJavaWithoutPackageName() throws Exception {
+        Init initCommand = new Init(new CamelJBangMain());
+        CommandLine.populateCommand(initCommand, "MyRoute.java");
+
+        int exit = initCommand.doCall();
+
+        assertEquals(0, exit);
+        File f = new File("MyRoute.java");
+        assertTrue(f.exists(), "Java file not created: " + f);
+        List<String> lines = Files.readAllLines(f.toPath());
+        assertEquals("import org.apache.camel.builder.RouteBuilder;", 
lines.get(0));
+        f.delete();
+    }
 }

Reply via email to