You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by oh...@apache.org on 2008/07/24 22:28:17 UTC

svn commit: r679530 - in /commons/proper/cli/trunk/src: java/org/apache/commons/cli2/ java/org/apache/commons/cli2/commandline/ java/org/apache/commons/cli2/option/ test/org/apache/commons/cli2/ test/org/apache/commons/cli2/bug/

Author: oheger
Date: Thu Jul 24 13:28:16 2008
New Revision: 679530

URL: http://svn.apache.org/viewvc?rev=679530&view=rev
Log:
CLI-123: Groups are now added to the command line if any of their child options are found. This makes it possible to test for the presence of a group and also validate minimum and maximum constraints when child groups are involved.

Added:
    commons/proper/cli/trunk/src/test/org/apache/commons/cli2/bug/BugCLI123Test.java   (with props)
Modified:
    commons/proper/cli/trunk/src/java/org/apache/commons/cli2/Option.java
    commons/proper/cli/trunk/src/java/org/apache/commons/cli2/commandline/WriteableCommandLineImpl.java
    commons/proper/cli/trunk/src/java/org/apache/commons/cli2/option/GroupImpl.java
    commons/proper/cli/trunk/src/java/org/apache/commons/cli2/option/OptionImpl.java
    commons/proper/cli/trunk/src/test/org/apache/commons/cli2/CommandLineTestCase.java

Modified: commons/proper/cli/trunk/src/java/org/apache/commons/cli2/Option.java
URL: http://svn.apache.org/viewvc/commons/proper/cli/trunk/src/java/org/apache/commons/cli2/Option.java?rev=679530&r1=679529&r2=679530&view=diff
==============================================================================
--- commons/proper/cli/trunk/src/java/org/apache/commons/cli2/Option.java (original)
+++ commons/proper/cli/trunk/src/java/org/apache/commons/cli2/Option.java Thu Jul 24 13:28:16 2008
@@ -194,4 +194,25 @@
      * @return true iff the CommandLine will be invalid without this Option
      */
     boolean isRequired();
+
+    /**
+     * Returns the parent of this option. Options can be organized in a
+     * hierarchical manner if they are added to groups. This method can be used
+     * for obtaining the parent option of this option. The result may be
+     * <b>null</b> if this option does not have a parent.
+     *
+     * @return the parent of this option
+     */
+    Option getParent();
+
+    /**
+     * Sets the parent of this option. This method is called when the option is
+     * added to a group. Storing the parent of an option makes it possible to
+     * keep track of hierarchical relations between options. For instance, if an
+     * option is identified while parsing a command line, the group this option
+     * belongs to can also be added to the command line.
+     *
+     * @param parent the parent option
+     */
+    void setParent(Option parent);
 }

Modified: commons/proper/cli/trunk/src/java/org/apache/commons/cli2/commandline/WriteableCommandLineImpl.java
URL: http://svn.apache.org/viewvc/commons/proper/cli/trunk/src/java/org/apache/commons/cli2/commandline/WriteableCommandLineImpl.java?rev=679530&r1=679529&r2=679530&view=diff
==============================================================================
--- commons/proper/cli/trunk/src/java/org/apache/commons/cli2/commandline/WriteableCommandLineImpl.java (original)
+++ commons/proper/cli/trunk/src/java/org/apache/commons/cli2/commandline/WriteableCommandLineImpl.java Thu Jul 24 13:28:16 2008
@@ -69,6 +69,13 @@
         for (Iterator i = option.getTriggers().iterator(); i.hasNext();) {
             nameToOption.put(i.next(), option);
         }
