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 2026/07/10 21:09:28 UTC
(camel) 04/07: chore: fix bugs in CLI edit, generate, test, and validate plugins
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 <cl...@gmail.com>
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 <no...@anthropic.com>
Signed-off-by: Claus Ibsen <cl...@gmail.com>
---
.../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;
}