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; }
