001: /*
002: Copyright (c) 2003, Dennis M. Sosnoski
003: All rights reserved.
004:
005: Redistribution and use in source and binary forms, with or without modification,
006: are permitted provided that the following conditions are met:
007:
008: * Redistributions of source code must retain the above copyright notice, this
009: list of conditions and the following disclaimer.
010: * Redistributions in binary form must reproduce the above copyright notice,
011: this list of conditions and the following disclaimer in the documentation
012: and/or other materials provided with the distribution.
013: * Neither the name of JargP nor the names of its contributors may be used
014: to endorse or promote products derived from this software without specific
015: prior written permission.
016:
017: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
018: ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
019: WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
020: DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
021: ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
022: (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
023: LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
024: ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
025: (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
026: SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
027: */
028:
029: package org.jargp;
030:
031: import java.util.List;
032:
033: /**
034: * Command line string list parameter definition. This defines a command line
035: * flag with an associated string value which may be used repeatedly. The
036: * argument giving the parameter value must be the next unused argument from the
037: * command line following each occurrance of the flag, and must not begin with
038: * the '-' character used to indicate control argument flags.
039: *
040: * @author Dennis M. Sosnoski
041: * @version 1.0
042: */
043:
044: public class StringListDef extends ParameterDef {
045: /**
046: * Constructor with description.
047: *
048: * @param chr parameter flag character
049: * @param name field name for parameter
050: * @param desc discription text for parameter
051: */
052:
053: public StringListDef(char chr, String name, String desc) {
054: super (chr, name, desc);
055: }
056:
057: /**
058: * Constructor without description.
059: *
060: * @param chr parameter flag character
061: * @param name field name for parameter
062: */
063:
064: public StringListDef(char chr, String name) {
065: this (chr, name, null);
066: }
067:
068: /**
069: * Bind parameter to target class field.
070: *
071: * @param clas target class for saving parameter values
072: * @throws IllegalArgumentException if the field is not a List
073: */
074:
075: protected void bindToClass(Class clas) {
076: super .bindToClass(clas);
077: Class type = m_field.getType();
078: if (!List.class.isAssignableFrom(type)) {
079: throw new IllegalArgumentException("Field '" + m_name
080: + "'in " + clas.getName() + " is not a List type");
081: }
082: }
083:
084: /**
085: * Handle argument. This implementation of the abstract base class method
086: * makes sure that we have another command line argument available, and
087: * checks that the argument does not begin with the '-' character used to
088: * indicate control argument flags. If these conditions are met the
089: * string value of the argument is added to the field list.
090: *
091: * @param proc argument processor making call to handler
092: * @throws ArgumentErrorException if argument value missing or malformed
093: * @throws IllegalArgumentException on error in processing
094: */
095:
096: public void handle(ArgumentProcessor proc) {
097: StringTracker args = proc.getArgs();
098: if (args.hasNext()) {
099: String arg = args.next();
100: if (arg.length() > 0 && arg.charAt(0) == '-') {
101: proc.reportArgumentError(m_char,
102: "Argument value starts with '-'");
103: } else {
104: proc.addValue(arg, m_field);
105: }
106: } else {
107: proc.reportArgumentError(m_char, "Argument value missing");
108: }
109: }
110: }
|