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: GenericValueConverter.java 2725 2007-04-01 18:49:29Z taqua $
027     * ------------
028     * (C) Copyright 2000-2005, by Object Refinery Limited.
029     * (C) Copyright 2005-2007, by Pentaho Corporation.
030     */
031    package org.jfree.report.util.beans;
032    
033    import java.beans.IntrospectionException;
034    import java.beans.PropertyDescriptor;
035    import java.beans.PropertyEditor;
036    
037    /**
038     * A class that handles the conversion of {@link Integer} attributes to and from their
039     * {@link String} representation.
040     *
041     * @author Thomas Morgner
042     */
043    public class GenericValueConverter implements ValueConverter
044    {
045      private PropertyDescriptor propertyDescriptor;
046      private PropertyEditor propertyEditor;
047    
048      /**
049       * Creates a new value converter.
050       */
051      public GenericValueConverter (final PropertyDescriptor pd)
052              throws IntrospectionException
053      {
054        if (pd == null)
055        {
056          throw new NullPointerException("PropertyDescriptor must not be null.");
057        }
058        if (pd.getPropertyEditorClass() == null)
059        {
060          throw new IntrospectionException("Property has no editor.");
061        }
062        this.propertyDescriptor = pd;
063        this.propertyEditor = createPropertyEditor(pd);
064      }
065    
066      private PropertyEditor createPropertyEditor (final PropertyDescriptor pi)
067              throws IntrospectionException
068      {
069        final Class c = pi.getPropertyEditorClass();
070        try
071        {
072          return (PropertyEditor) c.newInstance();
073        }
074        catch (Exception e)
075        {
076          throw new IntrospectionException("Unable to create PropertyEditor.");
077        }
078      }
079    
080    
081      /**
082       * Converts the attribute to a string.
083       *
084       * @param o the attribute ({@link Integer} expected).
085       * @return A string representing the {@link Integer} value.
086       * @throws BeanException if there was an error during the conversion.
087       */
088      public String toAttributeValue (final Object o) throws BeanException
089      {
090        if (BeanUtility.getPropertyType(propertyDescriptor).isInstance(o) == false)
091        {
092          throw new ClassCastException("Give me a real type.");
093        }
094    
095        propertyEditor.setValue(o);
096        return propertyEditor.getAsText();
097      }
098    
099      /**
100       * Converts a string to a {@link Integer}.
101       *
102       * @param s the string.
103       * @return a {@link Integer}.
104       */
105      public Object toPropertyValue (final String s)
106      {
107        propertyEditor.setAsText(s);
108        return propertyEditor.getValue();
109      }
110    }