+
+        // ensure that all parent options are also added
+        Option parent = option.getParent();
+        while (parent != null && !options.contains(parent)) {
+            options.add(parent);
+            parent = parent.getParent();
+        }
     }
 
     public void addValue(final Option option,

Modified: commons/proper/cli/trunk/src/java/org/apache/commons/cli2/option/GroupImpl.java
URL: http://svn.apache.org/viewvc/commons/proper/cli/trunk/src/java/org/apache/commons/cli2/option/GroupImpl.java?rev=679530&r1=679529&r2=679530&view=diff
==============================================================================
--- commons/proper/cli/trunk/src/java/org/apache/commons/cli2/option/GroupImpl.java (original)
+++ commons/proper/cli/trunk/src/java/org/apache/commons/cli2/option/GroupImpl.java Thu Jul 24 13:28:16 2008
@@ -89,6 +89,7 @@
         // process the options
         for (final Iterator i = options.iterator(); i.hasNext();) {
             final Option option = (Option) i.next();
+            option.setParent(this);
 
             if (option instanceof Argument) {
                 i.remove();

Modified: commons/proper/cli/trunk/src/java/org/apache/commons/cli2/option/OptionImpl.java
URL: http://svn.apache.org/viewvc/commons/proper/cli/trunk/src/java/org/apache/commons/cli2/option/OptionImpl.java?rev=679530&r1=679529&r2=679530&view=diff
==============================================================================
--- commons/proper/cli/trunk/src/java/org/apache/commons/cli2/option/OptionImpl.java (original)
+++ commons/proper/cli/trunk/src/java/org/apache/commons/cli2/option/OptionImpl.java Thu Jul 24 13:28:16 2008
@@ -33,6 +33,7 @@
 public abstract class OptionImpl implements Option {
     private final int id;
     private final boolean required;
+    private Option parent;
 
     /**
      * Creates an OptionImpl with the specified id
@@ -95,7 +96,9 @@
 
     public int hashCode() {
         int hashCode = getId();
-        hashCode = (hashCode * 37) + getPreferredName().hashCode();
+        if (getPreferredName() != null) {
+            hashCode = (hashCode * 37) + getPreferredName().hashCode();
+        }
 
         if (getDescription() != null) {
             hashCode = (hashCode * 37) + getDescription().hashCode();
@@ -123,6 +126,14 @@
         // nothing to do normally
     }
 
+    public Option getParent() {
+        return parent;
+    }
+
+    public void setParent(Option parent) {
+        this.parent = parent;
+    }
+
     protected void checkPrefixes(final Set prefixes) {
         // nothing to do if empty prefix list
         if (prefixes.isEmpty()) {

Modified: commons/proper/cli/trunk/src/test/org/apache/commons/cli2/CommandLineTestCase.java
URL: http://svn.apache.org/viewvc/commons/proper/cli/trunk/src/test/org/apache/commons/cli2/CommandLineTestCase.java?rev=679530&r1=679529&r2=679530&view=diff
==============================================================================
--- commons/proper/cli/trunk/src/test/org/apache/commons/cli2/CommandLineTestCase.java (original)
+++ commons/proper/cli/trunk/src/test/org/apache/commons/cli2/CommandLineTestCase.java Thu Jul 24 13:28:16 2008
@@ -433,6 +433,7 @@
         final Iterator i = cl.getOptions().iterator();
 
         assertSame(login, i.next());
+        assertSame(group, i.next());
         assertSame(help, i.next());
         assertSame(targets, i.next());
         assertSame(targets, i.next());

Added: commons/proper/cli/trunk/src/test/org/apache/commons/cli2/bug/BugCLI123Test.java
URL: http://svn.apache.org/viewvc/commons/proper/cli/trunk/src/test/org/apache/commons/cli2/bug/BugCLI123Test.java?rev=679530&view=auto
==============================================================================
--- commons/proper/cli/trunk/src/test/org/apache/commons/cli2/bug/BugCLI123Test.java (added)
+++ commons/proper/cli/trunk/src/test/org/apache/commons/cli2/bug/BugCLI123Test.java Thu Jul 24 13:28:16 2008
@@ -0,0 +1,126 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.cli2.bug;
+
+import junit.framework.TestCase;
+
+import org.apache.commons.cli2.CommandLine;
+import org.apache.commons.cli2.Group;
+import org.apache.commons.cli2.Option;
+import org.apache.commons.cli2.OptionException;
+import org.apache.commons.cli2.builder.ArgumentBuilder;
+import org.apache.commons.cli2.builder.DefaultOptionBuilder;
+import org.apache.commons.cli2.builder.GroupBuilder;
+import org.apache.commons.cli2.commandline.Parser;
+
+/**
+ * Group options are not added to the command line when child elements are
+ * detected. This causes the validation of maximum and minimum to fail.
+ *
+ * @author Oliver Heger
+ * @version $Id$
+ */
+public class BugCLI123Test extends TestCase {
+    /** An option of the parent group. */
+    private Option parentOption;
+
+    /** An option of the child group. */
+    private Option childOption1;
+
+    /** Another option of the child group. */
+    private Option childOption2;
+
+    /** The parent group. */
+    private Group parentGroup;
+
+    /** The child group. */
+    private Group childGroup;
+
+    /** The parser. */
+    private Parser parser;
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        final DefaultOptionBuilder obuilder = new DefaultOptionBuilder();
+        final ArgumentBuilder abuilder = new ArgumentBuilder();
+        final GroupBuilder gbuilder = new GroupBuilder();
+        parentOption = obuilder.withLongName("parent").withShortName("p")
+                .withArgument(abuilder.withName("name").create()).create();
+        childOption1 = obuilder.withLongName("child").withShortName("c")
+                .withArgument(abuilder.withName("c").create()).create();
+        childOption2 = obuilder.withLongName("sub").withShortName("s")
+                .withArgument(abuilder.withName("s").create()).create();
+        childGroup = gbuilder.withName("childOptions").withMinimum(0)
+                .withMaximum(2).withOption(childOption1).withOption(
+                        childOption2).create();
+        parentGroup = gbuilder.withName("parentOptions").withMinimum(1)
+                .withMaximum(1).withOption(parentOption).withOption(childGroup)
+                .create();
+        parser = new Parser();
+        parser.setGroup(parentGroup);
+    }
+
+    /**
+     * A single option of the child group is specified.
+     */
+    public void testSingleChildOption() throws OptionException {
+        CommandLine cl = parser.parse(new String[] { "--child", "test" });
+        assertTrue("Child option not found", cl.hasOption(childOption1));
+        assertEquals("Wrong value for option", "test", cl
+                .getValue(childOption1));
+        assertTrue("Child group not found", cl.hasOption(childGroup));
+    }
+
+    /**
+     * Two options of the child group are specified.
+     */
+    public void testMultipleChildOptions() throws OptionException {
+        CommandLine cl = parser.parse(new String[] { "--child", "test",
+                "--sub", "anotherTest" });
+        assertTrue("Child option not found", cl.hasOption(childOption1));
+        assertEquals("Wrong value for option", "test", cl
+                .getValue(childOption1));
+        assertTrue("Sub option not found", cl.hasOption(childOption2));
+        assertEquals("Wrong value for sub option", "anotherTest", cl
+                .getValue(childOption2));
+        assertTrue("Child group not found", cl.hasOption(childGroup));
+    }
+
+    /**
+     * The option defined for the parent group is specified.
+     */
+    public void testSingleParentOption() throws OptionException {
+        CommandLine cl = parser.parse(new String[] { "--parent", "yes" });
+        assertTrue("Parent option not found", cl.hasOption(parentOption));
+        assertEquals("Wrong value for option", "yes", cl.getValue(parentOption));
+        assertFalse("Found child group", cl.hasOption(childGroup));
+    }
+
+    /**
+     * The parent option and an option of the child group is specified. This
+     * should cause an exception.
+     */
+    public void testParentOptionAndChildOption() throws OptionException {
+        try {
+            parser.parse(new String[] { "--parent", "error", "--child",
+                    "exception" });
+            fail("Maximum restriction for parent not verified!");
+        } catch (OptionException oex) {
+            // ok
+        }
+    }
+}

Propchange: commons/proper/cli/trunk/src/test/org/apache/commons/cli2/bug/BugCLI123Test.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/proper/cli/trunk/src/test/org/apache/commons/cli2/bug/BugCLI123Test.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: commons/proper/cli/trunk/src/test/org/apache/commons/cli2/bug/BugCLI123Test.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain