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&lt;T&gt; 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);

Reply via email to