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: ArrayValueConverter.java 3048 2007-07-28 18:02:42Z tmorgner $
027: * ------------
028: * (C) Copyright 2000-2005, by Object Refinery Limited.
029: * (C) Copyright 2005-2007, by Pentaho Corporation.
030: */package org.jfree.report.util.beans;
031:
032: import java.lang.reflect.Array;
033: import java.util.ArrayList;
034:
035: import org.jfree.report.util.CSVTokenizer;
036:
037: /**
038: * An ValueConverter that handles Arrays. Conversion to arrays is done
039: * using a CSV string.
040: *
041: * @author Thomas Morgner
042: */
043: public class ArrayValueConverter implements ValueConverter {
044: /** The converter for the array elements. */
045: private ValueConverter elementConverter;
046: /** The element type. */
047: private Class elementType;
048:
049: /**
050: * Creates a new ArrayValueConverter for the given element type and
051: * array type.
052: * @param arrayClass the array type
053: * @param elementConverter the value converter for the array elements.
054: */
055: public ArrayValueConverter(final Class arrayClass,
056: final ValueConverter elementConverter) {
057: if (elementConverter == null) {
058: throw new NullPointerException(
059: "elementConverter must not be null");
060: }
061: if (arrayClass == null) {
062: throw new NullPointerException(
063: "arrayClass must not be null");
064: }
065: this .elementType = arrayClass;
066: this .elementConverter = elementConverter;
067: }
068:
069: /**
070: * Converts an object to an attribute value.
071: *
072: * @param o the object.
073: * @return the attribute value.
074: * @throws BeanException if there was an error during the conversion.
075: */
076: public String toAttributeValue(final Object o) throws BeanException {
077: final int size = Array.getLength(o);
078: final StringBuffer buffer = new StringBuffer();
079: for (int i = 0; i < size; i++) {
080: if (i != 0) {
081: buffer.append(",");
082: }
083: buffer.append(elementConverter.toAttributeValue(Array.get(
084: o, i)));
085: }
086: return buffer.toString();
087: }
088:
089: /**
090: * Converts a string to a property value.
091: *
092: * @param s the string.
093: * @return a property value.
094: * @throws BeanException if there was an error during the conversion.
095: */
096: public Object toPropertyValue(final String s) throws BeanException {
097: final CSVTokenizer tokenizer = new CSVTokenizer(s);
098: final ArrayList elements = new ArrayList();
099: while (tokenizer.hasMoreTokens()) {
100: final String token = tokenizer.nextToken();
101: elements.add(elementConverter.toPropertyValue(token));
102: }
103: final Object retval = Array.newInstance(elementType, elements
104: .size());
105: for (int i = 0; i < elements.size(); i++) {
106: final Object o = elements.get(i);
107: Array.set(retval, i, o);
108: }
109: return retval;
110: }
111: }
|