Skip to content

Commit c9698e6

Browse files
committed
[CLI-333] org.apache.commons.cli.Option.Builder implements
Supplier<Option>
1 parent 4e0cdd0 commit c9698e6

19 files changed

+384
-390
lines changed

src/changes/changes.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@
4141
<action type="add" issue="CLI-339" dev="ggregory" due-to="Claude Warren, Gary Gregory">Help formatter extension in the new package #314.</action>
4242
<action type="add" dev="ggregory" due-to="Gary Gregory">CommandLine.Builder implements Supplier&lt;CommandLine&gt;.</action>
4343
<action type="add" dev="ggregory" due-to="Gary Gregory">DefaultParser.Builder implements Supplier&lt;DefaultParser&gt;.</action>
44-
<action type="add" issue="CLI-340" dev="ggregory" due-to="Claude Warren, Gary Gregory">Add CommandLine.getParsedOptionValues() #334.</action>
44+
<action type="add" issue="CLI-340" dev="ggregory" due-to="Claude Warren, Gary Gregory">Add CommandLine.getParsedOptionValues() #334.</action>
45+
<action type="add" issue="CLI-333" dev="ggregory" due-to="Claude Warren, Gary Gregory">org.apache.commons.cli.Option.Builder implements Supplier&lt;Option&gt;.</action>
4546
<!-- UPDATE -->
4647
<action type="update" dev="ggregory" due-to="Gary Gregory, Dependabot">Bump org.apache.commons:commons-parent from 72 to 85 #302, #304, #310, #315, #320, #327, #371.</action>
4748
<action type="update" dev="ggregory" due-to="Gary Gregory, Dependabot">[test] Bump commons-io:commons-io from 2.16.1 to 2.20.0 #309, #337.</action>

src/main/java/org/apache/commons/cli/Option.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ Licensed to the Apache Software Foundation (ASF) under one or more
2323
import java.util.ArrayList;
2424
import java.util.List;
2525
import java.util.Objects;
26+
import java.util.function.Supplier;
2627

