001: /*
002: * Copyright (c) 2003-2007 JGoodies Karsten Lentzsch. All Rights Reserved.
003: *
004: * Redistribution and use in source and binary forms, with or without
005: * modification, are permitted provided that the following conditions are met:
006: *
007: * o Redistributions of source code must retain the above copyright notice,
008: * this list of conditions and the following disclaimer.
009: *
010: * o 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: *
014: * o Neither the name of JGoodies Karsten Lentzsch nor the names of
015: * its contributors may be used to endorse or promote products derived
016: * from this software without specific prior written permission.
017: *
018: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
019: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
020: * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
021: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
022: * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
023: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
024: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
025: * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
026: * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
027: * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
028: * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
029: */
030:
031: package com.jgoodies.validation.formatter;
032:
033: import java.text.DateFormat;
034: import java.text.ParseException;
035: import java.util.Date;
036:
037: import javax.swing.text.DateFormatter;
038:
039: import com.jgoodies.validation.util.ValidationUtils;
040:
041: /**
042: * In addition to its superclass DateFormatter, this class converts
043: * to/from the empty string. Therefore it holds an <em>empty value</em>
044: * that is the counterpart of the empty string.
045: * The Method <code>#valueToString</code> converts the empty value to the
046: * empty string. And <code>#stringToValue</code> converts blank strings
047: * to the empty value. In all other cases the conversion is delegated
048: * to its superclass.<p>
049: *
050: * Often the empty value is <code>null</code>. As an alternative you can map
051: * the empty string to a given date, for example epoch (January 1, 1970).
052: *
053: * <strong>Examples:</strong><pre>
054: * new EmptyDateFormatter();
055: * new EmptyDateFormatter(new Date(0));
056: * </pre>
057: *
058: * @author Karsten Lentzsch
059: * @version $Revision: 1.5 $
060: *
061: * @see java.text.Format
062: */
063: public class EmptyDateFormatter extends DateFormatter {
064:
065: /**
066: * Holds the date that is converted to an empty string and
067: * that is the result of converting blank strings to a value.
068: *
069: * @see #stringToValue(String)
070: * @see #valueToString(Object)
071: */
072: private final Date emptyValue;
073:
074: // Instance Creation ****************************************************
075:
076: /**
077: * Constructs an EmptyDateFormatter that converts <code>null</code>
078: * to the empty string and vice versa.
079: */
080: public EmptyDateFormatter() {
081: this ((Date) null);
082: }
083:
084: /**
085: * Constructs an EmptyDateFormatter configured with the specified
086: * Format; maps <code>null</code> to the empty string and vice versa.
087: *
088: * @param format Format used to dictate legal values
089: */
090: public EmptyDateFormatter(DateFormat format) {
091: this (format, null);
092: }
093:
094: /**
095: * Constructs an EmptyDateFormatter that converts the given
096: * <code>emptyValue</code> to the empty string and vice versa.
097: *
098: * @param emptyValue the representation of the empty string
099: */
100: public EmptyDateFormatter(Date emptyValue) {
101: this .emptyValue = emptyValue == null ? null : new Date(
102: emptyValue.getTime());
103: }
104:
105: /**
106: * Constructs an EmptyDateFormatter configured with the specified
107: * Format; maps <code>null</code> to the given <code>emptyValue</code>
108: * and vice versa.
109: *
110: * @param format Format used to dictate legal values
111: * @param emptyValue the representation of the empty string
112: */
113: public EmptyDateFormatter(DateFormat format, Date emptyValue) {
114: super (format);
115: this .emptyValue = emptyValue == null ? null : new Date(
116: emptyValue.getTime());
117: }
118:
119: // Overriding Superclass Behavior *****************************************
120:
121: /**
122: * Returns the <code>Object</code> representation of the
123: * <code>String</code> <code>text</code>.<p>
124: *
125: * Unlike its superclass, this class converts blank strings
126: * to the empty value.
127: *
128: * @param text <code>String</code> to convert
129: * @return <code>Object</code> representation of text
130: * @throws ParseException if there is an error in the conversion
131: */
132: @Override
133: public Object stringToValue(String text) throws ParseException {
134: return ValidationUtils.isBlank(text) ? emptyValue : super
135: .stringToValue(text);
136: }
137:
138: /**
139: * Returns a String representation of the Object <code>value</code>.
140: * This invokes <code>format</code> on the current <code>Format</code>.<p>
141: *
142: * Unlike its superclass, this class converts the empty value
143: * to the empty string.
144: *
145: * @param value the value to convert
146: * @return a String representation of value
147: * @throws ParseException if there is an error in the conversion
148: */
149: @Override
150: public String valueToString(Object value) throws ParseException {
151: return ValidationUtils.equals(value, emptyValue) ? "" : super
152: .valueToString(value);
153: }
154:
155: }
|