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 304782512c468f227652ce83f8ba25b39966cb9a
Author: Claus Ibsen <[email protected]>
AuthorDate: Fri Jul 10 21:48:43 2026 +0200

    chore: fix bugs in CLI edit, generate, test, and validate plugins
    
    - Fix swapped start/end line variables and zero-length append in LSP
      text edit application
    - Remove duplicate connected-mode diagnostics computation
    - Fix dotted package path not converted to directory separators in
      REST code generator, add renameTo return value check
    - Add null check after OpenAPI parse and unknown --type handling
    - Fix test init directory comparison using wrong Path reference
    - Skip blank dependency entries in test plugin exporter
    - Fix regex group(0) vs group(1) in class name mangling
    - Delete stale dump files before normalize and transform runs
    - Fix YAML validate error count to sum actual errors, warn on
      non-YAML files
    - Fix schema generator --output default to write to stdout as
      documented, close classloader on error paths
    
    Co-Authored-By: Claude Opus 4.6 <[email protected]>
    Signed-off-by: Claus Ibsen <[email protected]>
---
 .../dsl/jbang/core/commands/TransformRoute.java     |  1 +
 .../core/commands/edit/CamelNanoLspEditor.java      |  7 +++----
 .../core/commands/generate/CodeRestGenerator.java   | 15 +++++++++++++--
 .../core/commands/generate/CodeSchemaGenerator.java | 21 ++++++++++++---------
 .../dsl/jbang/core/commands/test/TestInit.java      |  3 ++-
 .../core/commands/test/TestPluginExporter.java      |  6 +++++-
 .../commands/validate/YamlNormalizeCommand.java     |  1 +
 .../core/commands/validate/YamlValidateCommand.java |  6 +++---
 8 files changed, 40 insertions(+), 20 deletions(-)

diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/TransformRoute.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/TransformRoute.java
index 81d875d5de6e..7a74d4924b3e 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/TransformRoute.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/TransformRoute.java
@@ -105,6 +105,7 @@ public class TransformRoute extends CamelCommand {
         if (output == null || "clipboard".equals(output)) {
             dump = CommandLineHelper.CAMEL_JBANG_WORK_DIR + 
"/transform-output." + format;
         }
+        Files.deleteIfExists(Path.of(dump));
         final String target = dump;
 
         Run run = new Run(getMain()) {
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-edit/src/main/java/org/apache/camel/dsl/jbang/core/commands/edit/CamelNanoLspEditor.java
 
b/dsl/camel-jbang/camel-jbang-plugin-edit/src/main/java/org/apache/camel/dsl/jbang/core/commands/edit/CamelNanoLspEditor.java
index c3a2cafef72d..fd7a3ac23fe8 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-edit/src/main/java/org/apache/camel/dsl/jbang/core/commands/edit/CamelNanoLspEditor.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-edit/src/main/java/org/apache/camel/dsl/jbang/core/commands/edit/CamelNanoLspEditor.java
@@ -145,9 +145,9 @@ public class CamelNanoLspEditor extends Nano {
             TextEdit left = textEdit.getLeft();
             Range range = left.getRange();
             Position start = range.getStart();
-            int endLine = start.getLine();
+            int startLine = start.getLine();
             Position end = range.getEnd();
-            int startLine = end.getLine();
+            int endLine = end.getLine();
             if (startLine == endLine) {
                 StringBuilder newLine = new StringBuilder();
                 String line = this.buffer.getLines().get(startLine);
@@ -168,7 +168,7 @@ public class CamelNanoLspEditor extends Nano {
                 StringBuilder newSecondLine = new StringBuilder();
                 String oldSecondLine = this.buffer.getLines().get(endLine);
                 newSecondLine.append(newText, oldFirstLine.length() - 
start.getCharacter(), end.getCharacter());
-                newSecondLine.append(oldSecondLine, end.getCharacter(), 
end.getCharacter());
+                
newSecondLine.append(oldSecondLine.substring(end.getCharacter()));
                 this.buffer.getLines().set(endLine, newSecondLine.toString());
                 this.buffer.moveRight(left.getNewText().length());
             }
@@ -222,7 +222,6 @@ public class CamelNanoLspEditor extends Nano {
             
diagnostics.addAll(configurationPropertiesDiagnosticService.converToLSPDiagnostics(configurationPropertiesErrors));
             
diagnostics.addAll(camelKModelineDiagnosticService.compute(camelText, 
documentItem));
             
diagnostics.addAll(connectedModeDiagnosticService.compute(camelText, 
documentItem));
-            
diagnostics.addAll(connectedModeDiagnosticService.compute(camelText, 
documentItem));
             return diagnostics.stream()
                     .map(diag -> (Diagnostic) new DiagnosticWrapper(diag))
                     .toList();
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-generate/src/main/java/org/apache/camel/dsl/jbang/core/commands/generate/CodeRestGenerator.java
 
b/dsl/camel-jbang/camel-jbang-plugin-generate/src/main/java/org/apache/camel/dsl/jbang/core/commands/generate/CodeRestGenerator.java
index 516f580f074b..a721be5cb527 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-generate/src/main/java/org/apache/camel/dsl/jbang/core/commands/generate/CodeRestGenerator.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-generate/src/main/java/org/apache/camel/dsl/jbang/core/commands/generate/CodeRestGenerator.java
@@ -113,6 +113,11 @@ public class CodeRestGenerator extends CamelCommand {
         OpenAPIV3Parser parser = new OpenAPIV3Parser();
         doc = parser.read(input);
 
+        if (doc == null) {
+            printer().println("Error: Failed to parse OpenAPI specification: " 
+ input);
+            return 1;
+        }
+
         Configurator.setRootLevel(Level.OFF);
         try (CamelContext context = new DefaultCamelContext()) {
             String text = null;
@@ -124,6 +129,9 @@ public class CodeRestGenerator extends CamelCommand {
                 text = RestDslGenerator.toXml(doc)
                         .withDtoPackageName(generateDataObjects ? packageName 
: null)
                         .generate(context);
+            } else {
+                printer().println("Error: Unknown type: " + type + " 
(supported: yaml, xml)");
+                return 1;
             }
             if (text != null) {
                 if (output == null) {
@@ -163,7 +171,10 @@ public class CodeRestGenerator extends CamelCommand {
 
         final ClientOptInput clientOptInput = configurator.toClientOptInput();
         new DefaultGenerator().opts(clientOptInput).generate();
-        File generated = new File(Paths.get(output.getAbsolutePath(), code, 
packageName).toUri());
-        generated.renameTo(new File(packageName));
+        String packageDir = packageName.replace('.', File.separatorChar);
+        File generated = Paths.get(output.getAbsolutePath(), code, 
packageDir).toFile();
+        if (generated.exists() && !generated.renameTo(new File(packageDir))) {
+            printer().println("Error: Failed to move generated DTOs to " + 
packageDir);
+        }
     }
 }
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-generate/src/main/java/org/apache/camel/dsl/jbang/core/commands/generate/CodeSchemaGenerator.java
 
b/dsl/camel-jbang/camel-jbang-plugin-generate/src/main/java/org/apache/camel/dsl/jbang/core/commands/generate/CodeSchemaGenerator.java
index 4d48d53a56c4..451781ece0a3 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-generate/src/main/java/org/apache/camel/dsl/jbang/core/commands/generate/CodeSchemaGenerator.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-generate/src/main/java/org/apache/camel/dsl/jbang/core/commands/generate/CodeSchemaGenerator.java
@@ -17,7 +17,6 @@
 package org.apache.camel.dsl.jbang.core.commands.generate;
 
 import java.io.File;
-import java.nio.file.Paths;
 import java.util.List;
 
 import com.fasterxml.jackson.databind.JsonNode;
@@ -35,6 +34,7 @@ import 
org.apache.camel.dsl.jbang.core.commands.MavenResolverMixin;
 import org.apache.camel.main.download.DependencyDownloaderClassLoader;
 import org.apache.camel.main.download.MavenDependencyDownloader;
 import org.apache.camel.tooling.maven.MavenArtifact;
+import org.apache.camel.util.IOHelper;
 import picocli.CommandLine;
 
 /**
@@ -212,6 +212,7 @@ public class CodeSchemaGenerator extends CamelCommand {
                             "Error: No artifacts found for component 'camel-" 
+ camelComponent + "' version '" + version + "'");
                     printer().printErr("Please verify that the component name 
is correct and the version exists.");
                     printer().printErr("Available components can be found at: 
https://camel.apache.org/components/";);
+                    IOHelper.close(cl);
                     return null;
                 }
 
@@ -221,6 +222,9 @@ public class CodeSchemaGenerator extends CamelCommand {
                 }
 
                 artifacts.forEach(artifact -> cl.addFile(artifact.getFile()));
+            } catch (Exception e) {
+                IOHelper.close(cl);
+                throw e;
             }
 
             return cl;
@@ -324,15 +328,14 @@ public class CodeSchemaGenerator extends CamelCommand {
      * @param schema The schema to output
      */
     private void outputSchema(JsonNode schema) throws Exception {
-        if (outputFile == null || outputFile.isEmpty()) {
-            outputFile = Paths.get(".") + File.separator + fullyQualifiedName 
+ "-schema.json";
-        }
-
         ObjectMapper objectMapper = new ObjectMapper();
 
-        objectMapper.writerWithDefaultPrettyPrinter()
-                .writeValue(new File(outputFile), schema);
-
-        printer().println("Schema saved to: " + outputFile);
+        if (outputFile == null || outputFile.isEmpty()) {
+            
printer().println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(schema));
+        } else {
+            objectMapper.writerWithDefaultPrettyPrinter()
+                    .writeValue(new File(outputFile), schema);
+            printer().println("Schema saved to: " + outputFile);
+        }
     }
 }
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-test/src/main/java/org/apache/camel/dsl/jbang/core/commands/test/TestInit.java
 
b/dsl/camel-jbang/camel-jbang-plugin-test/src/main/java/org/apache/camel/dsl/jbang/core/commands/test/TestInit.java
index 8d8eea6fd034..cadb45651a15 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-test/src/main/java/org/apache/camel/dsl/jbang/core/commands/test/TestInit.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-test/src/main/java/org/apache/camel/dsl/jbang/core/commands/test/TestInit.java
@@ -75,7 +75,8 @@ public class TestInit extends CitrusCommand {
 
         Path currentDir = Paths.get(".");
         Path workingDir;
-        if (directory.equals(currentDir.getFileName().toString())) {
+        String currentDirName = 
Paths.get("").toAbsolutePath().getFileName().toString();
+        if (directory.equals(currentDirName)) {
             // current directory is already the target subfolder
             workingDir = currentDir;
         } else if (currentDir.resolve(directory).toFile().exists()) {
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-test/src/main/java/org/apache/camel/dsl/jbang/core/commands/test/TestPluginExporter.java
 
b/dsl/camel-jbang/camel-jbang-plugin-test/src/main/java/org/apache/camel/dsl/jbang/core/commands/test/TestPluginExporter.java
index c20a1a59bfeb..b3db94123827 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-test/src/main/java/org/apache/camel/dsl/jbang/core/commands/test/TestPluginExporter.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-test/src/main/java/org/apache/camel/dsl/jbang/core/commands/test/TestPluginExporter.java
@@ -25,6 +25,7 @@ import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.HashSet;
+import java.util.Locale;
 import java.util.Properties;
 import java.util.Set;
 import java.util.regex.Matcher;
@@ -98,6 +99,9 @@ public class TestPluginExporter implements PluginExporter {
                 // read runtime dependencies from jbang-.properties
                 String[] dependencies = props.getOrDefault("run.deps", 
"").toString().split(",");
                 for (String dependency : dependencies) {
+                    if (dependency.isBlank()) {
+                        continue;
+                    }
                     if (dependency.startsWith("org.citrusframework:")) {
                         // construct proper Citrus Maven GAV from just the 
artifact id
                         deps.add(asDependency(extractArtifactId(dependency)));
@@ -219,7 +223,7 @@ public class TestPluginExporter implements PluginExporter {
         int last = 0;
         while (matcher.find()) {
             sb.append(resourceName, last, matcher.start());
-            sb.append(matcher.group(0).toUpperCase());
+            sb.append(matcher.group(1).toUpperCase(Locale.ROOT));
             last = matcher.end();
         }
         sb.append(resourceName.substring(last));
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-validate/src/main/java/org/apache/camel/dsl/jbang/core/commands/validate/YamlNormalizeCommand.java
 
b/dsl/camel-jbang/camel-jbang-plugin-validate/src/main/java/org/apache/camel/dsl/jbang/core/commands/validate/YamlNormalizeCommand.java
index 8e569c2eed00..38fb2a0c80e0 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-validate/src/main/java/org/apache/camel/dsl/jbang/core/commands/validate/YamlNormalizeCommand.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-validate/src/main/java/org/apache/camel/dsl/jbang/core/commands/validate/YamlNormalizeCommand.java
@@ -73,6 +73,7 @@ public class YamlNormalizeCommand extends CamelCommand {
         }
 
         String dump = CommandLineHelper.CAMEL_JBANG_WORK_DIR + 
"/normalize-output.yaml";
+        Files.deleteIfExists(Path.of(dump));
         final String target = dump;
 
         Run run = new Run(getMain()) {
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-validate/src/main/java/org/apache/camel/dsl/jbang/core/commands/validate/YamlValidateCommand.java
 
b/dsl/camel-jbang/camel-jbang-plugin-validate/src/main/java/org/apache/camel/dsl/jbang/core/commands/validate/YamlValidateCommand.java
index ae89965d4fc9..f174a02053b5 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-validate/src/main/java/org/apache/camel/dsl/jbang/core/commands/validate/YamlValidateCommand.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-validate/src/main/java/org/apache/camel/dsl/jbang/core/commands/validate/YamlValidateCommand.java
@@ -60,6 +60,8 @@ public class YamlValidateCommand extends CamelCommand {
             if (matchFile(n)) {
                 var report = validator.validate(new File(n));
                 reports.put(n, report);
+            } else {
+                printer().println("WARN: Skipping non-YAML file: " + n);
             }
         }
 
@@ -105,9 +107,7 @@ public class YamlValidateCommand extends CamelCommand {
     private static int errorCounts(Map<String, List<Error>> reports) {
         int count = 0;
         for (List<Error> list : reports.values()) {
-            if (!list.isEmpty()) {
-                count++;
-            }
+            count += list.size();
         }
         return count;
     }

Reply via email to