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: /**
032: * Command line string parameter definition. This defines a command line flag
033: * with an associated string value, supplied as a separate argument on the
034: * command line. The argument giving the parameter value must be the next
035: * unused argument from the command line, and must not begin with the '-'
036: * character used to indicate control argument flags.
037: *
038: * @author Dennis M. Sosnoski
039: * @version 1.0
040: */
041:
042: public class StringDef extends ParameterDef {
043: /**
044: * Constructor with description.
045: *
046: * @param chr parameter flag character
047: * @param name field name for parameter
048: * @param desc discription text for parameter
049: */
050:
051: public StringDef(char chr, String name, String desc) {
052: super (chr, name, desc);
053: }
054:
055: /**
056: * Constructor without description.
057: *
058: * @param chr parameter flag character
059: * @param name field name for parameter
060: */
061:
062: public StringDef(char chr, String name) {
063: this (chr, name, null);
064: }
065:
066: /**
067: * Bind parameter to target class field.
068: *
069: * @param clas target class for saving parameter values
070: * @throws IllegalArgumentException if the field is not a String
071: */
072:
073: protected void bindToClass(Class clas) {
074: super .bindToClass(clas);
075: Class type = m_field.getType();
076: if (type != String.class) {
077: throw new IllegalArgumentException("Field '" + m_name
078: + "'in " + clas.getName()
079: + " is not of type String");
080: }
081: }
082:
083: /**
084: * Handle argument. This implementation of the abstract base class method
085: * makes sure that we have another command line argument available, and
086: * checks that the argument does not begin with the '-' character used to
087: * indicate control argument flags. If these conditions are met the
088: * parameter field is set to the string value of the argument.
089: *
090: * @param proc argument processor making call to handler
091: * @throws ArgumentErrorException if argument value missing or malformed
092: * @throws IllegalArgumentException on error in processing
093: */
094:
095: public void handle(ArgumentProcessor proc) {
096: StringTracker args = proc.getArgs();
097: if (args.hasNext()) {
098: String arg = args.next();
099: if (arg.length() > 0 && arg.charAt(0) == '-') {
100: proc.reportArgumentError(m_char,
101: "Argument value starts with '-'");
102: } else {
103: proc.setValue(arg, m_field);
104: }
105: } else {
106: proc.reportArgumentError(m_char, "Argument value missing");
107: }
108: }
109: }
|