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: RunningExpressionSlot.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.data;
031:
032: import org.jfree.report.DataRow;
033: import org.jfree.report.DataSourceException;
034: import org.jfree.report.ReportData;
035: import org.jfree.report.expressions.Expression;
036: import org.jfree.report.expressions.ExpressionRuntime;
037: import org.jfree.report.expressions.Function;
038: import org.jfree.report.flow.ReportContext;
039: import org.jfree.report.i18n.ResourceBundleFactory;
040: import org.jfree.util.Configuration;
041:
042: /**
043: * Creation-Date: 25.11.2006, 15:18:58
044: *
045: * @author Thomas Morgner
046: */
047: public class RunningExpressionSlot implements ExpressionSlot,
048: ExpressionRuntime {
049: private StaticExpressionRuntimeData staticRuntimeData;
050: private Expression expression;
051: private Object value;
052: private String name;
053: private boolean queried;
054: private DataRow dataRow;
055:
056: public RunningExpressionSlot(final Expression expression,
057: final StaticExpressionRuntimeData runtimeData,
058: final PrecomputeNode precomputeNode) {
059: this .staticRuntimeData = runtimeData;
060: this .expression = expression;
061: this .name = expression.getName();
062: this .expression.setRuntime(this );
063: this .expression.setRuntime(null);
064: }
065:
066: public Expression getExpression() {
067: return expression;
068: }
069:
070: public Object getValue() throws DataSourceException {
071: if (queried == false) {
072: //noinspection SynchronizeOnNonFinalField
073: synchronized (expression) {
074: expression.setRuntime(this );
075: value = expression.computeValue();
076: expression.setRuntime(null);
077: }
078: queried = true;
079: }
080: return value;
081: }
082:
083: public String getName() {
084: return name;
085: }
086:
087: public DataRow getDataRow() {
088: return dataRow;
089: }
090:
091: public Object clone() throws CloneNotSupportedException {
092: return super .clone();
093: }
094:
095: public void updateDataRow(final DataRow dataRow) {
096: this .dataRow = dataRow;
097: }
098:
099: /**
100: * Returns the report data used in this section. If subreports are used, this
101: * does not reflect the complete report data.
102: * <p/>
103: * All access to the report data must be properly synchronized. Failure to do
104: * so may result in funny results. Do not assume that the report data will be
105: * initialized on the current cursor positon.
106: *
107: * @return
108: */
109: public ReportData getData() {
110: return staticRuntimeData.getData();
111: }
112:
113: public Object getDeclaringParent() {
114: return staticRuntimeData.getDeclaringParent();
115: }
116:
117: public Configuration getConfiguration() {
118: return staticRuntimeData.getConfiguration();
119: }
120:
121: public ResourceBundleFactory getResourceBundleFactory() {
122: return staticRuntimeData.getResourceBundleFactory();
123: }
124:
125: public void advance() throws DataSourceException {
126: if (expression instanceof Function) {
127: final Function f = (Function) expression;
128: expression.setRuntime(this );
129: expression = f.advance();
130: f.setRuntime(null);
131: expression.setRuntime(null);
132: }
133: value = null;
134: queried = false;
135: }
136:
137: public boolean isDeepTraversing() {
138: return expression.isDeepTraversing();
139: }
140:
141: public int getCurrentRow() {
142: return staticRuntimeData.getCurrentRow();
143: }
144:
145: public ReportContext getReportContext() {
146: return staticRuntimeData.getReportContext();
147: }
148:
149: public boolean isPreserve() {
150: return expression.isPreserve();
151: }
152: }
|