You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by tn...@apache.org on 2013/02/17 12:11:06 UTC
svn commit: r1447005 - in /commons/proper/cli/trunk/src:
main/java/org/apache/commons/cli/ test/java/org/apache/commons/cli/
Author: tn
Date: Sun Feb 17 11:11:06 2013
New Revision: 1447005
URL: http://svn.apache.org/r1447005
Log:
[CLI-224] Add static builder methods to Option, check if at least one of opt/longOpt has been specified, update javadoc.
Modified:
commons/proper/cli/trunk/src/main/java/org/apache/commons/cli/Option.java
commons/proper/cli/trunk/src/main/java/org/apache/commons/cli/OptionBuilder.java
commons/proper/cli/trunk/src/main/java/org/apache/commons/cli/PatternOptionBuilder.java
commons/proper/cli/trunk/src/test/java/org/apache/commons/cli/OptionTest.java
Modified: commons/proper/cli/trunk/src/main/java/org/apache/commons/cli/Option.java
URL: http://svn.apache.org/viewvc/commons/proper/cli/trunk/src/main/java/org/apache/commons/cli/Option.java?rev=1447005&r1=1447004&r2=1447005&view=diff
==============================================================================
--- commons/proper/cli/trunk/src/main/java/org/apache/commons/cli/Option.java (original)
+++ commons/proper/cli/trunk/src/main/java/org/apache/commons/cli/Option.java Sun Feb 17 11:11:06 2013
@@ -28,7 +28,8 @@ import java.util.List;
* this option, and a self-documenting description of the option.
* <p>
* An Option is not created independently, but is created through
- * an instance of {@link Options}.
+ * an instance of {@link Options}. An Option is required to have
+ * at least a short or a long-name.
* <p>
* <b>Note:</b> once an {@link Option} has been added to an instance
* of {@link Options}, it's required flag may not be changed anymore.
@@ -751,12 +752,38 @@ public class Option implements Cloneable
}
/**
+ * Returns a {@link Builder} to create an {@link Option} using descriptive
+ * methods.
+ *
+ * @return a new {@link Builder} instance
+ * @since 1.3
+ */
+ public static Builder builder()
+ {
+ return builder(null);
+ }
+
+ /**
+ * Returns a {@link Builder} to create an {@link Option} using descriptive
+ * methods.
+ *
+ * @param opt short representation of the option
+ * @return a new {@link Builder} instance
+ * @throws IllegalArgumentException if there are any non valid Option characters in {@code opt}
+ * @since 1.3
+ */
+ public static Builder builder(final String opt)
+ {
+ return new Builder(opt);
+ }
+
+ /**
* A nested builder class to create <code>Option</code> instances
* using descriptive methods.
* <p>
* Example usage:
* <pre>
- * Option option = new Option.Builder("a", "Long description")
+ * Option option = Option.builder("a")
* .required(true)
* .longOpt("arg-name")
* .build();
@@ -764,13 +791,13 @@ public class Option implements Cloneable
*
* @since 1.3
*/
- public static class Builder
+ public static final class Builder
{
/** the name of the option */
private final String opt;
/** description of the option */
- private final String description;
+ private String description;
/** the long representation of the option */
private String longOpt;
@@ -794,28 +821,16 @@ public class Option implements Cloneable
private char valuesep;
/**
- * Constructs a new <code>Builder</code>.
- */
- public Builder()
- {
- this(null, null);
- }
-
- /**
* Constructs a new <code>Builder</code> with the minimum
* required parameters for an <code>Option</code> instance.
*
* @param opt short representation of the option
- * @param description describes the function of the option
- * @throws IllegalArgumentException if there are any non valid
- * Option characters in <code>opt</code>.
+ * @throws IllegalArgumentException if there are any non valid Option characters in {@code opt}
*/
- public Builder(final String opt, final String description)
- throws IllegalArgumentException
+ private Builder(final String opt) throws IllegalArgumentException
{
OptionValidator.validateOption(opt);
this.opt = opt;
- this.description = description;
}
/**
@@ -829,7 +844,19 @@ public class Option implements Cloneable
this.argName = argName;
return this;
}
-
+
+ /**
+ * Sets the description for this option.
+ *
+ * @param description the description of the option.
+ * @return this builder, to allow method chaining
+ */
+ public Builder desc(final String description)
+ {
+ this.description = description;
+ return this;
+ }
+
/**
* Sets the long name of the Option.
*
@@ -918,12 +945,17 @@ public class Option implements Cloneable
}
/**
- * Constructs an Option.
+ * Constructs an Option with the values declared by this {@link Builder}.
*
- * @return the new Option
+ * @return the new {@link Option}
+ * @throws IllegalArgumentException if neither {@code opt} or {@code longOpt} has been set
*/
public Option build()
{
+ if (opt == null && longOpt == null)
+ {
+ throw new IllegalArgumentException("Either opt or longOpt must be specified");
+ }
return new Option(this);
}
}
Modified: commons/proper/cli/trunk/src/main/java/org/apache/commons/cli/OptionBuilder.java
URL: http://svn.apache.org/viewvc/commons/proper/cli/trunk/src/main/java/org/apache/commons/cli/OptionBuilder.java?rev=1447005&r1=1447004&r2=1447005&view=diff
==============================================================================
--- commons/proper/cli/trunk/src/main/java/org/apache/commons/cli/OptionBuilder.java (original)
+++ commons/proper/cli/trunk/src/main/java/org/apache/commons/cli/OptionBuilder.java Sun Feb 17 11:11:06 2013
@@ -27,7 +27,7 @@ package org.apache.commons.cli;
*
* @version $Id$
* @since 1.0
- * @deprecated since 1.3, use {@link Option.Builder} instead
+ * @deprecated since 1.3, use {@link Option.builder(String)} instead
*/
@Deprecated
public final class OptionBuilder
Modified: commons/proper/cli/trunk/src/main/java/org/apache/commons/cli/PatternOptionBuilder.java
URL: http://svn.apache.org/viewvc/commons/proper/cli/trunk/src/main/java/org/apache/commons/cli/PatternOptionBuilder.java?rev=1447005&r1=1447004&r2=1447005&view=diff
==============================================================================
--- commons/proper/cli/trunk/src/main/java/org/apache/commons/cli/PatternOptionBuilder.java (original)
+++ commons/proper/cli/trunk/src/main/java/org/apache/commons/cli/PatternOptionBuilder.java Sun Feb 17 11:11:06 2013
@@ -160,7 +160,7 @@ public class PatternOptionBuilder
{
if (opt != ' ')
{
- final Option option = new Option.Builder(String.valueOf(opt), null)
+ final Option option = Option.builder(String.valueOf(opt))
.hasArg(type != null)
.required(required)
.type(type)
@@ -187,7 +187,7 @@ public class PatternOptionBuilder
if (opt != ' ')
{
- final Option option = new Option.Builder(String.valueOf(opt), null)
+ final Option option = Option.builder(String.valueOf(opt))
.hasArg(type != null)
.required(required)
.type(type)
Modified: commons/proper/cli/trunk/src/test/java/org/apache/commons/cli/OptionTest.java
URL: http://svn.apache.org/viewvc/commons/proper/cli/trunk/src/test/java/org/apache/commons/cli/OptionTest.java?rev=1447005&r1=1447004&r2=1447005&view=diff
==============================================================================
--- commons/proper/cli/trunk/src/test/java/org/apache/commons/cli/OptionTest.java (original)
+++ commons/proper/cli/trunk/src/test/java/org/apache/commons/cli/OptionTest.java Sun Feb 17 11:11:06 2013
@@ -153,36 +153,48 @@ public class OptionTest
{
char defaultSeparator = (char) 0;
- checkOption(new Option.Builder("a", "desc").build(),
+ checkOption(Option.builder("a").desc("desc").build(),
"a", "desc", null, Option.UNINITIALIZED, null, false, false, defaultSeparator, String.class);
- checkOption(new Option.Builder("a", "desc").build(),
+ checkOption(Option.builder("a").desc("desc").build(),
"a", "desc", null, Option.UNINITIALIZED, null, false, false, defaultSeparator, String.class);
- checkOption(new Option.Builder("a", "desc").longOpt("aaa").build(),
+ checkOption(Option.builder("a").desc("desc").longOpt("aaa").build(),
"a", "desc", "aaa", Option.UNINITIALIZED, null, false, false, defaultSeparator, String.class);
- checkOption(new Option.Builder("a", "desc").hasArg(true).build(),
+ checkOption(Option.builder("a").desc("desc").hasArg(true).build(),
"a", "desc", null, 1, null, false, false, defaultSeparator, String.class);
- checkOption(new Option.Builder("a", "desc").hasArg(false).build(),
+ checkOption(Option.builder("a").desc("desc").hasArg(false).build(),
"a", "desc", null, Option.UNINITIALIZED, null, false, false, defaultSeparator, String.class);
- checkOption(new Option.Builder("a", "desc").hasArg(true).build(),
+ checkOption(Option.builder("a").desc("desc").hasArg(true).build(),
"a", "desc", null, 1, null, false, false, defaultSeparator, String.class);
- checkOption(new Option.Builder("a", "desc").numberOfArgs(3).build(),
+ checkOption(Option.builder("a").desc("desc").numberOfArgs(3).build(),
"a", "desc", null, 3, null, false, false, defaultSeparator, String.class);
- checkOption(new Option.Builder("a", "desc").required(true).build(),
+ checkOption(Option.builder("a").desc("desc").required(true).build(),
"a", "desc", null, Option.UNINITIALIZED, null, true, false, defaultSeparator, String.class);
- checkOption(new Option.Builder("a", "desc").required(false).build(),
+ checkOption(Option.builder("a").desc("desc").required(false).build(),
"a", "desc", null, Option.UNINITIALIZED, null, false, false, defaultSeparator, String.class);
- checkOption(new Option.Builder("a", "desc").argName("arg1").build(),
+ checkOption(Option.builder("a").desc("desc").argName("arg1").build(),
"a", "desc", null, Option.UNINITIALIZED, "arg1", false, false, defaultSeparator, String.class);
- checkOption(new Option.Builder("a", "desc").optionalArg(false).build(),
+ checkOption(Option.builder("a").desc("desc").optionalArg(false).build(),
"a", "desc", null, Option.UNINITIALIZED, null, false, false, defaultSeparator, String.class);
- checkOption(new Option.Builder("a", "desc").optionalArg(true).build(),
+ checkOption(Option.builder("a").desc("desc").optionalArg(true).build(),
"a", "desc", null, Option.UNINITIALIZED, null, false, true, defaultSeparator, String.class);
- checkOption(new Option.Builder("a", "desc").valueSeparator(':').build(),
+ checkOption(Option.builder("a").desc("desc").valueSeparator(':').build(),
"a", "desc", null, Option.UNINITIALIZED, null, false, false, ':', String.class);
- checkOption(new Option.Builder("a", "desc").type(Integer.class).build(),
+ checkOption(Option.builder("a").desc("desc").type(Integer.class).build(),
"a", "desc", null, Option.UNINITIALIZED, null, false, false, defaultSeparator, Integer.class);
}
+
+ @Test(expected=IllegalArgumentException.class)
+ public void testBuilderInsufficientParams1()
+ {
+ Option.builder().desc("desc").build();
+ }
+
+ @Test(expected=IllegalArgumentException.class)
+ public void testBuilderInsufficientParams2()
+ {
+ Option.builder(null).desc("desc").build();
+ }
private static void checkOption(Option option, String opt, String description, String longOpt, int numArgs,
String argName, boolean required, boolean optionalArg,