This is an automated email from the ASF dual-hosted git repository. tsato pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
commit 16fd8cf65b46e0703dbe99d3ce4efb5eab5b4edb Author: Tadayoshi Sato <sato.tadayo...@gmail.com> AuthorDate: Sun Nov 13 21:49:11 2022 +0900 CAMEL-18716: camel-jbang - Provide completion for positional file path parameters --- .../dsl/jbang/core/commands/CamelCommand.java | 19 ++++++++++++++++ .../apache/camel/dsl/jbang/core/commands/Pipe.java | 16 ++++++++++++- .../apache/camel/dsl/jbang/core/commands/Run.java | 26 +++++++++++++++++----- 3 files changed, 55 insertions(+), 6 deletions(-) diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelCommand.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelCommand.java index acc543d0d41..ef5e1b44b67 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelCommand.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelCommand.java @@ -17,9 +17,14 @@ package org.apache.camel.dsl.jbang.core.commands; import java.io.File; +import java.util.Stack; import java.util.concurrent.Callable; import picocli.CommandLine; +import picocli.CommandLine.IParameterConsumer; +import picocli.CommandLine.Model.ArgSpec; +import picocli.CommandLine.Model.CommandSpec; +import picocli.CommandLine.ParameterException; public abstract class CamelCommand implements Callable<Integer> { @@ -63,4 +68,18 @@ public abstract class CamelCommand implements Callable<Integer> { return new File(camelDir, pid + "-output.json"); } + protected abstract static class ParameterConsumer<T> implements IParameterConsumer { + + @Override + public void consumeParameters(Stack<String> args, ArgSpec argSpec, CommandSpec cmdSpec) { + if (args.isEmpty()) { + throw new ParameterException(cmdSpec.commandLine(), "Error: missing required parameter"); + } + T cmd = (T) cmdSpec.userObject(); + doConsumeParameters(args, cmd); + } + + protected abstract void doConsumeParameters(Stack<String> args, T cmd); + } + } diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Pipe.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Pipe.java index 247e84ff776..abe17f93f17 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Pipe.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Pipe.java @@ -16,12 +16,18 @@ */ package org.apache.camel.dsl.jbang.core.commands; +import java.nio.file.Path; +import java.util.Stack; + import picocli.CommandLine; @CommandLine.Command(name = "pipe", description = "Run Camel integration in pipe and filters mode for terminal scripting") class Pipe extends CamelCommand { - @CommandLine.Parameters(description = "Name of file", arity = "1") + @CommandLine.Parameters(description = "Name of file", arity = "1", + paramLabel = "<file>", parameterConsumer = FileConsumer.class) + Path filePath; // Defined only for file path completion; the field never used + String file; @CommandLine.Option(names = { "--max-messages" }, defaultValue = "0", @@ -73,4 +79,12 @@ class Pipe extends CamelCommand { return run.runPipe(file); } + static class FileConsumer extends ParameterConsumer<Pipe> { + @Override + protected void doConsumeParameters(Stack<String> args, Pipe cmd) { + String arg = args.pop(); + cmd.file = arg; + } + } + } 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 59fec3a3f41..5ba66c71262 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 @@ -27,6 +27,7 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.FileSystems; import java.nio.file.Files; +import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; @@ -35,6 +36,7 @@ import java.util.List; import java.util.Locale; import java.util.Properties; import java.util.Set; +import java.util.Stack; import java.util.StringJoiner; import java.util.function.Supplier; import java.util.regex.Matcher; @@ -90,7 +92,9 @@ class Run extends CamelCommand { //CHECKSTYLE:OFF @Parameters(description = "The Camel file(s) to run. If no files specified then application.properties is used as source for which files to run.", - arity = "0..9") + arity = "0..9", paramLabel = "<files>", parameterConsumer = FilesConsumer.class) + Path[] filePaths; // Defined only for file path completion; the field never used + String[] files; @Option(names = { "--profile" }, scope = CommandLine.ScopeType.INHERIT, defaultValue = "application", @@ -101,20 +105,20 @@ class Run extends CamelCommand { "--dep", "--deps" }, description = "Add additional dependencies (Use commas to separate multiple dependencies)") String dependencies; - @Option(names = {"--repos"}, description = "Additional maven repositories for download on-demand (Use commas to separate multiple repositories)") + @Option(names = { "--repos" }, description = "Additional maven repositories for download on-demand (Use commas to separate multiple repositories)") String repos; - @Option(names = {"--maven-settings"}, description = "Optional location of maven setting.xml file to configure servers, repositories, mirrors and proxies." + + @Option(names = { "--maven-settings" }, description = "Optional location of maven setting.xml file to configure servers, repositories, mirrors and proxies." + " If set to \"false\", not even the default ~/.m2/settings.xml will be used.") String mavenSettings; - @Option(names = {"--maven-settings-security"}, description = "Optional location of maven settings-security.xml file to decrypt settings.xml") + @Option(names = { "--maven-settings-security" }, description = "Optional location of maven settings-security.xml file to decrypt settings.xml") String mavenSettingsSecurity; @Option(names = { "--fresh" }, description = "Make sure we use fresh (i.e. non-cached) resources") boolean fresh; - @Option(names = {"--download"}, defaultValue = "true", description = "Whether to allow automatic downloading JAR dependencies (over the internet)") + @Option(names = { "--download" }, defaultValue = "true", description = "Whether to allow automatic downloading JAR dependencies (over the internet)") boolean download = true; @Option(names = { "--name" }, defaultValue = "CamelJBang", description = "The name of the Camel application") @@ -848,4 +852,16 @@ class Run extends CamelCommand { } } + static class FilesConsumer extends ParameterConsumer<Run> { + @Override + protected void doConsumeParameters(Stack<String> args, Run cmd) { + List<String> files = new ArrayList<>(); + while (!args.isEmpty()) { + String arg = args.pop(); + files.add(arg); + } + cmd.files = files.toArray(String[]::new); + } + } + }