This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-cli.git
commit 81f7c1ea59354e547deafda9e7c71e1365f8566a Author: Gary Gregory <garydgreg...@gmail.com> AuthorDate: Tue Mar 26 13:17:09 2024 -0400 Add builder factory CommandLine#builder() --- src/changes/changes.xml | 1 + .../java/org/apache/commons/cli/CommandLine.java | 44 +++++++++++++++++----- .../java/org/apache/commons/cli/DefaultParser.java | 2 +- src/main/java/org/apache/commons/cli/Parser.java | 2 +- .../org/apache/commons/cli/CommandLineTest.java | 15 +++++++- 5 files changed, 51 insertions(+), 13 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 989c1ed..9310960 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -36,6 +36,7 @@ <action type="add" issue="CLI-324" dev="ggregory" due-to="Claude Warren, Gary Gregory">Make adding OptionGroups and Options to existing Options easier #230.</action> <action type="add" issue="CLI-323" dev="ggregory" due-to="Claude Warren, Gary Gregory">Added Supplier<T> defaults for getParsedOptionValue #229.</action> <action type="add" issue="CLI-326" dev="ggregory" due-to="Claude Warren, Gary Gregory">Make Option.getKey() public #239.</action> + <action type="add" dev="ggregory" due-to="Claude Warren, Gary Gregory">Add builder factory CommandLine#builder().</action> <!-- UPDATE --> <action type="update" dev="ggregory" due-to="Gary Gregory">Bump commons-parent from 64 to 67.</action> <action type="update" dev="ggregory" due-to="Elric, Gary Gregory">Update the tests to JUnit 5 #238.</action> diff --git a/src/main/java/org/apache/commons/cli/CommandLine.java b/src/main/java/org/apache/commons/cli/CommandLine.java index 6c14733..bbcc540 100644 --- a/src/main/java/org/apache/commons/cli/CommandLine.java +++ b/src/main/java/org/apache/commons/cli/CommandLine.java @@ -24,6 +24,7 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import java.util.Objects; import java.util.Properties; import java.util.function.Supplier; @@ -46,10 +47,11 @@ public class CommandLine implements Serializable { */ public static final class Builder { - /** - * CommandLine that is being build by this Builder. - */ - private final CommandLine commandLine = new CommandLine(); + /** The unrecognized options/arguments */ + private final List<String> args = new LinkedList<>(); + + /** The processed options */ + private final List<Option> options = new ArrayList<>(); /** * Adds left-over unrecognized option/argument. @@ -59,7 +61,9 @@ public class CommandLine implements Serializable { * @return this Builder instance for method chaining. */ public Builder addArg(final String arg) { - commandLine.addArg(arg); + if (arg != null) { + args.add(arg); + } return this; } @@ -71,7 +75,9 @@ public class CommandLine implements Serializable { * @return this Builder instance for method chaining. */ public Builder addOption(final Option opt) { - commandLine.addOption(opt); + if (opt != null) { + options.add(opt); + } return this; } @@ -81,24 +87,42 @@ public class CommandLine implements Serializable { * @return the new instance. */ public CommandLine build() { - return commandLine; + return new CommandLine(args, options); } } + /** + * Creates a new builder. + * + * @return a new builder. + * @since 1.7.0 + */ + public static Builder builder() { + return new Builder(); + } + /** The serial version UID. */ private static final long serialVersionUID = 1L; /** The unrecognized options/arguments */ - private final List<String> args = new LinkedList<>(); + private final List<String> args; /** The processed options */ - private final List<Option> options = new ArrayList<>(); + private final List<Option> options; /** * Creates a command line. */ protected CommandLine() { - // nothing to do + this(new LinkedList<>(), new ArrayList<>()); + } + + /** + * Creates a command line. + */ + private CommandLine(final List<String> args, final List<Option> options) { + this.args = Objects.requireNonNull(args, "args"); + this.options = Objects.requireNonNull(options, "options"); } /** diff --git a/src/main/java/org/apache/commons/cli/DefaultParser.java b/src/main/java/org/apache/commons/cli/DefaultParser.java index fe0f92c..077a1a6 100644 --- a/src/main/java/org/apache/commons/cli/DefaultParser.java +++ b/src/main/java/org/apache/commons/cli/DefaultParser.java @@ -677,7 +677,7 @@ public class DefaultParser implements CommandLineParser { group.setSelected(null); } - cmd = new CommandLine(); + cmd = CommandLine.builder().build(); if (arguments != null) { for (final String argument : arguments) { diff --git a/src/main/java/org/apache/commons/cli/Parser.java b/src/main/java/org/apache/commons/cli/Parser.java index b3b5510..c76e68c 100644 --- a/src/main/java/org/apache/commons/cli/Parser.java +++ b/src/main/java/org/apache/commons/cli/Parser.java @@ -156,7 +156,7 @@ public abstract class Parser implements CommandLineParser { // initialize members setOptions(options); - cmd = new CommandLine(); + cmd = CommandLine.builder().build(); boolean eatTheRest = false; diff --git a/src/test/java/org/apache/commons/cli/CommandLineTest.java b/src/test/java/org/apache/commons/cli/CommandLineTest.java index 5d12c00..32f3fad 100644 --- a/src/test/java/org/apache/commons/cli/CommandLineTest.java +++ b/src/test/java/org/apache/commons/cli/CommandLineTest.java @@ -113,7 +113,20 @@ public class CommandLineTest { } @Test - public void testGetOptions() { + public void testGetOptionsBuilder() { + final CommandLine cmd = CommandLine.builder().build(); + assertNotNull(cmd.getOptions()); + assertEquals(0, cmd.getOptions().length); + + cmd.addOption(new Option("a", null)); + cmd.addOption(new Option("b", null)); + cmd.addOption(new Option("c", null)); + + assertEquals(3, cmd.getOptions().length); + } + + @Test + public void testGetOptionsCtor() { final CommandLine cmd = new CommandLine(); assertNotNull(cmd.getOptions()); assertEquals(0, cmd.getOptions().length);