You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by jk...@apache.org on 2003/06/12 23:22:49 UTC
cvs commit: jakarta-commons/cli/src/java/org/apache/commons/cli CommandLineParser.java ArgumentBuilder.java Argument.java ArgumentImpl.java AnonymousArgumentImpl.java
jkeyes 2003/06/12 14:22:49
Modified: cli/src/test/org/apache/commons/cli Tag: cli_1_x
OptionBuilderTest.java ApplicationTest.java
UnitTestSuite.java ValueTest.java
AnonymousArgumentTest.java BugzillaTest.java
cli/src/java/org/apache/commons/cli Tag: cli_1_x
CommandLineParser.java ArgumentBuilder.java
Argument.java ArgumentImpl.java
AnonymousArgumentImpl.java
Added: cli/src/test/org/apache/commons/cli Tag: cli_1_x
ArgumentTest.java
Log:
- applied Robs patch for max and min value support
- removed some author tags (after reading some mails on
community@apache.org)
Revision Changes Path
No revision
No revision
1.3.2.3 +16 -11 jakarta-commons/cli/src/test/org/apache/commons/cli/OptionBuilderTest.java
Index: OptionBuilderTest.java
===================================================================
RCS file: /home/cvs/jakarta-commons/cli/src/test/org/apache/commons/cli/OptionBuilderTest.java,v
retrieving revision 1.3.2.2
retrieving revision 1.3.2.3
diff -u -r1.3.2.2 -r1.3.2.3
--- OptionBuilderTest.java 4 Jun 2003 01:21:54 -0000 1.3.2.2
+++ OptionBuilderTest.java 12 Jun 2003 21:22:49 -0000 1.3.2.3
@@ -86,7 +86,7 @@
public void testCompleteOption() {
Argument simple =
abuilder
- .withSize(1)
+ .withMaximumSize(1)
.withRequired(true)
.withValueType(Float.class)
.withDescription("this is a simple option")
@@ -98,7 +98,8 @@
assertEquals("simpleOption", simple.getLongName());
assertEquals("this is a simple option", simple.getDescription());
assertEquals(Float.class, simple.getValueType());
- assertEquals("one value", simple.getSize(), 1);
+ assertEquals("one value", simple.getMinimumSize(), 1);
+ assertEquals("one value", simple.getMaximumSize(), 1);
assertTrue(simple.isRequired());
}
@@ -107,7 +108,7 @@
abuilder
.withLongName("simple option")
.withRequired(true)
- .withSize(1)
+ .withMaximumSize(1)
.withValueType(Float.class)
.withDescription("this is a simple option")
.withName("s")
@@ -117,13 +118,14 @@
assertEquals("simple option", simple.getLongName());
assertEquals("this is a simple option", simple.getDescription());
assertEquals(Float.class, simple.getValueType());
- assertEquals("one value", simple.getSize(), 1);
+ assertEquals("one value", simple.getMinimumSize(), 1);
+ assertEquals("one value", simple.getMaximumSize(), 1);
assertTrue(simple.isRequired());
simple =
abuilder
.withLongName("dimple option")
- .withSize(1)
+ .withMaximumSize(1)
.withDescription("this is a dimple option")
.withName("d")
.create();
@@ -132,7 +134,8 @@
assertEquals("dimple option", simple.getLongName());
assertEquals("this is a dimple option", simple.getDescription());
assertNull(simple.getValueType());
- assertEquals("one value", simple.getSize(), 1);
+ assertEquals("one value", simple.getMinimumSize(), 1);
+ assertEquals("one value", simple.getMaximumSize(), 1);
assertTrue(!simple.isRequired());
}
@@ -186,10 +189,12 @@
Argument opt =
abuilder
.withDescription("option description")
- .withSize(2)
+ .withMinimumSize(2)
+ .withMaximumSize(2)
.withName("o")
.create();
- assertEquals(2, opt.getSize());
+ assertEquals(2, opt.getMinimumSize());
+ assertEquals(2, opt.getMaximumSize());
}
public void testIllegalOptions() {
1.9.2.4 +4 -4 jakarta-commons/cli/src/test/org/apache/commons/cli/ApplicationTest.java
Index: ApplicationTest.java
===================================================================
RCS file: /home/cvs/jakarta-commons/cli/src/test/org/apache/commons/cli/ApplicationTest.java,v
retrieving revision 1.9.2.3
retrieving revision 1.9.2.4
diff -u -r1.9.2.3 -r1.9.2.4
--- ApplicationTest.java 4 Jun 2003 01:21:54 -0000 1.9.2.3
+++ ApplicationTest.java 12 Jun 2003 21:22:49 -0000 1.9.2.4
@@ -266,7 +266,7 @@
}
- public void XtestCVS() throws Exception {
+ public void testCVS() throws Exception {
OptionBuilder obuilder = new OptionBuilder();
ArgumentBuilder abuilder = new ArgumentBuilder();
1.1.2.2 +58 -4 jakarta-commons/cli/src/test/org/apache/commons/cli/Attic/UnitTestSuite.java
Index: UnitTestSuite.java
===================================================================
RCS file: /home/cvs/jakarta-commons/cli/src/test/org/apache/commons/cli/Attic/UnitTestSuite.java,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -u -r1.1.2.1 -r1.1.2.2
--- UnitTestSuite.java 19 May 2003 20:47:50 -0000 1.1.2.1
+++ UnitTestSuite.java 12 Jun 2003 21:22:49 -0000 1.1.2.2
@@ -1,8 +1,62 @@
/*
- * Created on Feb 20, 2003
+ * $Header$
+ * $Revision$
+ * $Date$
+ *
+ * ====================================================================
+ *
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 1999-2003 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ * any, must include the following acknowlegement:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowlegement may appear in the software itself,
+ * if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Commons", and "Apache Software
+ * Foundation" must not be used to endorse or promote products derived
+ * from this software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ * nor may "Apache" appear in their names without prior written
+ * permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>;.
*
- * To change this generated comment go to
- * Window>Preferences>Java>Code Generation>Code Template
*/
package org.apache.commons.cli;
@@ -10,7 +64,6 @@
import junit.framework.TestSuite;
/**
- * @author jkeyes
*/
public class UnitTestSuite {
@@ -19,6 +72,7 @@
//$JUnit-BEGIN$
suite.addTest(AnonymousArgumentTest.suite());
suite.addTest(ApplicationTest.suite());
+ suite.addTest(ArgumentTest.suite());
suite.addTest(BugzillaTest.suite());
suite.addTest(ChildOptionTest.suite());
suite.addTest(CommandLineParserTest.suite());
1.7.2.5 +11 -11 jakarta-commons/cli/src/test/org/apache/commons/cli/ValueTest.java
Index: ValueTest.java
===================================================================
RCS file: /home/cvs/jakarta-commons/cli/src/test/org/apache/commons/cli/ValueTest.java,v
retrieving revision 1.7.2.4
retrieving revision 1.7.2.5
diff -u -r1.7.2.4 -r1.7.2.5
--- ValueTest.java 4 Jun 2003 01:21:54 -0000 1.7.2.4
+++ ValueTest.java 12 Jun 2003 21:22:49 -0000 1.7.2.5
@@ -104,36 +104,36 @@
.withName("d").withLongName("d").create();
opts.add(d);
- Argument e = abuilder.withOptionalValues(true)
+ Argument e = abuilder.withMinimumSize(0)
.withName("e").create();
opts.add(e);
- Argument fish = abuilder.withOptionalValues(true)
+ Argument fish = abuilder.withMinimumSize(0)
.withLongName("fish").create();
opts.add(fish);
- Argument gravy = abuilder.withOptionalValues(true)
- .withSize(100)
+ Argument gravy = abuilder.withMinimumSize(0)
+ .withMaximumSize(100)
.withLongName("gravy").create();
opts.add(gravy);
- Argument hide = abuilder.withOptionalValues(true)
- .withSize(2)
+ Argument hide = abuilder.withMinimumSize(0)
+ .withMaximumSize(2)
.withLongName("hide").create();
opts.add(hide);
- Argument i = abuilder.withOptionalValues(true)
- .withSize(2)
+ Argument i = abuilder.withMinimumSize(0)
+ .withMaximumSize(2)
.withName("i").create();
opts.add(i);
- Argument j = abuilder.withOptionalValues(true)
- .withSize(2)
+ Argument j = abuilder.withMinimumSize(0)
+ .withMaximumSize(2)
.withName("j").create();
opts.add(j);
- Argument k = abuilder.withOptionalValues(true)
+ Argument k = abuilder.withMinimumSize(0)
.withValueSeparator(',')
.withName("k").create();
opts.add(k);
1.1.2.5 +5 -4 jakarta-commons/cli/src/test/org/apache/commons/cli/Attic/AnonymousArgumentTest.java
Index: AnonymousArgumentTest.java
===================================================================
RCS file: /home/cvs/jakarta-commons/cli/src/test/org/apache/commons/cli/Attic/AnonymousArgumentTest.java,v
retrieving revision 1.1.2.4
retrieving revision 1.1.2.5
diff -u -r1.1.2.4 -r1.1.2.5
--- AnonymousArgumentTest.java 8 Jun 2003 18:16:01 -0000 1.1.2.4
+++ AnonymousArgumentTest.java 12 Jun 2003 21:22:49 -0000 1.1.2.5
@@ -161,7 +161,8 @@
public void testAccessors() throws Exception {
ArgumentBuilder abuilder = new ArgumentBuilder();
Argument anon = abuilder.createAnonymous("token");
- assertEquals(0, anon.getSize());
+ assertEquals(0, anon.getMaximumSize());
+ assertEquals(0, anon.getMinimumSize());
assertEquals("token", anon.getValueName());
try {
anon.hasOptionalValues();
1.1.2.6 +7 -11 jakarta-commons/cli/src/test/org/apache/commons/cli/Attic/BugzillaTest.java
Index: BugzillaTest.java
===================================================================
RCS file: /home/cvs/jakarta-commons/cli/src/test/org/apache/commons/cli/Attic/BugzillaTest.java,v
retrieving revision 1.1.2.5
retrieving revision 1.1.2.6
diff -u -r1.1.2.5 -r1.1.2.6
--- BugzillaTest.java 8 Jun 2003 18:16:01 -0000 1.1.2.5
+++ BugzillaTest.java 12 Jun 2003 21:22:49 -0000 1.1.2.6
@@ -96,7 +96,7 @@
Option p =
builder
.withValueSeparator(':')
- .withSize(100)
+ .withMaximumSize(100)
.withName("p")
.create();
options.add(p);
@@ -105,7 +105,7 @@
new String[] { "-DJAVA_HOME=/opt/java", "-pfile1:file2:file3" };
CommandLineParser parser = new CommandLineParser();
-
+
CommandLine cmd = parser.parse(options, args);
java.util.Properties props = cmd.getProperties();
@@ -376,12 +376,9 @@
Options options = new Options();
ArgumentBuilder builder = new ArgumentBuilder();
- Option a = builder.withOptionalValues(true).withName("a").create();
- //options.addOption( OptionBuilder.hasOptionalArg()
- // .create( 'a' ) );
+ Option a = builder.withMinimumSize(0).withName("a").create();
Option b = builder.withName("b").create();
- //options.addOption( OptionBuilder.hasArg()
- // .create( 'b' ) );
+
options.add(a);
options.add(b);
String[] args = new String[] { "-a", "-bvalue" };
@@ -396,5 +393,4 @@
cmd = parser.parse(options, args);
assertEquals(cmd.getValue("-b"), "value");
}
-
}
No revision
No revision
1.1.2.1 +144 -0 jakarta-commons/cli/src/test/org/apache/commons/cli/Attic/ArgumentTest.java
No revision
No revision
1.6.2.9 +25 -22 jakarta-commons/cli/src/java/org/apache/commons/cli/CommandLineParser.java
Index: CommandLineParser.java
===================================================================
RCS file: /home/cvs/jakarta-commons/cli/src/java/org/apache/commons/cli/CommandLineParser.java,v
retrieving revision 1.6.2.8
retrieving revision 1.6.2.9
diff -u -r1.6.2.8 -r1.6.2.9
--- CommandLineParser.java 8 Jun 2003 18:16:01 -0000 1.6.2.8
+++ CommandLineParser.java 12 Jun 2003 21:22:49 -0000 1.6.2.9
@@ -381,30 +381,36 @@
final List argList)
throws MissingValueException {
- int size = argument.getSize();
+ final int minimumSize = argument.getMinimumSize();
+ final int maximumSize = argument.getMaximumSize();
int processed = argList.size();
-
- if (!iter.hasNext() && processed == 0) {
- if (argument.hasOptionalValues()) {
- return argList;
- }
- throw new MissingValueException(
- "Missing value for argument {" + argument.getName() + "}");
- }
-
- while (processed < size && iter.hasNext()) {
+
+ // grab all of the values
+ while (processed < maximumSize && iter.hasNext()) {
String arg = (String) iter.next();
if (arg != null && ("-".equals(arg) || !arg.startsWith("-"))) {
+ // add valid value to the list
argList.add(stripLeadingAndTrailingQuotes(arg));
processed++;
- } else if (!argument.hasOptionalValues()) {
- throw new MissingValueException(
- "Missing value for argument {" + argument.getName() + "}");
- } else {
+ }
+ else {
+ // backup one and abort the loop
iter.previous();
- return argList;
+ break;
+ }
+ }
+
+ // check that we have enough values
+ if (processed < minimumSize) {
+ String name = argument.getLongName();
+
+ if (name == null) {
+ // use the short version
+ name = argument.getName();
}
+ throw new MissingValueException(name);
}
+
return argList;
}
@@ -422,9 +428,6 @@
while (iter.hasNext()) {
String value = (String) iter.next();
- //if( value.startsWith("-") ) {
- //throw new ParseException( "option str in anonymous values" );
- //}
args.add(value);
}
return args;
1.1.2.7 +30 -32 jakarta-commons/cli/src/java/org/apache/commons/cli/Attic/ArgumentBuilder.java
Index: ArgumentBuilder.java
===================================================================
RCS file: /home/cvs/jakarta-commons/cli/src/java/org/apache/commons/cli/Attic/ArgumentBuilder.java,v
retrieving revision 1.1.2.6
retrieving revision 1.1.2.7
diff -u -r1.1.2.6 -r1.1.2.7
--- ArgumentBuilder.java 9 Jun 2003 22:39:50 -0000 1.1.2.6
+++ ArgumentBuilder.java 12 Jun 2003 21:22:49 -0000 1.1.2.7
@@ -67,7 +67,6 @@
* the state is reset so no settings from previous calls will
* be preserved.
*
- * @author John Keyes
* @since 2.0
*/
public class ArgumentBuilder {
@@ -96,15 +95,15 @@
/** a textual description of the value */
private String valueName;
- /** the number of values this argument has */
- private int size = 1;
+ /** the minimum number of values this argument has */
+ private int minimumSize = 1;
+
+ /** the maximum number of values this argument has */
+ private int maximumSize = 1;
/** the type of the argument value */
private Class type;
- /** specifies whether the values can be omitted, by default false */
- private boolean hasOptionalValues;
-
/** TODO: javadoc */
private ValueValidator valueValidator;
@@ -129,11 +128,11 @@
this.longName,
this.description,
this.required,
- this.size,
+ this.minimumSize,
+ this.maximumSize,
this.type,
this.valueSeparator,
this.valueName,
- this.hasOptionalValues,
this.options,
this.valueValidator);
} finally {
@@ -259,43 +258,42 @@
}
/**
- * Sets the number of values the next Argument created will have.
+ * Sets the maximum number of values the next Argument created will have.
*
* @param size
* the number of values
*
* @return the ArgumentBuilder
- */
- public ArgumentBuilder withSize(final int size) {
- this.size = size;
+ */
+ public ArgumentBuilder withMaximumSize(final int size) {
+ this.maximumSize = size;
return this;
}
-
+
/**
- * Sets the type of the value of the next Argument to be created.
+ * Sets the maximum number of values the next Argument created will have.
*
- * @param type
- * the class type of the argument value e.g. Integer.class
+ * @param size
+ * the number of values
*
* @return the ArgumentBuilder
- */
- public ArgumentBuilder withValueType(final Class type) {
- this.type = type;
+ */
+ public ArgumentBuilder withMinimumSize(final int size) {
+ this.minimumSize = size;
return this;
}
+
/**
- * Sets whether the values of the next Argument to be created
- * are required or not.
+ * Sets the type of the value of the next Argument to be created.
+ *
+ * @param type
+ * the class type of the argument value e.g. Integer.class
*
- * @param optional
- * if true, the next Argument must be present when the command line
- * is parsed, otherwise it does not
- *
* @return the ArgumentBuilder
*/
- public ArgumentBuilder withOptionalValues(final boolean optional) {
- this.hasOptionalValues = optional;
+ public ArgumentBuilder withValueType(final Class type) {
+ this.type = type;
return this;
}
@@ -310,9 +308,9 @@
this.valueSeparator = (char) 0;
this.valueName = null;
this.valueValidator = null;
- this.size = 1;
+ this.minimumSize = 1;
+ this.maximumSize = 1;
this.type = null;
- this.hasOptionalValues = false;
this.description = null;
}
}
1.1.2.5 +19 -12 jakarta-commons/cli/src/java/org/apache/commons/cli/Attic/Argument.java
Index: Argument.java
===================================================================
RCS file: /home/cvs/jakarta-commons/cli/src/java/org/apache/commons/cli/Attic/Argument.java,v
retrieving revision 1.1.2.4
retrieving revision 1.1.2.5
diff -u -r1.1.2.4 -r1.1.2.5
--- Argument.java 9 Jun 2003 22:39:50 -0000 1.1.2.4
+++ Argument.java 12 Jun 2003 21:22:49 -0000 1.1.2.5
@@ -64,7 +64,6 @@
* An Argument is a command line Option that also has an associated
* value or values.
*
- * @author John Keyes
* @since 2.0
*/
public interface Argument extends Option {
@@ -97,14 +96,6 @@
String getValueName();
/**
- * Returns the number of values that this argument is permitted
- * to have.
- *
- * @return the number of argument values
- */
- int getSize();
-
- /**
* Returns whether the values of this argument are optional.
* If they are optional the argument is effectively an Option.
*
@@ -112,6 +103,22 @@
*/
boolean hasOptionalValues();
+ /**
+ * Returns the minimum number of values that this argument is permitted
+ * to have.
+ *
+ * @return the minimum number of argument values
+ */
+ int getMinimumSize();
+
+ /**
+ * Returns the maximum number of values that this argument is permitted
+ * to have.
+ *
+ * @return the maximum number of argument values
+ */
+ int getMaximumSize();
+
/** TODO: javadoc */
ValueValidator getValueValidator();
}
1.1.2.6 +21 -16 jakarta-commons/cli/src/java/org/apache/commons/cli/Attic/ArgumentImpl.java
Index: ArgumentImpl.java
===================================================================
RCS file: /home/cvs/jakarta-commons/cli/src/java/org/apache/commons/cli/Attic/ArgumentImpl.java,v
retrieving revision 1.1.2.5
retrieving revision 1.1.2.6
diff -u -r1.1.2.5 -r1.1.2.6
--- ArgumentImpl.java 9 Jun 2003 22:39:51 -0000 1.1.2.5
+++ ArgumentImpl.java 12 Jun 2003 21:22:49 -0000 1.1.2.6
@@ -68,7 +68,8 @@
class ArgumentImpl extends OptionImpl implements Argument {
/** the number of values */
- private final int size;
+ private final int minimumSize;
+ private final int maximumSize;
/** the value separator */
private final char valueSeparator;
@@ -79,9 +80,6 @@
/** the type of the value(s) */
private final Class type;
- /** whether this argument has optional values */
- private final boolean hasOptionalValues;
-
/** TODO: javadoc */
private final ValueValidator validator;
@@ -124,29 +122,36 @@
final String longName,
final String description,
final boolean required,
- final int size,
+ final int minimumSize,
+ final int maximumSize,
final Class type,
final char valueSeparator,
final String valueName,
- final boolean hasOptionalValues,
final Options options,
final ValueValidator validator) {
-
+
super(name, longName, description, required, options);
- this.size = size;
+ this.minimumSize = minimumSize;
+ this.maximumSize = maximumSize;
this.type = type;
this.valueSeparator = valueSeparator;
this.valueName = valueName;
- this.hasOptionalValues = hasOptionalValues;
this.validator = validator;
}
/**
- * @see Argument#getSize()
+ * @see Argument#getMaximumSize()
+ */
+ public int getMaximumSize() {
+ return this.maximumSize;
+ }
+
+ /**
+ * @see Argument#getMinimumSize()
*/
- public int getSize() {
- return this.size;
+ public int getMinimumSize() {
+ return this.minimumSize;
}
/**
@@ -174,7 +179,7 @@
* @see Argument#hasOptionalValues()
*/
public boolean hasOptionalValues() {
- return this.hasOptionalValues;
+ return minimumSize<maximumSize;
}
/**
1.1.2.8 +13 -9 jakarta-commons/cli/src/java/org/apache/commons/cli/Attic/AnonymousArgumentImpl.java
Index: AnonymousArgumentImpl.java
===================================================================
RCS file: /home/cvs/jakarta-commons/cli/src/java/org/apache/commons/cli/Attic/AnonymousArgumentImpl.java,v
retrieving revision 1.1.2.7
retrieving revision 1.1.2.8
diff -u -r1.1.2.7 -r1.1.2.8
--- AnonymousArgumentImpl.java 9 Jun 2003 22:39:51 -0000 1.1.2.7
+++ AnonymousArgumentImpl.java 12 Jun 2003 21:22:49 -0000 1.1.2.8
@@ -110,15 +110,19 @@
}
/**
- * @task implement this method
- * Returns the number of values for this Argument.
- *
- * @return the number of values
+ * @see org.apache.commons.cli.Argument#getMaximumSize()
*/
- public int getSize() {
+ public int getMaximumSize(){
return 0;
}
-
+
+ /**
+ * @see org.apache.commons.cli.Argument#getMinimumSize()
+ */
+ public int getMinimumSize(){
+ return 0;
+ }
+
/**
* @task this should be implemented by the getDescription
* method
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org