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: * ColumnAggregationExpression.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.util.ArrayList;
032: import java.util.Arrays;
033:
034: import org.jfree.report.DataRow;
035:
036: /**
037: * The base-class for all expressions that aggregate values from multiple columns.
038: *
039: * @author Thomas Morgner
040: */
041: public abstract class ColumnAggregationExpression extends
042: AbstractExpression {
043: /**
044: * An ordered list containing the fieldnames used in the expression.
045: */
046: private ArrayList fields;
047: /**
048: * A temporary array to reduce the number of object creations.
049: */
050: private transient Object[] fieldValues;
051:
052: /**
053: * Default Constructor.
054: */
055: protected ColumnAggregationExpression() {
056: fields = new ArrayList();
057: }
058:
059: /**
060: * Collects the values of all fields defined in the fieldList.
061: *
062: * @return an Object-array containing all defined values from the datarow
063: */
064: protected Object[] getFieldValues() {
065: final int size = fields.size();
066: if (fieldValues == null || fieldValues.length != size) {
067: fieldValues = new Object[size];
068: }
069:
070: final DataRow dataRow = getDataRow();
071: for (int i = 0; i < size; i++) {
072: final String field = (String) fields.get(i);
073: if (field != null) {
074: fieldValues[i] = dataRow.get(field);
075: }
076: }
077: return fieldValues;
078: }
079:
080: /**
081: * Defines the field in the field-list at the given index.
082: *
083: * @param index the position in the list, where the field should be defined.
084: * @param field the name of the field.
085: */
086: public void setField(final int index, final String field) {
087: if (fields.size() == index) {
088: fields.add(field);
089: } else {
090: fields.set(index, field);
091: }
092: this .fieldValues = null;
093: }
094:
095: /**
096: * Returns the defined field at the given index-position.
097: *
098: * @param index the position of the field name that should be queried.
099: * @return the field name at the given position.
100: */
101: public String getField(final int index) {
102: return (String) fields.get(index);
103: }
104:
105: /**
106: * Returns the number of fields defined in this expression.
107: * @return the number of fields.
108: */
109: public int getFieldCount() {
110: return fields.size();
111: }
112:
113: /**
114: * Returns all defined fields as array of strings.
115: *
116: * @return all the fields.
117: */
118: public String[] getField() {
119: return (String[]) fields.toArray(new String[fields.size()]);
120: }
121:
122: /**
123: * Defines all fields as array. This completely replaces any previously defined fields.
124: *
125: * @param fields the new list of fields.
126: */
127: public void setField(final String[] fields) {
128: this .fields.clear();
129: this .fields.addAll(Arrays.asList(fields));
130: this .fieldValues = null;
131: }
132:
133: /**
134: * Return a completly separated copy of this function. The copy does no longer share any changeable objects with the
135: * original function.
136: *
137: * @return a copy of this function.
138: */
139: public Expression getInstance() {
140: final ColumnAggregationExpression cae = (ColumnAggregationExpression) super
141: .getInstance();
142: cae.fields = (ArrayList) fields.clone();
143: return cae;
144: }
145: }
|