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.lang.reflect.Field;
032:
033: /**
034: * Base class for command line parameter definitions. This is used for simple
035: * command line parameters of various flavors. Subclasses define the particular
036: * types of parameters supported.
037: *
038: * @author Dennis M. Sosnoski
039: * @version 1.0
040: */
041:
042: public abstract class ParameterDef {
043: /** Argument flag character. */
044: protected final char m_char;
045:
046: /** Name of field holding parameter value. */
047: protected final String m_name;
048:
049: /** Argument description text. */
050: protected final String m_description;
051:
052: /** Information for field linked to parameter. */
053: protected Field m_field;
054:
055: /**
056: * Constructor
057: *
058: * @param chr parameter flag character
059: * @param name field name for parameter
060: * @param desc discription text for parameter (may be <code>null</code>)
061: * @throws IllegalArgumentException if the field is not accessible
062: */
063:
064: protected ParameterDef(char chr, String name, String desc) {
065: m_char = chr;
066: m_name = name;
067: m_description = (desc == null) ? "[see code for description]"
068: : desc;
069: }
070:
071: /**
072: * Get text abbreviation for parameter. The default format is just "-c",
073: * where 'c' is the flag character for the parameter. If a different format
074: * is needed by a subclass it should override this method.
075: *
076: * @return text abbreviation for showing parameter
077: */
078:
079: public String getAbbreviation() {
080: return "-" + m_char;
081: }
082:
083: /**
084: * Get flag character for parameter.
085: *
086: * @return flag character specifying the parameter
087: */
088:
089: public char getFlag() {
090: return m_char;
091: }
092:
093: /**
094: * Get text of parameter description.
095: *
096: * @param file file to be read
097: * @return array of bytes containing all data from file
098: * @throws IOException on file access error
099: */
100:
101: public String getDescription() {
102: return m_description;
103: }
104:
105: /**
106: * Bind parameter to target class field. This will generally be overridden
107: * by subclasses to verify the field type found, but should be called during
108: * the subclass processing.
109: *
110: * @param clas target class for saving parameter values
111: */
112:
113: protected void bindToClass(Class clas) {
114: try {
115: m_field = clas.getDeclaredField(m_name);
116: m_field.setAccessible(true);
117: } catch (NoSuchFieldException ex) {
118: throw new IllegalArgumentException("Field '" + m_name
119: + "' not found in " + clas.getName());
120: }
121: }
122:
123: /**
124: * Handle argument. This abstract method must be overridden in each
125: * subclass to perform the appropriate processing, if necessary using
126: * additional characters from the current argument or the next argument
127: * in the list.
128: *
129: * @param proc argument processor making call to handler
130: */
131:
132: public abstract void handle(ArgumentProcessor proc);
133: }
|