001: package org.apache.turbine.services.intake.model;
002:
003: /*
004: * Licensed to the Apache Software Foundation (ASF) under one
005: * or more contributor license agreements. See the NOTICE file
006: * distributed with this work for additional information
007: * regarding copyright ownership. The ASF licenses this file
008: * to you under the Apache License, Version 2.0 (the
009: * "License"); you may not use this file except in compliance
010: * with the License. You may obtain a copy of the License at
011: *
012: * http://www.apache.org/licenses/LICENSE-2.0
013: *
014: * Unless required by applicable law or agreed to in writing,
015: * software distributed under the License is distributed on an
016: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017: * KIND, either express or implied. See the License for the
018: * specific language governing permissions and limitations
019: * under the License.
020: */
021:
022: import java.text.DateFormat;
023: import java.text.ParseException;
024:
025: import java.util.Date;
026:
027: import org.apache.commons.lang.StringUtils;
028:
029: import org.apache.turbine.services.intake.IntakeException;
030: import org.apache.turbine.services.intake.validator.DateStringValidator;
031: import org.apache.turbine.services.intake.xmlmodel.XmlField;
032: import org.apache.turbine.util.TurbineRuntimeException;
033:
034: /**
035: * Field for date inputs as free form text. The parsing of date strings
036: * is dependent on any rules that are defined, so this field will expect that
037: * any validator will be (or extend) DateStringValidator.
038: *
039: * @author <a href="mailto:jmcnally@collab.net">John McNally</a>
040: * @author <a href="mailto:hps@intermeta.de">Henning P. Schmiedehausen</a>
041: * @author <a href="mailto:quintonm@bellsouth.net">Quinton McCombs</a>
042: * @version $Id: DateStringField.java 534527 2007-05-02 16:10:59Z tv $
043: */
044: public class DateStringField extends Field {
045: /** date format. Fallback if no validator is defined */
046: private static DateFormat df;
047:
048: static {
049: df = DateFormat.getInstance();
050: df.setLenient(true);
051: }
052:
053: /**
054: * Constructor.
055: *
056: * @param field xml field definition object
057: * @param group xml group definition object
058: * @throws IntakeException thrown by superclass
059: */
060: public DateStringField(XmlField field, Group group)
061: throws IntakeException {
062: super (field, group);
063: }
064:
065: /**
066: * Sets the default value for a DateString field
067: *
068: * @param prop Parameter for the default values
069: */
070: public void setDefaultValue(String prop) {
071: defaultValue = null;
072:
073: if (prop == null) {
074: return;
075: }
076:
077: try {
078: defaultValue = getDate(prop);
079: } catch (ParseException e) {
080: throw new TurbineRuntimeException("Could not parse " + prop
081: + " into a valid Date for the default value", e);
082: }
083: }
084:
085: /**
086: * Set the empty Value. This value is used if Intake
087: * maps a field to a parameter returned by the user and
088: * the corresponding field is either empty (empty string)
089: * or non-existant.
090: *
091: * @param prop The value to use if the field is empty.
092: */
093: public void setEmptyValue(String prop) {
094: emptyValue = null;
095:
096: if (prop == null) {
097: return;
098: }
099:
100: try {
101: emptyValue = getDate(prop);
102: } catch (ParseException e) {
103: throw new TurbineRuntimeException("Could not parse " + prop
104: + " into a valid Date for the empty value", e);
105: }
106: }
107:
108: /**
109: * A suitable validator.
110: *
111: * @return "DateStringValidator"
112: */
113: protected String getDefaultValidator() {
114: return DateStringValidator.class.getName();
115: }
116:
117: /**
118: * Sets the value of the field from data in the parser.
119: */
120: protected void doSetValue() {
121: if (isMultiValued) {
122: String[] inputs = parser.getStrings(getKey());
123: Date[] values = new Date[inputs.length];
124: for (int i = 0; i < inputs.length; i++) {
125: try {
126: values[i] = StringUtils.isNotEmpty(inputs[i]) ? getDate(inputs[i])
127: : (Date) getEmptyValue();
128: } catch (ParseException e) {
129: values[i] = null;
130: }
131: }
132: setTestValue(values);
133: } else {
134: String val = parser.getString(getKey());
135: try {
136: setTestValue(StringUtils.isNotEmpty(val) ? getDate(val)
137: : (Date) getEmptyValue());
138: } catch (ParseException e) {
139: setTestValue(null);
140: }
141: }
142: }
143:
144: /**
145: * Parses a test date string using the Validator if is exists and
146: * is an instance of DateStringValidator. Otherwise, DateFormat.parse()
147: * is used.
148: *
149: * @param dateString The string date to parse
150: * @return A <code>Date</code> object
151: * @throws ParseException The date could not be parsed.
152: */
153: private Date getDate(String dateString) throws ParseException {
154: Date date = null;
155: // FIXME: Canonicalize user-entered date strings.
156: if (validator != null
157: && validator instanceof DateStringValidator) {
158: date = ((DateStringValidator) validator).parse(dateString);
159: } else {
160: date = df.parse(dateString);
161: }
162: return date;
163: }
164:
165: /**
166: * returns a String representation
167: *
168: * @return a String representation
169: */
170: public String toString() {
171: String s = null;
172: Object value = getValue();
173: if (value == null) {
174: s = "";
175: } else if (value instanceof String) {
176: s = (String) value;
177: } else if (validator != null
178: && validator instanceof DateStringValidator) {
179: s = ((DateStringValidator) validator).format((Date) value);
180: } else {
181: s = df.format((Date) value);
182: }
183: return s;
184: }
185: }
|