001: /**
002: * ===========================================
003: * JFreeReport : a free Java reporting library
004: * ===========================================
005: *
006: * Project Info: http://reporting.pentaho.org/
007: *
008: * (C) Copyright 2001-2007, by Object Refinery Ltd, Pentaho Corporation and Contributors.
009: *
010: * This library is free software; you can redistribute it and/or modify it under the terms
011: * of the GNU Lesser General Public License as published by the Free Software Foundation;
012: * either version 2.1 of the License, or (at your option) any later version.
013: *
014: * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
015: * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
016: * See the GNU Lesser General Public License for more details.
017: *
018: * You should have received a copy of the GNU Lesser General Public License along with this
019: * library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
020: * Boston, MA 02111-1307, USA.
021: *
022: * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
023: * in the United States and other countries.]
024: *
025: * ------------
026: * SimpleDateFormatFilter.java
027: * ------------
028: * (C) Copyright 2001-2007, by Object Refinery Ltd, Pentaho Corporation and Contributors.
029: */package org.jfree.report.filter;
030:
031: import java.text.DateFormatSymbols;
032: import java.text.Format;
033: import java.text.SimpleDateFormat;
034: import java.util.Locale;
035:
036: import org.jfree.report.function.ExpressionRuntime;
037:
038: /**
039: * A filter that creates string from dates. This filter will format java.util. Date
040: * objects using a java.text.SimpleDateFormat to create the string representation for the
041: * date obtained from the datasource.
042: * <p/>
043: * If the object read from the datasource is no date, the NullValue defined by
044: * setNullValue(Object) is returned.
045: * <p/>
046: * This implementation uses a SimpleDateFormat and grants more control over the parsing
047: * results.
048: *
049: * @author Thomas Morgner
050: * @see java.text.SimpleDateFormat
051: */
052: public class SimpleDateFormatFilter extends DateFormatFilter {
053: /** The last locale used to convert numbers. */
054: private Locale lastLocale;
055: /** A flag indicating whether this filter should try to detect locales changes. */
056: private boolean keepState;
057:
058: /**
059: * DefaultConstructor.
060: */
061: public SimpleDateFormatFilter() {
062: setFormatter(new SimpleDateFormat());
063: }
064:
065: /**
066: * Returns the SimpleDateFormat object used in this filter.
067: *
068: * @return The date format object.
069: */
070: public SimpleDateFormat getSimpleDateFormat() {
071: return (SimpleDateFormat) getFormatter();
072: }
073:
074: /**
075: * Sets the date format for the filter.
076: *
077: * @param format The format.
078: * @throws NullPointerException if the format given is null
079: */
080: public void setSimpleDateFormat(final SimpleDateFormat format) {
081: super .setFormatter(format);
082: }
083:
084: /**
085: * Sets the date format for the filter. This narrows the allows formats down to
086: * SimpleDateFormat.
087: *
088: * @param format The format.
089: * @throws NullPointerException if the format given is null
090: * @throws ClassCastException if the format given is no DateFormat
091: */
092: public void setFormatter(final Format format) {
093: final SimpleDateFormat sdfmt = (SimpleDateFormat) format;
094: super .setFormatter(sdfmt);
095: }
096:
097: /**
098: * Returns the formatString for this SimpleDateFormat. For a more detailed explaination
099: * of SimpleDateFormat formatstrings see java.text.SimpleDateFormat.
100: *
101: * @return the format string for the used DateFormat.
102: *
103: * @see java.text.SimpleDateFormat
104: */
105: public String getFormatString() {
106: return getSimpleDateFormat().toPattern();
107: }
108:
109: /**
110: * defines the formatString for this SimpleDateFormat.
111: *
112: * @param format the formatString
113: * @throws IllegalArgumentException if the string is invalid
114: */
115: public void setFormatString(final String format) {
116: if (format == null) {
117: throw new NullPointerException();
118: }
119: getSimpleDateFormat().applyPattern(format);
120: invalidateCache();
121: }
122:
123: /**
124: * Returns a localized formatString for this SimpleDateFormat. For a more detailed
125: * explaination of SimpleDateFormat formatstrings see java.text.SimpleDateFormat.
126: *
127: * @return the localized format string.
128: *
129: * @see java.text.SimpleDateFormat
130: */
131: public String getLocalizedFormatString() {
132: return getSimpleDateFormat().toLocalizedPattern();
133: }
134:
135: /**
136: * defines the localized formatString for this SimpleDateFormat.
137: *
138: * @param format the formatString
139: * @throws IllegalArgumentException if the string is invalid
140: */
141: public void setLocalizedFormatString(final String format) {
142: getSimpleDateFormat().applyLocalizedPattern(format);
143: invalidateCache();
144: }
145:
146: /**
147: * Defines, whether the filter should keep its state, if a locale
148: * change is detected. This will effectivly disable the locale update.
149: *
150: * @return true, if the locale should not update the DateSymbols, false otherwise.
151: */
152: public boolean isKeepState() {
153: return keepState;
154: }
155:
156: /**
157: * Defines, whether the filter should keep its state, if a locale
158: * change is detected. This will effectivly disable the locale update.
159: *
160: * @param keepState set to true, if the locale should not update the DateSymbols, false otherwise.
161: */
162: public void setKeepState(final boolean keepState) {
163: this .keepState = keepState;
164: }
165:
166: /**
167: * Returns the formatted string. The value is read using the data source given and
168: * formated using the formatter of this object. The formating is guaranteed to completly
169: * form the object to an string or to return the defined NullValue.
170: * <p/>
171: * If format, datasource or object are null, the NullValue is returned.
172: *
173: * @param runtime the expression runtime that is used to evaluate formulas and expressions when computing the value of
174: * this filter.
175: * @return The formatted value.
176: */
177: public Object getValue(final ExpressionRuntime runtime) {
178: if (keepState == false && runtime != null) {
179: final Locale locale = runtime.getResourceBundleFactory()
180: .getLocale();
181: if (locale != lastLocale) {
182: lastLocale = locale;
183: getSimpleDateFormat().setDateFormatSymbols(
184: new DateFormatSymbols(locale));
185: invalidateCache();
186: }
187: }
188: return super .getValue(runtime);
189: }
190:
191: public FormatSpecification getFormatString(
192: final ExpressionRuntime runtime,
193: FormatSpecification formatSpecification) {
194: if (formatSpecification == null) {
195: formatSpecification = new FormatSpecification();
196: }
197: formatSpecification
198: .redefine(FormatSpecification.TYPE_DATE_FORMAT,
199: getFormatString());
200: return formatSpecification;
201: }
202:
203: }
|