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: * MessageFormatFilter.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.util.Locale;
032:
033: import org.jfree.report.ResourceBundleFactory;
034: import org.jfree.report.function.ExpressionRuntime;
035: import org.jfree.util.ObjectUtilities;
036:
037: /**
038: * A filter that formats values from a data source to a string representation.
039: * <p/>
040: * This filter will format objects using a {@link java.text.MessageFormat} to create the string representation for the
041: * number obtained from the datasource.
042: *
043: * @author Joerg Schaible
044: * @author Thomas Morgner
045: * @see java.text.MessageFormat
046: */
047: public class MessageFormatFilter implements DataSource {
048:
049: /**
050: * The message format support translates raw message strings into useable MessageFormat parameters and read the
051: * necessary input data from the datarow.
052: */
053: private MessageFormatSupport messageFormatSupport;
054: /**
055: * The current locale.
056: */
057: private transient Locale locale;
058:
059: /**
060: * Default constructor. <P> Uses a general number format for the current locale.
061: */
062: public MessageFormatFilter() {
063: messageFormatSupport = new MessageFormatSupport();
064: }
065:
066: /**
067: * Defines the format string for the {@link java.text.MessageFormat} object used in this implementation.
068: *
069: * @param format the message format.
070: */
071: public void setFormatString(final String format) {
072: messageFormatSupport.setFormatString(format);
073: }
074:
075: /**
076: * Returns the format string used in the message format.
077: *
078: * @return the format string.
079: */
080: public String getFormatString() {
081: return messageFormatSupport.getFormatString();
082: }
083:
084: /**
085: * Returns the formatted string. The value is read using the data source given and formated using the formatter of
086: * this object. The formating is guaranteed to completly form the object to an string or to return the defined
087: * NullValue.
088: * <p/>
089: * If format, datasource or object are null, the NullValue is returned.
090: *
091: * @param runtime the expression runtime that is used to evaluate formulas and expressions when computing the value of
092: * this filter.
093: * @return The formatted value.
094: */
095: public Object getValue(final ExpressionRuntime runtime) {
096: if (runtime == null) {
097: return null;
098: }
099: final ResourceBundleFactory resourceBundleFactory = runtime
100: .getResourceBundleFactory();
101: final Locale newLocale = resourceBundleFactory.getLocale();
102: if (ObjectUtilities.equal(newLocale, locale) == false) {
103: messageFormatSupport.setLocale(resourceBundleFactory
104: .getLocale());
105: locale = newLocale;
106: }
107: return messageFormatSupport.performFormat(runtime.getDataRow());
108: }
109:
110: /**
111: * Clones this <code>DataSource</code>.
112: *
113: * @return the clone.
114: * @throws CloneNotSupportedException this should never happen.
115: */
116: public Object clone() throws CloneNotSupportedException {
117: final MessageFormatFilter mf = (MessageFormatFilter) super
118: .clone();
119: mf.messageFormatSupport = (MessageFormatSupport) messageFormatSupport
120: .clone();
121: return mf;
122: }
123:
124: /**
125: * Returns the replacement text if one of the referenced fields in the message is null.
126: *
127: * @return the replacement string for null-values.
128: */
129: public String getNullString() {
130: return messageFormatSupport.getNullString();
131: }
132:
133: /**
134: * Defines the replacement text that is used, if one of the referenced fields in the message is null.
135: *
136: * @param nullString the replacement string for null-values.
137: */
138: public void setNullString(final String nullString) {
139: this.messageFormatSupport.setNullString(nullString);
140: }
141: }
|