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,