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: * ConvertToDateExpression.java
027: * ------------
028: * (C) Copyright 2001-2007, by Object Refinery Ltd, Pentaho Corporation and Contributors.
029: */package org.jfree.report.function;
030:
031: import java.text.DateFormat;
032: import java.text.DateFormatSymbols;
033: import java.text.ParseException;
034: import java.text.SimpleDateFormat;
035: import java.util.Date;
036: import java.util.Locale;
037:
038: import org.jfree.report.DataRow;
039: import org.jfree.report.ResourceBundleFactory;
040: import org.jfree.util.ObjectUtilities;
041:
042: /**
043: * Parses a string into a date using the given date-format.
044: *
045: * @author Thomas Morgner
046: * @see java.text.SimpleDateFormat
047: */
048: public class ConvertToDateExpression extends AbstractExpression {
049: /**
050: * The name of the data-row column from where to read the string that should be parsed.
051: */
052: private String field;
053: /**
054: * The date-format that is used for the parsing.
055: */
056: private String format;
057: /**
058: * The locale. If undefined, the report's locale is used.
059: */
060: private Locale locale;
061:
062: /**
063: * A variable that caches the last dateformat object used.
064: */
065: private transient DateFormat dateFormat;
066: /**
067: * A variable that caches the last locale object used.
068: */
069: private transient Locale lastLocale;
070:
071: /**
072: * Default Constructor.
073: */
074: public ConvertToDateExpression() {
075: }
076:
077: /**
078: * Returns the name of the data-row column from where to read the string that should be parsed.
079: *
080: * @return the field name.
081: */
082: public String getField() {
083: return field;
084: }
085:
086: /**
087: * Defines the name of the data-row column from where to read the string that should be parsed.
088: *
089: * @param field the name of the field.
090: */
091: public void setField(final String field) {
092: this .field = field;
093: }
094:
095: /**
096: * Returns the SimpleDateFormat pattern that is used for the parsing.
097: *
098: * @return the pattern string.
099: * @see java.text.SimpleDateFormat
100: */
101: public String getFormat() {
102: return format;
103: }
104:
105: /**
106: * Defines the SimpleDateFormat pattern that is used for the parsing.
107: *
108: * @param format the pattern string.
109: * @see java.text.SimpleDateFormat
110: */
111: public void setFormat(final String format) {
112: this .format = format;
113: this .lastLocale = null;
114: this .dateFormat = null;
115: }
116:
117: /**
118: * Returns the locale that is used for the parsing.
119: *
120: * @return the locale.
121: */
122: public Locale getLocale() {
123: return locale;
124: }
125:
126: /**
127: * Defines the locale that is used for the parsing.
128: *
129: * @param locale the locale.
130: */
131: public void setLocale(final Locale locale) {
132: this .locale = locale;
133: this .lastLocale = null;
134: this .dateFormat = null;
135: }
136:
137: /**
138: * Parses the value read from the column specified by the given field-name and tries to parse it into a Date
139: * using the given SimpleDateFormat-pattern.
140: *
141: * @return the value of the function.
142: */
143: public Object getValue() {
144: final DataRow dataRow = getDataRow();
145: // get the row directly as a Number
146: final Object o = dataRow.get(field);
147: // check if that thing is a Number
148: if (o instanceof Date) {
149: return o;
150: }
151:
152: // get a string and convert
153: try {
154: Locale localeUsed = locale;
155: if (localeUsed == null) {
156: localeUsed = getResourceBundleFactory().getLocale();
157: }
158:
159: final DateFormat format;
160: if (dateFormat == null
161: || ObjectUtilities.equal(localeUsed, lastLocale) == false) {
162: final String formatString = getFormat();
163: if (formatString == null || formatString.length() == 0) {
164: format = DateFormat.getDateInstance(
165: DateFormat.DEFAULT, localeUsed);
166: dateFormat = format;
167: lastLocale = localeUsed;
168: } else {
169: final SimpleDateFormat sformat = new SimpleDateFormat(
170: formatString);
171: if (locale != null) {
172: sformat
173: .setDateFormatSymbols(new DateFormatSymbols(
174: locale));
175: } else {
176: final ResourceBundleFactory factory = getResourceBundleFactory();
177: sformat
178: .setDateFormatSymbols(new DateFormatSymbols(
179: factory.getLocale()));
180: }
181: format = sformat;
182: dateFormat = sformat;
183: lastLocale = localeUsed;
184: }
185: } else {
186: format = dateFormat;
187: }
188: return format.parse(String.valueOf(o));
189: } catch (ParseException e) {
190: return null;
191: }
192: }
193:
194: }
|