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 float parameter definition. This defines a command line flag
033: * with an associated float value. The optionally signed value must
034: * immediately follow the flag character within the same argument string.
035: *
036: * @author Dennis M. Sosnoski
037: * @version 1.0
038: */
039:
040: public class FloatDef extends ParameterDef {
041: /** Minimum allowed argument value. */
042: private final float m_min;
043:
044: /** Maximum allowed argument value. */
045: private final float m_max;
046:
047: /**
048: * Constructor with range and description.
049: *
050: * @param chr parameter flag character
051: * @param name field name for parameter
052: * @param desc discription text for parameter
053: * @param min minimum allowed value
054: * @param max maximum allowed value
055: */
056:
057: public FloatDef(char chr, String name, String desc, float min,
058: float max) {
059: super (chr, name, desc);
060: m_min = min;
061: m_max = max;
062: }
063:
064: /**
065: * Constructor with range but no description.
066: *
067: * @param chr parameter flag character
068: * @param name field name for parameter
069: * @param min minimum allowed value
070: * @param max maximum allowed value
071: */
072:
073: public FloatDef(char chr, String name, float min, float max) {
074: this (chr, name, null, min, max);
075: }
076:
077: /**
078: * Constructor with no range defined.
079: *
080: * @param chr parameter flag character
081: * @param name field name for parameter
082: * @param desc discription text for parameter
083: */
084:
085: public FloatDef(char chr, String name, String desc) {
086: this (chr, name, desc, Float.MIN_VALUE, Float.MAX_VALUE);
087: }
088:
089: /**
090: * Constructor with no range or description.
091: *
092: * @param chr parameter flag character
093: * @param name field name for parameter
094: */
095:
096: public FloatDef(char chr, String name) {
097: this (chr, name, null);
098: }
099:
100: /**
101: * Get text abbreviation for parameter. This override of the base class
102: * method returns "-cNN", where 'c' is the flag character for the parameter.
103: *
104: * @return text abbreviation for showing parameter
105: */
106:
107: public String getAbbreviation() {
108: return "-" + m_char + "NN";
109: }
110:
111: /**
112: * Bind parameter to target class field.
113: *
114: * @param clas target class for saving parameter values
115: * @throws IllegalArgumentException if the field is not an int
116: */
117:
118: protected void bindToClass(Class clas) {
119: super .bindToClass(clas);
120: Class type = m_field.getType();
121: if (type != Float.class && type != Float.TYPE) {
122: throw new IllegalArgumentException("Field '" + m_name
123: + "'in " + clas.getName() + " is not of type float");
124: }
125: }
126:
127: /**
128: * Handle argument. This implementation of the abstract base class method
129: * interprets the characters following the flag character as an optionally
130: * signed decimal value. If the value is within the allowed range the
131: * parameter is set to that value. Other flag characters may follow the
132: * numeric value within the argument.
133: *
134: * @param proc argument processor making call to handler
135: * @throws ArgumentErrorException if decimal value missing or out of range
136: * @throws IllegalArgumentException on error in processing
137: */
138:
139: public void handle(ArgumentProcessor proc) {
140:
141: // set up for validating
142: boolean minus = false;
143: boolean digits = false;
144: float value = 0.0f;
145: CharTracker track = proc.getChars();
146: StringBuffer text = new StringBuffer();
147: if (track.hasNext()) {
148:
149: // check for leading sign flag
150: char chr = track.peek();
151: if (chr == '-' || chr == '+') {
152: text.append(chr);
153: track.next();
154: }
155:
156: // scan text of value
157: while (track.hasNext()) {
158: chr = track.peek();
159: if ((chr >= '0' && chr <= '9') || chr == '.') {
160: text.append(chr);
161: track.next();
162: } else {
163: break;
164: }
165: }
166: }
167:
168: // make sure we have a valid value
169: try {
170: value = Float.parseFloat(text.toString());
171: } catch (NumberFormatException ex) {
172: proc.reportArgumentError(m_char, ex.getMessage());
173: }
174: if (value < m_min || value > m_max) {
175: proc.reportArgumentError(m_char, "Value out of range");
176: } else {
177: proc.setValue(new Float(value), m_field);
178: }
179: }
180: }
|