001: /**
002: * ========================================
003: * JFreeReport : a free Java report library
004: * ========================================
005: *
006: * Project Info: http://reporting.pentaho.org/
007: *
008: * (C) Copyright 2000-2007, by Object Refinery Limited, 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: * $Id: AbstractExpression.java 3525 2007-10-16 11:43:48Z tmorgner $
027: * ------------
028: * (C) Copyright 2000-2005, by Object Refinery Limited.
029: * (C) Copyright 2005-2007, by Pentaho Corporation.
030: */package org.jfree.report.expressions;
031:
032: import java.util.Locale;
033:
034: import org.jfree.report.DataRow;
035: import org.jfree.report.flow.ReportContext;
036: import org.jfree.report.flow.ReportStructureRoot;
037: import org.jfree.report.i18n.ResourceBundleFactory;
038: import org.jfree.report.structure.Element;
039: import org.jfree.util.Configuration;
040:
041: /**
042: * A baseclass for simple, non-positionally parametrized expressions.
043: *
044: * @author Thomas Morgner
045: */
046: public abstract class AbstractExpression implements Expression {
047: private transient ExpressionRuntime runtime;
048: private String name;
049: private boolean deepTraversing;
050: private boolean precompute;
051: private boolean preserve;
052:
053: protected AbstractExpression() {
054: }
055:
056: /**
057: * Returns the name of the expression. An expression without a name cannot be
058: * referenced from outside the element.
059: *
060: * @return the function name.
061: */
062: public String getName() {
063: return name;
064: }
065:
066: /**
067: * Sets the name of the expression.
068: *
069: * @param name the name.
070: */
071: public void setName(final String name) {
072: this .name = name;
073: }
074:
075: /**
076: * Clones the expression, expression should be reinitialized after the
077: * cloning. <P> Expression maintain no state, cloning is done at the beginning
078: * of the report processing to disconnect the used expression from any other
079: * object space.
080: *
081: * @return A clone of this expression.
082: * @throws CloneNotSupportedException this should never happen.
083: */
084: public Object clone() throws CloneNotSupportedException {
085: return super .clone();
086: }
087:
088: /**
089: * Return a new instance of this expression. The copy is initialized and uses
090: * the same parameters as the original, but does not share any objects.
091: *
092: * @return a copy of this function.
093: */
094: public Expression getInstance() {
095: try {
096: final AbstractExpression abstractExpression = (AbstractExpression) clone();
097: abstractExpression.runtime = null;
098: return abstractExpression;
099: } catch (CloneNotSupportedException cne) {
100: return null;
101: }
102: }
103:
104: /**
105: * Defines the DataRow used in this expression. The dataRow is set when the
106: * report processing starts and can be used to access the values of functions,
107: * expressions and the reports datasource.
108: *
109: * @param runtime the runtime information for the expression
110: */
111: public void setRuntime(final ExpressionRuntime runtime) {
112: this .runtime = runtime;
113: }
114:
115: public ExpressionRuntime getRuntime() {
116: return runtime;
117: }
118:
119: /**
120: * Returns the current {@link DataRow}.
121: *
122: * @return the data row.
123: */
124: protected DataRow getDataRow() {
125: if (runtime == null) {
126: return null;
127: }
128: return runtime.getDataRow();
129: }
130:
131: protected ResourceBundleFactory getResourceBundleFactory() {
132: if (runtime == null) {
133: return null;
134: }
135: return runtime.getResourceBundleFactory();
136: }
137:
138: protected Configuration getReportConfiguration() {
139: if (runtime == null) {
140: return null;
141: }
142: return runtime.getConfiguration();
143: }
144:
145: protected Locale getParentLocale() {
146: if (runtime == null) {
147: return null;
148: }
149:
150: final Object declaringParent = runtime.getDeclaringParent();
151: if (declaringParent instanceof Element) {
152: final Element declaringElement = (Element) declaringParent;
153: return declaringElement.getLocale();
154: }
155:
156: final ReportContext reportContext = runtime.getReportContext();
157: final ReportStructureRoot reportStructureRoot = reportContext
158: .getReportStructureRoot();
159: return reportStructureRoot.getLocale();
160: }
161:
162: public boolean isPrecompute() {
163: return precompute;
164: }
165:
166: public void setPrecompute(final boolean precompute) {
167: this .precompute = precompute;
168: }
169:
170: public boolean isDeepTraversing() {
171: return deepTraversing;
172: }
173:
174: public void setDeepTraversing(final boolean deepTraversing) {
175: this .deepTraversing = deepTraversing;
176: }
177:
178: public boolean isPreserve() {
179: return preserve;
180: }
181:
182: public void setPreserve(final boolean preserve) {
183: this.preserve = preserve;
184: }
185: }
|