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: ConverterRegistry.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     */
031    package org.jfree.report.util.beans;
032    
033    import java.awt.Color;
034    import java.math.BigDecimal;
035    import java.math.BigInteger;
036    import java.util.HashMap;
037    
038    public final class ConverterRegistry
039    {
040      private static ConverterRegistry instance;
041      private HashMap registeredClasses;
042    
043      public static synchronized ConverterRegistry getInstance ()
044      {
045        if (instance == null)
046        {
047          instance = new ConverterRegistry();
048        }
049        return instance;
050      }
051    
052      private ConverterRegistry ()
053      {
054        registeredClasses = new HashMap();
055        registeredClasses.put(BigDecimal.class, new BigDecimalValueConverter());
056        registeredClasses.put(BigInteger.class, new BigIntegerValueConverter());
057        registeredClasses.put(Boolean.class, new BooleanValueConverter());
058        registeredClasses.put(Boolean.TYPE, new BooleanValueConverter());
059        registeredClasses.put(Byte.class, new ByteValueConverter());
060        registeredClasses.put(Byte.TYPE, new ByteValueConverter());
061        registeredClasses.put(Character.class, new CharacterValueConverter());
062        registeredClasses.put(Character.TYPE, new CharacterValueConverter());
063        registeredClasses.put(Color.class, new ColorValueConverter());
064        registeredClasses.put(Double.class, new DoubleValueConverter());
065        registeredClasses.put(Double.TYPE, new DoubleValueConverter());
066        registeredClasses.put(Float.class, new FloatValueConverter());
067        registeredClasses.put(Float.TYPE, new FloatValueConverter());
068        registeredClasses.put(Integer.class, new IntegerValueConverter());
069        registeredClasses.put(Integer.TYPE, new IntegerValueConverter());
070        registeredClasses.put(Long.class, new LongValueConverter());
071        registeredClasses.put(Long.TYPE, new LongValueConverter());
072        registeredClasses.put(Short.class, new ShortValueConverter());
073        registeredClasses.put(Short.TYPE, new ShortValueConverter());
074        registeredClasses.put(String.class, new StringValueConverter());
075        registeredClasses.put(Number.class, new BigDecimalValueConverter());
076        registeredClasses.put(Class.class, new ClassValueConverter());
077      }
078    
079      public ValueConverter getValueConverter (final Class c)
080      {
081        final ValueConverter plain = (ValueConverter) registeredClasses.get(c);
082        if (plain != null)
083        {
084          return plain;
085        }
086        if (c.isArray())
087        {
088          final Class componentType = c.getComponentType();
089          final ValueConverter componentConverter = getValueConverter(componentType);
090          if (componentConverter != null)
091          {
092            return new ArrayValueConverter(componentType, componentConverter);
093          }
094        }
095        return null;
096      }
097    
098      /**
099       * Converts an object to an attribute value.
100       *
101       * @param o the object.
102       * @return the attribute value.
103       * @throws BeanException if there was an error during the conversion.
104       */
105      public static String toAttributeValue (final Object o) throws BeanException
106      {
107        if (o == null)
108        {
109          return null;
110        }
111        final ValueConverter vc =
112                ConverterRegistry.getInstance().getValueConverter(o.getClass());
113        if (vc == null)
114        {
115          return null;
116        }
117        return vc.toAttributeValue(o);
118      }
119    
120      /**
121       * Converts a string to a property value.
122       *
123       * @param s the string.
124       * @return a property value.
125       * @throws BeanException if there was an error during the conversion.
126       */
127      public static Object toPropertyValue (final String s, final Class c) throws BeanException
128      {
129        if (s == null)
130        {
131          return null;
132        }
133        final ValueConverter vc =
134                ConverterRegistry.getInstance().getValueConverter(c);
135        if (vc == null)
136        {
137          return null;
138        }
139        return vc.toPropertyValue(s);
140      }
141    
142    }