2728
/**
2829
* Describes a single command-line option. It maintains information regarding the short-name of the option, the long-name, if any exists, a flag indicating if
@@ -51,7 +52,7 @@ public class Option implements Cloneable, Serializable {
5152
*
5253
* @since 1.3
5354
*/
54-
public static final class Builder {
55+
public static final class Builder implements Supplier<Option> {
5556

5657
/** The default type. */
5758
private static final Class<String> DEFAULT_TYPE = String.class;
@@ -128,8 +129,20 @@ public Builder argName(final String argName) {
128129
*
129130
* @return the new {@link Option}.
130131
* @throws IllegalArgumentException if neither {@code opt} or {@code longOpt} has been set.
132+
* @deprecated Use {@link #get()}.
131133
*/
134+
@Deprecated
132135
public Option build() {
136+
return get();
137+
}
138+
139+
/**
140+
* Constructs an Option with the values declared by this {@link Builder}.
141+
*
142+
* @return the new {@link Option}.
143+
* @throws IllegalArgumentException if neither {@code opt} or {@code longOpt} has been set.
144+
*/
145+
public Option get() {
133146
if (option == null && longOption == null) {
134147
throw new IllegalArgumentException("Either opt or longOpt must be specified");
135148
}

src/main/java/org/apache/commons/cli/PatternOptionBuilder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ public static Options parsePattern(final String pattern) {
191191
.required(required)
192192
.type(type)
193193
.converter(converter)
194-
.build();
194+
.get();
195195
// @formatter:on
196196
// we have a previous one to deal with
197197
options.addOption(option);
@@ -213,7 +213,7 @@ public static Options parsePattern(final String pattern) {
213213
}
214214

215215
if (opt != Char.SP) {
216-
final Option option = Option.builder(String.valueOf(opt)).hasArg(type != null).required(required).type(type).build();
216+
final Option option = Option.builder(String.valueOf(opt)).hasArg(type != null).required(required).type(type).get();
217217

218218
// we have a final one to deal with
219219
options.addOption(option);

src/test/java/org/apache/commons/cli/AbstractParserTestCase.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,8 @@ void testAmbiguousLongWithoutEqualSingleDash() throws Exception {
8787
void testAmbiguousLongWithoutEqualSingleDash2() throws Exception {
8888
final String[] args = { "-b", "-foobar" };
8989
final Options options = new Options();
90-
options.addOption(Option.builder().longOpt("foo").option("f").optionalArg(true).build());
91-
options.addOption(Option.builder().longOpt("bar").option("b").optionalArg(false).build());
90+
options.addOption(Option.builder().longOpt("foo").option("f").optionalArg(true).get());
91+
options.addOption(Option.builder().longOpt("bar").option("b").optionalArg(false).get());
9292
final CommandLine cl = parser.parse(options, args);
9393
assertTrue(cl.hasOption("b"));
9494
assertTrue(cl.hasOption("f"));
@@ -380,7 +380,7 @@ void testOptionalArgsOptionBuilder() throws Exception {
380380
@Test
381381
void testOptionalArgsOptionDotBuilder() throws Exception {
382382
final Options options = new Options();
383-
options.addOption(Option.builder("i").numberOfArgs(2).optionalArg(true).build());
383+
options.addOption(Option.builder("i").numberOfArgs(2).optionalArg(true).get());
384384
final Properties properties = new Properties();
385385

386386
CommandLine cmd = parse(parser, options, new String[] { "-i" }, properties);
@@ -400,7 +400,7 @@ void testOptionalArgsOptionDotBuilder() throws Exception {
400400
assertArrayEquals(new String[] { "paper", "scissors" }, cmd.getOptionValues("i"));
401401
assertArrayEquals(new String[] { "rock" }, cmd.getArgs());
402402

403-
options.addOption(Option.builder("j").numberOfArgs(3).optionalArg(true).build());
403+
options.addOption(Option.builder("j").numberOfArgs(3).optionalArg(true).get());
404404
cmd = parse(parser, options, new String[] { "-j" }, properties);
405405
}
406406

src/test/java/org/apache/commons/cli/CommandLineTest.java

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ private enum Count { ONE, TWO, THREE }
4343

4444
private static Stream<Arguments> createHasOptionParameters() throws ParseException {
4545
final List<Arguments> lst = new ArrayList<>();
46-
final Option optT = Option.builder().option("T").longOpt("tee").deprecated().optionalArg(true).build();
47-
final Option optU = Option.builder("U").longOpt("you").optionalArg(true).build();
46+
final Option optT = Option.builder().option("T").longOpt("tee").deprecated().optionalArg(true).get();
47+
final Option optU = Option.builder("U").longOpt("you").optionalArg(true).get();
4848
final OptionGroup optionGroup = new OptionGroup().addOption(optT).addOption(optU);
4949

5050
final String[] foobar = { "foo", "bar" };
@@ -75,8 +75,8 @@ private static Stream<Arguments> createHasOptionParameters() throws ParseExcepti
7575

7676
private static Stream<Arguments> createOptionValueParameters() throws ParseException {
7777
final List<Arguments> lst = new ArrayList<>();
78-
final Option optT = Option.builder().option("T").longOpt("tee").deprecated().optionalArg(true).build();
79-
final Option optU = Option.builder("U").longOpt("you").optionalArg(true).build();
78+
final Option optT = Option.builder().option("T").longOpt("tee").deprecated().optionalArg(true).get();
79+
final Option optU = Option.builder("U").longOpt("you").optionalArg(true).get();
8080
final OptionGroup optionGroup = new OptionGroup().addOption(optT).addOption(optU);
8181

8282
// T set
@@ -106,8 +106,8 @@ private static Stream<Arguments> createOptionValueParameters() throws ParseExcep
106106

107107
private static Stream<Arguments> createOptionValuesParameters() throws ParseException {
108108
final List<Arguments> lst = new ArrayList<>();
109-
final Option optT = Option.builder().option("T").longOpt("tee").numberOfArgs(2).deprecated().optionalArg(true).build();
110-
final Option optU = Option.builder("U").longOpt("you").numberOfArgs(2).optionalArg(true).build();
109+
final Option optT = Option.builder().option("T").longOpt("tee").numberOfArgs(2).deprecated().optionalArg(true).get();
110+
final Option optU = Option.builder("U").longOpt("you").numberOfArgs(2).optionalArg(true).get();
111111
final OptionGroup optionGroup = new OptionGroup().addOption(optT).addOption(optU);
112112

113113
final String[] foobar = { "foo", "bar" };
@@ -138,8 +138,8 @@ private static Stream<Arguments> createOptionValuesParameters() throws ParseExce
138138

139139
private static Stream<Arguments> createParsedOptionValueParameters() throws ParseException {
140140
final List<Arguments> lst = new ArrayList<>();
141-
final Option optT = Option.builder().option("T").longOpt("tee").deprecated().type(Integer.class).optionalArg(true).build();
142-
final Option optU = Option.builder("U").longOpt("you").type(Integer.class).optionalArg(true).build();
141+
final Option optT = Option.builder().option("T").longOpt("tee").deprecated().type(Integer.class).optionalArg(true).get();
142+
final Option optU = Option.builder("U").longOpt("you").type(Integer.class).optionalArg(true).get();
143143
final OptionGroup optionGroup = new OptionGroup().addOption(optT).addOption(optU);
144144
final Integer expected = Integer.valueOf(1);
145145

@@ -170,8 +170,8 @@ private static Stream<Arguments> createParsedOptionValueParameters() throws Pars
170170

171171
private static Stream<Arguments> createParsedOptionValuesParameters() throws ParseException {
172172
final List<Arguments> lst = new ArrayList<>();
173-
final Option optT = Option.builder().option("T").longOpt("tee").deprecated().type(Integer.class).optionalArg(true).hasArgs().build();
174-
final Option optU = Option.builder("U").longOpt("you").type(Integer.class).optionalArg(true).hasArgs().build();
173+
final Option optT = Option.builder().option("T").longOpt("tee").deprecated().type(Integer.class).optionalArg(true).hasArgs().get();
174+
final Option optU = Option.builder("U").longOpt("you").type(Integer.class).optionalArg(true).hasArgs().get();
175175
final OptionGroup optionGroup = new OptionGroup().addOption(optT).addOption(optU);
176176
final Integer[] expected = {1, 2};
177177

@@ -234,8 +234,8 @@ void checkHandler(final boolean optDep, final List<Option> handler, final Option
234234
void testBadGetParsedOptionValue() throws Exception {
235235

236236
final Options options = new Options();
237-
options.addOption(Option.builder("i").hasArg().type(Number.class).build());
238-
options.addOption(Option.builder("c").hasArg().converter(s -> Count.valueOf(s.toUpperCase())).build());
237+
options.addOption(Option.builder("i").hasArg().type(Number.class).get());
238+
options.addOption(Option.builder("c").hasArg().converter(s -> Count.valueOf(s.toUpperCase())).get());
239239

240240
final CommandLineParser parser = new DefaultParser();
241241
final CommandLine cmd = parser.parse(options, new String[] {"-i", "foo", "-c", "bar"});
@@ -250,7 +250,7 @@ void testBuilderBuild() {
250250
final CommandLine cmd = CommandLine.builder()
251251
.addArg("foo")
252252
.addArg("bar")
253-
.addOption(Option.builder("T").build())
253+
.addOption(Option.builder("T").get())
254254
.build();
255255
// @formatter:on
256256
assertEquals("foo", cmd.getArgs()[0]);
@@ -264,7 +264,7 @@ void testBuilderGet() {
264264
final CommandLine cmd = CommandLine.builder()
265265
.addArg("foo")
266266
.addArg("bar")
267-
.addOption(Option.builder("T").build())
267+
.addOption(Option.builder("T").get())
268268
.get();
269269
// @formatter:on
270270
assertEquals("foo", cmd.getArgs()[0]);
@@ -276,7 +276,7 @@ void testBuilderGet() {
276276
void testBuilderNullArgs() {
277277
final CommandLine.Builder builder = CommandLine.builder();
278278
builder.addArg(null).addArg(null);
279-
builder.addOption(Option.builder("T").build());
279+
builder.addOption(Option.builder("T").get());
280280
final CommandLine cmd = builder.build();
281281

282282
assertEquals(0, cmd.getArgs().length);
@@ -302,8 +302,8 @@ void testGetOptionProperties() throws Exception {
302302
final String[] args = {"-Dparam1=value1", "-Dparam2=value2", "-Dparam3", "-Dparam4=value4", "-D", "--property", "foo=bar"};
303303

304304
final Options options = new Options();
305-
options.addOption(Option.builder("D").valueSeparator().optionalArg(true).numberOfArgs(2).build());
306-
options.addOption(Option.builder().valueSeparator().numberOfArgs(2).longOpt("property").build());
305+
options.addOption(Option.builder("D").valueSeparator().optionalArg(true).numberOfArgs(2).get());
306+
options.addOption(Option.builder().valueSeparator().numberOfArgs(2).longOpt("property").get());
307307

308308
final Parser parser = new GnuParser();
309309
final CommandLine cl = parser.parse(options, args);
@@ -324,8 +324,8 @@ void testGetOptionPropertiesWithOption() throws Exception {
324324
final String[] args = {"-Dparam1=value1", "-Dparam2=value2", "-Dparam3", "-Dparam4=value4", "-D", "--property", "foo=bar"};
325325

326326
final Options options = new Options();
327-
final Option optionD = Option.builder("D").valueSeparator().numberOfArgs(2).optionalArg(true).build();
328-
final Option optionProperty = Option.builder().valueSeparator().numberOfArgs(2).longOpt("property").build();
327+
final Option optionD = Option.builder("D").valueSeparator().numberOfArgs(2).optionalArg(true).get();
328+
final Option optionProperty = Option.builder().valueSeparator().numberOfArgs(2).longOpt("property").get();
329329
options.addOption(optionD);
330330
options.addOption(optionProperty);
331331

@@ -392,8 +392,8 @@ void testGetOptionValue(final String[] args, final Option opt, final OptionGroup
392392
final List<Option> handler = new ArrayList<>();
393393
final CommandLine commandLine = DefaultParser.builder().setDeprecatedHandler(handler::add).get().parse(options, args);
394394
final Supplier<String> thinger = () -> "thing";
395-
final OptionGroup otherGroup = new OptionGroup().addOption(Option.builder("o").longOpt("other").hasArg().build())
396-
.addOption(Option.builder().option("p").longOpt("part").hasArg().build());
395+
final OptionGroup otherGroup = new OptionGroup().addOption(Option.builder("o").longOpt("other").hasArg().get())
396+
.addOption(Option.builder().option("p").longOpt("part").hasArg().get());
397397
final OptionGroup nullGroup = null;
398398

399399
// test char option
@@ -497,8 +497,8 @@ void testGetOptionValues(final String[] args, final Option opt, final OptionGrou
497497
final Options options = new Options().addOptionGroup(optionGroup);
498498
final List<Option> handler = new ArrayList<>();
499499
final CommandLine commandLine = DefaultParser.builder().setDeprecatedHandler(handler::add).get().parse(options, args);
500-
final OptionGroup otherGroup = new OptionGroup().addOption(Option.builder("o").longOpt("other").hasArg().build())
501-
.addOption(Option.builder().option("p").longOpt("part").hasArg().build());
500+
final OptionGroup otherGroup = new OptionGroup().addOption(Option.builder("o").longOpt("other").hasArg().get())
501+
.addOption(Option.builder().option("p").longOpt("part").hasArg().get());
502502
final OptionGroup nullGroup = null;
503503

504504
// test char option arg
@@ -542,8 +542,8 @@ void testGetParsedOptionValue(final String[] args, final Option opt, final Optio
542542
final List<Option> handler = new ArrayList<>();
543543
final CommandLine commandLine = DefaultParser.builder().setDeprecatedHandler(handler::add).get().parse(options, args);
544544
final Supplier<Integer> thinger = () -> 2;
545-
final OptionGroup otherGroup = new OptionGroup().addOption(Option.builder("o").longOpt("other").hasArg().build())
546-
.addOption(Option.builder().option("p").longOpt("part").hasArg().build());
545+
final OptionGroup otherGroup = new OptionGroup().addOption(Option.builder("o").longOpt("other").hasArg().get())
546+
.addOption(Option.builder().option("p").longOpt("part").hasArg().get());
547547
final OptionGroup nullGroup = null;
548548
final Integer thing = 2;
549549

@@ -636,8 +636,8 @@ void testGetParsedOptionValues(final String[] args, final Option opt, final Opti
636636
final List<Option> handler = new ArrayList<>();
637637
final CommandLine commandLine = DefaultParser.builder().setDeprecatedHandler(handler::add).get().parse(options, args);
638638
final Supplier<Integer[]> thinger = () -> new Integer[]{2, 3};
639-
final OptionGroup otherGroup = new OptionGroup().addOption(Option.builder("o").longOpt("other").hasArg().build())
640-
.addOption(Option.builder().option("p").longOpt("part").hasArg().build());
639+
final OptionGroup otherGroup = new OptionGroup().addOption(Option.builder("o").longOpt("other").hasArg().get())
640+
.addOption(Option.builder().option("p").longOpt("part").hasArg().get());
641641
final OptionGroup nullGroup = null;
642642
final Integer[] thing = {2, 3};
643643

@@ -741,8 +741,8 @@ void testHasOption(final String[] args, final Option opt, final OptionGroup opti
741741
final Options options = new Options().addOptionGroup(optionGroup);
742742
final List<Option> handler = new ArrayList<>();
743743
final CommandLine commandLine = DefaultParser.builder().setDeprecatedHandler(handler::add).get().parse(options, args);
744-
final OptionGroup otherGroup = new OptionGroup().addOption(Option.builder("o").longOpt("other").hasArg().build())
745-
.addOption(Option.builder().option("p").longOpt("part").hasArg().build());
744+
final OptionGroup otherGroup = new OptionGroup().addOption(Option.builder("o").longOpt("other").hasArg().get())
745+
.addOption(Option.builder().option("p").longOpt("part").hasArg().get());
746746
final OptionGroup nullGroup = null;
747747

748748
// test char option arg
@@ -893,8 +893,8 @@ void testNoDeprecationHandler(final String[] args, final Option opt, final Optio
893893
try {
894894
System.setOut(new PrintStream(baos));
895895

896-
final OptionGroup otherGroup = new OptionGroup().addOption(Option.builder("o").longOpt("other").hasArg().build())
897-
.addOption(Option.builder().option("p").longOpt("part").hasArg().build());
896+
final OptionGroup otherGroup = new OptionGroup().addOption(Option.builder("o").longOpt("other").hasArg().get())
897+
.addOption(Option.builder().option("p").longOpt("part").hasArg().get());
898898
final OptionGroup nullGroup = null;
899899

900900
// test char option
@@ -1008,8 +1008,8 @@ void testNoDeprecationHandler(final String[] args, final Option opt, final Optio
10081008
@Test
10091009
void testNullOption() throws Exception {
10101010
final Options options = new Options();
1011-
final Option optI = Option.builder("i").hasArg().type(Number.class).build();
1012-
final Option optF = Option.builder("f").hasArg().build();
1011+
final Option optI = Option.builder("i").hasArg().type(Number.class).get();
1012+
final Option optF = Option.builder("f").hasArg().get();
10131013
options.addOption(optI);
10141014
options.addOption(optF);
10151015
final CommandLineParser parser = new DefaultParser();

0 commit comments

Comments
 (0)