Now that 1.6.1 has been released, I'm wondering if there is any interest in this.
Thanks,
-Erik
> ----- Message from [EMAIL PROTECTED] ---------
> Date: Wed, 12 Feb 2003 17:06:42 +0000
> From: "[EMAIL PROTECTED]" <[EMAIL PROTECTED]>
> Reply-To: Jakarta Commons Developers List <[EMAIL PROTECTED]>
> Subject: [PATCH] [BeanUtils] Addition of ConverterSet
> To: "[EMAIL PROTECTED]" <[EMAIL PROTECTED]>
>
> The issue:
> I ran into a problem because I needed to handle the conversion going from my view
>beans to my dto beans differently than going from my dto beans to my view beans.
>
> The Solution:
> I added a new class, called a ConverterSet, which maintains a set of converters. A
>programmer may create multiple ConverterSets, and then pass in the appropriate
>ConvertSet for the task at hand.
>
> Other Comments:
> This is more of a 'preview' patch- just to get a feel for suggestions/comments/etc.
>I can take suggestions and work them in, then submit a final patch -- assuming there
>happens to be some interest in this feature. I didn't update much (if any) of the
>existing javadoc- I'm waiting to get some feedback so I don't spend too much effort
>on things that may change.
>
> I also realize you are in the middle of a beanutils release, I hope my timing for
>submitting this does not interfere.
>
> =======================================================================
>
>
> An overview of the changes:
>
> ConvertUtils:
> -removed the member variable "converters" and replaced it with a "converterSets"
>variable, which now holds ConverterSet objects. There is a default ConverterSet
>object created, which contains all the default Converters.
> -changed lookup/register/deregister/etc to operate on the Default ConverterSet object
> -Added methods "addConverterSet", "removeConverterSet", "getConverterSet"
> -moved default values to ConverterSet
> -removed deprecated getter/setters ( I will add these back in, if they are going to
>be in the next release.)
>
> ConverterSet
> -contains a FastHashMap which holds all of the converters associated with this
>ConverterSet
> -Each ConverterSet has a full set of converters (i.e. there is no hierarchy, if two
>ConverterSets share the same Converter object, it must be registered with both)
> -Converters are registered/deregistered directly on the ConverterSet
>
> BeanUtils
> -Added new method signatures for (almost) all methods, which takes an additional
>parameter- a ConverterSet. If the old method signature is used (w/o passing in a
>ConverterSet) the default ConverterSet is used.
> -Existing behavior of methods has not been altered
>
> LocaleBeanUtils
> -Added a (String) cast for method invocations involving the null parameter (needed
>due to changes made in BeanUtils)
> -Additional things may have to be added in this class to allow it to work with
>ConverterSets as well
>
> TestCases
> -I have some test cases that are coupled with my current application. I will break
>those away so they can be included. (all current tests still pass)
>
> =======================================================================
>
>
>
> Example usage with a custom ConverterSet:
> -----------------------------------------
> setup:
>
> ConverterSet toDto = new ConverterSet("TO_DTO");
> ConvertUtils.addConverterSet(toDto);
>
> toDto.register(new CustomSqlDateConverter(), java.sql.Date.class);
>
> usage:
>
> ConverterSet toDto = ConvertUtils.getConverterSet("TO_DTO");
> BeanUtils.copyProperties(dest, source, toDto);
>
>
>
> Old usage still works (uses the default ConverterSet):
> ------------------------------------------------------
> setup:
>
> ConvertUtils.register(new CustomSqlDateConverter(), java.sql.Date.class);
>
> usage:
>
> BeanUtils.copyProperties(dest, source);
>
>
> which is also functionaly equivalent to:
>
> alternate setup:
>
> ConverterSet toDto = ConvertUtils.getDefaultConverterSet(); // same as: ConverterSet
>toDto = ConvertUtils.getConverterSet(ConverterSet.DEFAULT_CONVERTER_SET_NAME)
> toDto.register(new CustomSqlDateConverter(), java.sql.Date.class);
>
> alternate usage:
>
> ConverterSet toDto = ConvertUtils.getDefaultConverterSet();
> BeanUtils.copyProperties(dest, source, toDto);
>
>
> =======================================================================
>
> The Code:
>
> (The original files were taken from cvs HEAD about a week ago)
>
> --- BeanUtils.java.orig 2003-02-12 10:45:11.000000000 -0600
> +++ BeanUtils.java 2003-02-12 10:45:13.000000000 -0600
> @@ -215,6 +215,13 @@
> public static void copyProperties(Object dest, Object orig)
> throws IllegalAccessException, InvocationTargetException {
>
> + copyProperties(dest,orig, ConvertUtils.getDefaultConverterSet());
> +
> + }
> +
> + public static void copyProperties(Object dest, Object orig, ConverterSet set)
> + throws IllegalAccessException, InvocationTargetException {
> +
> // Validate existence of the specified beans
> if (dest == null) {
> throw new IllegalArgumentException
> @@ -236,7 +243,7 @@
> String name = origDescriptors[i].getName();
> if (PropertyUtils.isWriteable(dest, name)) {
> Object value = ((DynaBean) orig).get(name);
> - copyProperty(dest, name, value);
> + copyProperty(dest, name, value, set);
> }
> }
> } else if (orig instanceof Map) {
> @@ -245,7 +252,7 @@
> String name = (String) names.next();
> if (PropertyUtils.isWriteable(dest, name)) {
> Object value = ((Map) orig).get(name);
> - copyProperty(dest, name, value);
> + copyProperty(dest, name, value, set);
> }
> }
> } else /* if (orig is a standard JavaBean) */ {
> @@ -261,7 +268,7 @@
> try {
> Object value =
> PropertyUtils.getSimpleProperty(orig, name);
> - copyProperty(dest, name, value);
> + copyProperty(dest, name, value, set);
> } catch (NoSuchMethodException e) {
> ; // Should not happen
> }
> @@ -305,7 +312,11 @@
> */
> public static void copyProperty(Object bean, String name, Object value)
> throws IllegalAccessException, InvocationTargetException {
> + copyProperty(bean,name,value,ConvertUtils.getDefaultConverterSet() );
> + }
>
> + public static void copyProperty(Object bean, String name, Object value,
>ConverterSet set)
> + throws IllegalAccessException, InvocationTargetException {
> // Trace logging (if enabled)
> if (log.isTraceEnabled()) {
> StringBuffer sb = new StringBuffer(" copyProperty(");
> @@ -417,7 +428,7 @@
>
> // Convert the specified value to the required type and store it
> if (index >= 0) { // Destination must be indexed
> - Converter converter = ConvertUtils.lookup(type.getComponentType());
> + Converter converter = set.lookup(type.getComponentType());
> if (converter != null) {
> log.trace(" USING CONVERTER " + converter);
> value = converter.convert(type, value);
> @@ -441,7 +452,7 @@
> (e, "Cannot set " + propName);
> }
> } else { // Destination must be simple
> - Converter converter = ConvertUtils.lookup(type);
> + Converter converter = set.lookup(type);
> if (converter != null) {
> log.trace(" USING CONVERTER " + converter);
> value = converter.convert(type, value);
> @@ -477,22 +488,30 @@
> throws IllegalAccessException, InvocationTargetException,
> NoSuchMethodException {
>
> + return describe(bean, ConvertUtils.getDefaultConverterSet());
> +
> + }
> +
> + public static Map describe(Object bean, ConverterSet set)
> + throws IllegalAccessException, InvocationTargetException,
> + NoSuchMethodException {
> +
> if (bean == null) {
> // return (Collections.EMPTY_MAP);
> return (new java.util.HashMap());
> }
> -
> +
> if (log.isDebugEnabled()) {
> log.debug("Describing bean: " + bean.getClass().getName());
> }
> -
> +
> Map description = new HashMap();
> if (bean instanceof DynaBean) {
> DynaProperty descriptors[] =
> ((DynaBean) bean).getDynaClass().getDynaProperties();
> for (int i = 0; i < descriptors.length; i++) {
> String name = descriptors[i].getName();
> - description.put(name, getProperty(bean, name));
> + description.put(name, getProperty(bean, name,set));
> }
> } else {
> PropertyDescriptor descriptors[] =
> @@ -500,7 +519,7 @@
> for (int i = 0; i < descriptors.length; i++) {
> String name = descriptors[i].getName();
> if (descriptors[i].getReadMethod() != null)
> - description.put(name, getProperty(bean, name));
> + description.put(name, getProperty(bean, name,set));
> }
> }
> return (description);
> @@ -583,9 +602,15 @@
> public static String getIndexedProperty(Object bean, String name)
> throws IllegalAccessException, InvocationTargetException,
> NoSuchMethodException {
> + return getIndexedProperty(bean,name,ConvertUtils.getDefaultConverterSet());
> + }
> +
> + public static String getIndexedProperty(Object bean, String name, ConverterSet
>set)
> + throws IllegalAccessException, InvocationTargetException,
> + NoSuchMethodException {
>
> Object value = PropertyUtils.getIndexedProperty(bean, name);
> - return (ConvertUtils.convert(value));
> + return (ConvertUtils.convert(value, set));
>
> }
>
> @@ -611,8 +636,17 @@
> throws IllegalAccessException, InvocationTargetException,
> NoSuchMethodException {
>
> + return
>getIndexedProperty(bean,name,index,ConvertUtils.getDefaultConverterSet());
> +
> + }
> +
> + public static String getIndexedProperty(Object bean,
> + String name, int index, ConverterSet
>set)
> + throws IllegalAccessException, InvocationTargetException,
> + NoSuchMethodException {
> +
> Object value = PropertyUtils.getIndexedProperty(bean, name, index);
> - return (ConvertUtils.convert(value));
> + return (ConvertUtils.convert(value,set));
>
> }
>
> @@ -639,8 +673,16 @@
> throws IllegalAccessException, InvocationTargetException,
> NoSuchMethodException {
>
> + return getMappedProperty(bean,name,ConvertUtils.getDefaultConverterSet());
> +
> + }
> +
> + public static String getMappedProperty(Object bean, String name, ConverterSet
>set)
> + throws IllegalAccessException, InvocationTargetException,
> + NoSuchMethodException {
> +
> Object value = PropertyUtils.getMappedProperty(bean, name);
> - return (ConvertUtils.convert(value));
> + return (ConvertUtils.convert(value,set));
>
> }
>
> @@ -665,9 +707,16 @@
> String name, String key)
> throws IllegalAccessException, InvocationTargetException,
> NoSuchMethodException {
> + return
>getMappedProperty(bean,name,key,ConvertUtils.getDefaultConverterSet());
> + }
> +
> + public static String getMappedProperty(Object bean,
> + String name, String key, ConverterSet
>set)
> + throws IllegalAccessException, InvocationTargetException,
> + NoSuchMethodException {
>
> Object value = PropertyUtils.getMappedProperty(bean, name, key);
> - return (ConvertUtils.convert(value));
> + return (ConvertUtils.convert(value,set));
>
> }
>
> @@ -691,9 +740,15 @@
> public static String getNestedProperty(Object bean, String name)
> throws IllegalAccessException, InvocationTargetException,
> NoSuchMethodException {
> + return getNestedProperty(bean,name,ConvertUtils.getDefaultConverterSet());
> + }
> +
> + public static String getNestedProperty(Object bean, String name,ConverterSet
>set)
> + throws IllegalAccessException, InvocationTargetException,
> + NoSuchMethodException {
>
> Object value = PropertyUtils.getNestedProperty(bean, name);
> - return (ConvertUtils.convert(value));
> + return (ConvertUtils.convert(value,set));
>
> }
>
> @@ -717,7 +772,15 @@
> throws IllegalAccessException, InvocationTargetException,
> NoSuchMethodException {
>
> - return (getNestedProperty(bean, name));
> + return getProperty(bean,name,ConvertUtils.getDefaultConverterSet());
> +
> + }
> +
> + public static String getProperty(Object bean, String name, ConverterSet set)
> + throws IllegalAccessException, InvocationTargetException,
> + NoSuchMethodException {
> +
> + return (getNestedProperty(bean, name,set));
>
> }
>
> @@ -740,8 +803,16 @@
> throws IllegalAccessException, InvocationTargetException,
> NoSuchMethodException {
>
> + return getSimpleProperty(bean,name,ConvertUtils.getDefaultConverterSet());
> +
> + }
> +
> + public static String getSimpleProperty(Object bean, String name,ConverterSet
>set)
> + throws IllegalAccessException, InvocationTargetException,
> + NoSuchMethodException {
> +
> Object value = PropertyUtils.getSimpleProperty(bean, name);
> - return (ConvertUtils.convert(value));
> + return (ConvertUtils.convert(value,set));
>
> }
>
> @@ -754,14 +825,14 @@
> * <code>int</code>, <code>long</code>, <code>float</code>, and
> * <code>double</code>. In addition, array setters for these types (or the
> * corresponding primitive types) can also be identified.</p>
> - *
> + *
> * <p>The particular setter method to be called for each property is
> * determined using the usual JavaBeans introspection mechanisms. Thus,
> * you may identify custom setter methods using a BeanInfo class that is
> * associated with the class of the bean itself. If no such BeanInfo
> * class is available, the standard method name conversion ("set" plus
> * the capitalized name of the property in question) is used.</p>
> - *
> + *
> * <p><strong>NOTE</strong>: It is contrary to the JavaBeans Specification
> * to have more than one setter method (with different argument
> * signatures) for the same property.</p>
> @@ -784,6 +855,12 @@
> public static void populate(Object bean, Map properties)
> throws IllegalAccessException, InvocationTargetException {
>
> + populate(bean, properties, ConvertUtils.getDefaultConverterSet());
> +
> + }
> +
> + public static void populate(Object bean, Map properties, ConverterSet set)
> + throws IllegalAccessException, InvocationTargetException {
> // Do nothing unless both arguments have been specified
> if ((bean == null) || (properties == null)) {
> return;
> @@ -805,7 +882,7 @@
> Object value = properties.get(name);
>
> // Perform the assignment for this property
> - setProperty(bean, name, value);
> + setProperty(bean, name, value, set);
>
> }
>
> @@ -816,7 +893,7 @@
> * <p>Set the specified property value, performing type conversions as
> * required to conform to the type of the destination property.</p>
> *
> - * <p>If the property is read only then the method returns
> + * <p>If the property is read only then the method returns
> * without throwing an exception.</p>
> *
> * <p>If <code>null</code> is passed into a property expecting a primitive
>value,
> @@ -845,6 +922,13 @@
> public static void setProperty(Object bean, String name, Object value)
> throws IllegalAccessException, InvocationTargetException {
>
> + setProperty(bean,name,value,ConvertUtils.getDefaultConverterSet());
> +
> + }
> +
> + public static void setProperty(Object bean, String name, Object value,
>ConverterSet set)
> + throws IllegalAccessException, InvocationTargetException {
> +
> // Trace logging (if enabled)
> if (log.isTraceEnabled()) {
> StringBuffer sb = new StringBuffer(" setProperty(");
> @@ -974,34 +1058,34 @@
> if (value == null) {
> String values[] = new String[1];
> values[0] = (String) value;
> - newValue = ConvertUtils.convert((String[]) values, type);
> + newValue = ConvertUtils.convert((String[]) values, type, set);
> } else if (value instanceof String) {
> String values[] = new String[1];
> values[0] = (String) value;
> - newValue = ConvertUtils.convert((String[]) values, type);
> + newValue = ConvertUtils.convert((String[]) values, type, set);
> } else if (value instanceof String[]) {
> - newValue = ConvertUtils.convert((String[]) value, type);
> + newValue = ConvertUtils.convert((String[]) value, type, set);
> } else {
> newValue = value;
> }
> } else if (type.isArray()) { // Indexed value into array
> if (value instanceof String) {
> newValue = ConvertUtils.convert((String) value,
> - type.getComponentType());
> + type.getComponentType(), set);
> } else if (value instanceof String[]) {
> newValue = ConvertUtils.convert(((String[]) value)[0],
> - type.getComponentType());
> + type.getComponentType(), set);
> } else {
> newValue = value;
> }
> } else { // Value into scalar
> if ((value instanceof String) || (value == null)) {
> - newValue = ConvertUtils.convert((String) value, type);
> + newValue = ConvertUtils.convert((String) value, type, set);
> } else if (value instanceof String[]) {
> newValue = ConvertUtils.convert(((String[]) value)[0],
> - type);
> - } else if (ConvertUtils.lookup(value.getClass()) != null) {
> - newValue = ConvertUtils.convert(value.toString(), type);
> + type, set);
> + } else if (set.lookup(value.getClass()) != null) {
> + newValue = ConvertUtils.convert(value.toString(), type, set);
> } else {
> newValue = value;
> }
> --- ConverterSet.java.orig 2003-02-12 10:45:13.000000000 -0600
> +++ ConverterSet.java 2003-02-12 10:45:14.000000000 -0600
> @@ -0,0 +1,202 @@
> +package org.apache.commons.beanutils;
> +
> +import org.apache.commons.collections.FastHashMap;
> +import org.apache.commons.beanutils.converters.*;
> +import org.apache.commons.logging.Log;
> +import org.apache.commons.logging.LogFactory;
> +
> +import java.math.BigDecimal;
> +import java.math.BigInteger;
> +import java.sql.Date;
> +import java.sql.Time;
> +import java.sql.Timestamp;
> +
> +public class ConverterSet {
> +
> + /**
> + * The name of the defaultConverter set. The default ConverterSet can be
>retrieved by calling
> + * ConvertUtils.getDefaultConverterSet(), or
>ConvertUtils.getConverterSet(ConverterSet.DEFAULT_CONVERTER_SET_NAME)
> + */
> + public static final String DEFAULT_CONVERTER_SET_NAME = "DEFAULT";
> +
> +
> + private static Log log = LogFactory.getLog(ConverterSet.class);
> +
> +
> + /**
> + * The default value for Boolean conversions.
> + * To change the default, create a new Converter:
> + * ConverterSet.register(Boolean.TYPE, new BooleanConverter(Boolean.TRUE));
> + * ConverterSet.register(Boolean.class, new BooleanConverter(Boolean.TRUE));
> + */
> + private static Boolean defaultBoolean = Boolean.FALSE;
> +
> + /**
> + * The default value for Byte conversions.
> + */
> + private static Byte defaultByte = new Byte((byte) 0);
> +
> + /**
> + * The default value for Character conversions.
> + */
> + private static Character defaultCharacter = new Character(' ');
> +
> + /**
> + * The default value for Double conversions.
> + */
> + private static Double defaultDouble = new Double((double) 0.0);
> +
> + /**
> + * The default value for Float conversions.
> + */
> + private static Float defaultFloat = new Float((float) 0.0);
> +
> + /**
> + * The default value for Integer conversions.
> + */
> + private static Integer defaultInteger = new Integer(0);
> +
> + /**
> + * The default value for Long conversions.
> + */
> + private static Long defaultLong = new Long((long) 0);
> +
> + /**
> + * The default value for Short conversions.
> + */
> + private static Short defaultShort = new Short((short) 0);
> +
> +
> + /**
> + * Name of this ConverterSet (immutable).
> + */
> + private String name;
> +
> + public ConverterSet(String name) {
> + this.name = name;
> + converters.setFast(false);
> + deregister(); //initialize the data (maybe have a better method name?)
> + converters.setFast(true);
> + }
> +
> + public String getName() {
> + return name;
> + }
> +
> +
> + /**
> + * The set of converters associated with this ConverterSet
> + */
> + private FastHashMap converters = new FastHashMap();
> +
> + protected FastHashMap getConverters() {
> + return converters;
> + }
> +
> +
> + /**
> + * Return the converter associate with the given class (Converts TO this class)
> + *
> + * @param clazz
> + * @return
> + */
> + public Converter lookup(Class clazz) {
> + return (Converter) converters.get(clazz);
> + }
> +
> + /**
> + * Register a new converter for the given class.
> + *
> + * @param clazz
> + * @param converter
> + */
> + public void register(Converter converter, Class clazz) {
> + converters.put(clazz, converter);
> + }
> +
> + /**
> + * Removes the converter for the given class
> + *
> + * @param clazz
> + */
> + public void deregister(Class clazz) {
> + converters.remove(clazz);
> + }
> +
> + /**
> + * removes all converters
> + */
> + public void clear() {
> + getConverters().clear();
> + }
> +
> + /**
> + * returns true if this ConverterSet represents the default converter set
> + *
> + * @return
> + */
> + public boolean isDefaultConverterSet() {
> + return DEFAULT_CONVERTER_SET_NAME.equals(getName());
> + }
> +
> + /**
> + * Remove all registered {@link Converter}s, and re-establish the
> + * standard Converters.
> + *
> + * //@todo There should be some synchronization here, but there wasn't any
>before so do we worry about it?
> + * // i.e. if lookup() is called while in the middle of this method, on a class
>type for which the
> + * // default converter has not yet been re-registered, it will either throw an
>NPE or ?? depending on type
> + * // this whole block should be synchronized with lookup();
> + * // unless if you assume that this method should only be called as a setup
>procedure, and not be called during normal application runtime
> + */
> + public void deregister() {
> +
> + boolean booleanArray[] = new boolean[0];
> + byte byteArray[] = new byte[0];
> + char charArray[] = new char[0];
> + double doubleArray[] = new double[0];
> + float floatArray[] = new float[0];
> + int intArray[] = new int[0];
> + long longArray[] = new long[0];
> + short shortArray[] = new short[0];
> + String stringArray[] = new String[0];
> +
> + clear();
> +
> + register(new BigDecimalConverter(), BigDecimal.class);
> + register(new BigIntegerConverter(), BigInteger.class);
> + register(new BooleanConverter(defaultBoolean), Boolean.TYPE);
> + register(new BooleanConverter(defaultBoolean), Boolean.class);
> + register(new BooleanArrayConverter(booleanArray),
> + booleanArray.getClass());
> + register(new ByteConverter(defaultByte), Byte.TYPE);
> + register(new ByteConverter(defaultByte), Byte.class);
> + register(new ByteArrayConverter(byteArray), byteArray.getClass());
> + register(new CharacterConverter(defaultCharacter), Character.TYPE);
> + register(new CharacterConverter(defaultCharacter), Character.class);
> + register(new CharacterArrayConverter(charArray), charArray.getClass());
> + register(new ClassConverter(), Class.class);
> + register(new DoubleConverter(defaultDouble), Double.TYPE);
> + register(new DoubleConverter(defaultDouble), Double.class);
> + register(new DoubleArrayConverter(doubleArray), doubleArray.getClass());
> + register(new FloatConverter(defaultFloat), Float.TYPE);
> + register(new FloatConverter(defaultFloat), Float.class);
> + register(new FloatArrayConverter(floatArray), floatArray.getClass());
> + register(new IntegerConverter(defaultInteger), Integer.TYPE);
> + register(new IntegerConverter(defaultInteger), Integer.class);
> + register(new IntegerArrayConverter(intArray), intArray.getClass());
> + register(new LongConverter(defaultLong), Long.TYPE);
> + register(new LongConverter(defaultLong), Long.class);
> + register(new LongArrayConverter(longArray), longArray.getClass());
> + register(new ShortConverter(defaultShort), Short.TYPE);
> + register(new ShortConverter(defaultShort), Short.class);
> + register(new ShortArrayConverter(shortArray), shortArray.getClass());
> + register(new StringConverter(), String.class);
> + register(new StringArrayConverter(stringArray), stringArray.getClass());
> + register(new SqlDateConverter(), Date.class);
> + register(new SqlTimeConverter(), Time.class);
> + register(new SqlTimestampConverter(), Timestamp.class);
> +
> + }
> +
> +}
> --- ConvertUtils.java.orig 2003-02-12 10:45:12.000000000 -0600
> +++ ConvertUtils.java 2003-02-12 10:45:14.000000000 -0600
> @@ -64,35 +64,6 @@
>
>
> import java.lang.reflect.Array;
> -import java.math.BigDecimal;
> -import java.math.BigInteger;
> -import java.sql.Date;
> -import java.sql.Time;
> -import java.sql.Timestamp;
> -import org.apache.commons.beanutils.converters.BigDecimalConverter;
> -import org.apache.commons.beanutils.converters.BigIntegerConverter;
> -import org.apache.commons.beanutils.converters.BooleanConverter;
> -import org.apache.commons.beanutils.converters.BooleanArrayConverter;
> -import org.apache.commons.beanutils.converters.ByteConverter;
> -import org.apache.commons.beanutils.converters.ByteArrayConverter;
> -import org.apache.commons.beanutils.converters.CharacterConverter;
> -import org.apache.commons.beanutils.converters.CharacterArrayConverter;
> -import org.apache.commons.beanutils.converters.ClassConverter;
> -import org.apache.commons.beanutils.converters.DoubleConverter;
> -import org.apache.commons.beanutils.converters.DoubleArrayConverter;
> -import org.apache.commons.beanutils.converters.FloatConverter;
> -import org.apache.commons.beanutils.converters.FloatArrayConverter;
> -import org.apache.commons.beanutils.converters.IntegerConverter;
> -import org.apache.commons.beanutils.converters.IntegerArrayConverter;
> -import org.apache.commons.beanutils.converters.LongConverter;
> -import org.apache.commons.beanutils.converters.LongArrayConverter;
> -import org.apache.commons.beanutils.converters.ShortConverter;
> -import org.apache.commons.beanutils.converters.ShortArrayConverter;
> -import org.apache.commons.beanutils.converters.SqlDateConverter;
> -import org.apache.commons.beanutils.converters.SqlTimeConverter;
> -import org.apache.commons.beanutils.converters.SqlTimestampConverter;
> -import org.apache.commons.beanutils.converters.StringConverter;
> -import org.apache.commons.beanutils.converters.StringArrayConverter;
> import org.apache.commons.collections.FastHashMap;
> import org.apache.commons.logging.Log;
> import org.apache.commons.logging.LogFactory;
> @@ -150,165 +121,59 @@
> // ------------------------------------------------------ Static Properties
>
>
> - /**
> - * The default value for Boolean conversions.
> - * @deprecated Register replacement converters for Boolean.TYPE and
> - * Boolean.class instead
> - */
> - private static Boolean defaultBoolean = Boolean.FALSE;
> -
> - public static boolean getDefaultBoolean() {
> - return (defaultBoolean.booleanValue());
> - }
>
> - public static void setDefaultBoolean(boolean newDefaultBoolean) {
> - defaultBoolean = new Boolean(newDefaultBoolean);
> - converters.put(Boolean.TYPE, new BooleanConverter(defaultBoolean));
> - converters.put(Boolean.class, new BooleanConverter(defaultBoolean));
> - }
> -
> -
> - /**
> - * The default value for Byte conversions.
> - * @deprecated Register replacement converters for Byte.TYPE and
> - * Byte.class instead
> - */
> - private static Byte defaultByte = new Byte((byte) 0);
>
> - public static byte getDefaultByte() {
> - return (defaultByte.byteValue());
> - }
>
> - public static void setDefaultByte(byte newDefaultByte) {
> - defaultByte = new Byte(newDefaultByte);
> - converters.put(Byte.TYPE, new ByteConverter(defaultByte));
> - converters.put(Byte.class, new ByteConverter(defaultByte));
> - }
> + // ------------------------------------------------------- Static Variables
>
>
> /**
> - * The default value for Character conversions.
> - * @deprecated Register replacement converters for Character.TYPE and
> - * Character.class instead
> + * The set of {@link Converter}s that can be used to convert Strings
> + * into objects of a specified Class, keyed by the destination Class.
> */
> - private static Character defaultCharacter = new Character(' ');
> + private static FastHashMap converterSets = new FastHashMap();
>
> - public static char getDefaultCharacter() {
> - return (defaultCharacter.charValue());
> - }
> + protected static FastHashMap getConverterSets() {
>
> - public static void setDefaultCharacter(char newDefaultCharacter) {
> - defaultCharacter = new Character(newDefaultCharacter);
> - converters.put(Character.TYPE,
> - new CharacterConverter(defaultCharacter));
> - converters.put(Character.class,
> - new CharacterConverter(defaultCharacter));
> - }
> + return converterSets;
>
> -
> - /**
> - * The default value for Double conversions.
> - * @deprecated Register replacement converters for Double.TYPE and
> - * Double.class instead
> - */
> - private static Double defaultDouble = new Double((double) 0.0);
> -
> - public static double getDefaultDouble() {
> - return (defaultDouble.doubleValue());
> - }
> -
> - public static void setDefaultDouble(double newDefaultDouble) {
> - defaultDouble = new Double(newDefaultDouble);
> - converters.put(Double.TYPE, new DoubleConverter(defaultDouble));
> - converters.put(Double.class, new DoubleConverter(defaultDouble));
> }
>
> + public static ConverterSet getDefaultConverterSet() {
>
> - /**
> - * The default value for Float conversions.
> - * @deprecated Register replacement converters for Float.TYPE and
> - * Float.class instead
> - */
> - private static Float defaultFloat = new Float((float) 0.0);
> + return
>(ConverterSet)getConverterSets().get(ConverterSet.DEFAULT_CONVERTER_SET_NAME);
>
> - public static float getDefaultFloat() {
> - return (defaultFloat.floatValue());
> - }
> -
> - public static void setDefaultFloat(float newDefaultFloat) {
> - defaultFloat = new Float(newDefaultFloat);
> - converters.put(Float.TYPE, new FloatConverter(defaultFloat));
> - converters.put(Float.class, new FloatConverter(defaultFloat));
> }
>
> + public static ConverterSet getConverterSet(String name) {
>
> - /**
> - * The default value for Integer conversions.
> - * @deprecated Register replacement converters for Integer.TYPE and
> - * Integer.class instead
> - */
> - private static Integer defaultInteger = new Integer(0);
> + return (ConverterSet)getConverterSets().get(name);
>
> - public static int getDefaultInteger() {
> - return (defaultInteger.intValue());
> }
>
> - public static void setDefaultInteger(int newDefaultInteger) {
> - defaultInteger = new Integer(newDefaultInteger);
> - converters.put(Integer.TYPE, new IntegerConverter(defaultInteger));
> - converters.put(Integer.class, new IntegerConverter(defaultInteger));
> - }
> -
> -
> - /**
> - * The default value for Long conversions.
> - * @deprecated Register replacement converters for Long.TYPE and
> - * Long.class instead
> - */
> - private static Long defaultLong = new Long((long) 0);
> + public static void addConverterSet(ConverterSet set) {
> + if (set.getName() == null) {
> + throw new IllegalArgumentException("ConverterSet must have a name in
>order to add it");
> + }
>
> - public static long getDefaultLong() {
> - return (defaultLong.longValue());
> - }
> + getConverterSets().put(set.getName(), set);
>
> - public static void setDefaultLong(long newDefaultLong) {
> - defaultLong = new Long(newDefaultLong);
> - converters.put(Long.TYPE, new LongConverter(defaultLong));
> - converters.put(Long.class, new LongConverter(defaultLong));
> }
>
> + public static void removeConverterSet(String name) {
> + if (name == null) {
> + throw new IllegalArgumentException("ConverterSet must have a name in
>order to add it");
> + }
>
> - /**
> - * The default value for Short conversions.
> - * @deprecated Register replacement converters for Short.TYPE and
> - * Short.class instead
> - */
> - private static Short defaultShort = new Short((short) 0);
> -
> - public static short getDefaultShort() {
> - return (defaultShort.shortValue());
> - }
> + getConverterSets().remove(name);
>
> - public static void setDefaultShort(short newDefaultShort) {
> - defaultShort = new Short(newDefaultShort);
> - converters.put(Short.TYPE, new ShortConverter(defaultShort));
> - converters.put(Short.class, new ShortConverter(defaultShort));
> }
>
>
> - // ------------------------------------------------------- Static Variables
> -
> -
> - /**
> - * The set of {@link Converter}s that can be used to convert Strings
> - * into objects of a specified Class, keyed by the destination Class.
> - */
> - private static FastHashMap converters = new FastHashMap();
> -
> static {
> - converters.setFast(false);
> - deregister();
> - converters.setFast(true);
> + //create the default ConverterSet instance
> + getConverterSets().put(ConverterSet.DEFAULT_CONVERTER_SET_NAME,new
>ConverterSet(ConverterSet.DEFAULT_CONVERTER_SET_NAME) );
> +
> }
>
>
> @@ -332,7 +197,10 @@
> * @param value Value to be converted (may be null)
> */
> public static String convert(Object value) {
> + return convert(value, getDefaultConverterSet());
> + }
>
> + public static String convert(Object value, ConverterSet set) {
> if (value == null) {
> return ((String) null);
> } else if (value.getClass().isArray()) {
> @@ -343,11 +211,11 @@
> if (value == null) {
> return ((String) null);
> } else {
> - Converter converter = (Converter) converters.get(String.class);
> + Converter converter = set.lookup(String.class);
> return ((String) converter.convert(String.class, value));
> }
> } else {
> - Converter converter = (Converter) converters.get(String.class);
> + Converter converter = set.lookup(String.class);
> return ((String) converter.convert(String.class, value));
> }
>
> @@ -364,14 +232,18 @@
> * @exception ConversionException if thrown by an underlying Converter
> */
> public static Object convert(String value, Class clazz) {
> + return convert(value, clazz, getDefaultConverterSet() );
> + }
> +
> + public static Object convert(String value, Class clazz, ConverterSet set) {
>
> if (log.isDebugEnabled()) {
> log.debug("Convert string '" + value + "' to class '" +
> clazz.getName() + "'");
> }
> - Converter converter = (Converter) converters.get(clazz);
> + Converter converter = set.lookup(clazz);
> if (converter == null) {
> - converter = (Converter) converters.get(String.class);
> + converter = set.lookup(String.class);
> }
> if (log.isTraceEnabled()) {
> log.trace(" Using converter " + converter);
> @@ -394,7 +266,10 @@
> * @exception ConversionException if thrown by an underlying Converter
> */
> public static Object convert(String values[], Class clazz) {
> + return convert(values, clazz, getDefaultConverterSet());
> + }
>
> + public static Object convert(String values[], Class clazz, ConverterSet set) {
> Class type = clazz;
> if (clazz.isArray()) {
> type = clazz.getComponentType();
> @@ -403,9 +278,9 @@
> log.debug("Convert String[" + values.length + "] to class '" +
> type.getName() + "[]'");
> }
> - Converter converter = (Converter) converters.get(type);
> + Converter converter = set.lookup(type);
> if (converter == null) {
> - converter = (Converter) converters.get(String.class);
> + converter = set.lookup(String.class);
> }
> if (log.isTraceEnabled()) {
> log.trace(" Using converter " + converter);
> @@ -419,68 +294,7 @@
> }
>
>
> - /**
> - * Remove all registered {@link Converter}s, and re-establish the
> - * standard Converters.
> - */
> - public static void deregister() {
> -
> - boolean booleanArray[] = new boolean[0];
> - byte byteArray[] = new byte[0];
> - char charArray[] = new char[0];
> - double doubleArray[] = new double[0];
> - float floatArray[] = new float[0];
> - int intArray[] = new int[0];
> - long longArray[] = new long[0];
> - short shortArray[] = new short[0];
> - String stringArray[] = new String[0];
> -
> - converters.clear();
> - converters.put(BigDecimal.class, new BigDecimalConverter());
> - converters.put(BigInteger.class, new BigIntegerConverter());
> - converters.put(Boolean.TYPE, new BooleanConverter(defaultBoolean));
> - converters.put(Boolean.class, new BooleanConverter(defaultBoolean));
> - converters.put(booleanArray.getClass(),
> - new BooleanArrayConverter(booleanArray));
> - converters.put(Byte.TYPE, new ByteConverter(defaultByte));
> - converters.put(Byte.class, new ByteConverter(defaultByte));
> - converters.put(byteArray.getClass(),
> - new ByteArrayConverter(byteArray));
> - converters.put(Character.TYPE,
> - new CharacterConverter(defaultCharacter));
> - converters.put(Character.class,
> - new CharacterConverter(defaultCharacter));
> - converters.put(charArray.getClass(),
> - new CharacterArrayConverter(charArray));
> - converters.put(Class.class, new ClassConverter());
> - converters.put(Double.TYPE, new DoubleConverter(defaultDouble));
> - converters.put(Double.class, new DoubleConverter(defaultDouble));
> - converters.put(doubleArray.getClass(),
> - new DoubleArrayConverter(doubleArray));
> - converters.put(Float.TYPE, new FloatConverter(defaultFloat));
> - converters.put(Float.class, new FloatConverter(defaultFloat));
> - converters.put(floatArray.getClass(),
> - new FloatArrayConverter(floatArray));
> - converters.put(Integer.TYPE, new IntegerConverter(defaultInteger));
> - converters.put(Integer.class, new IntegerConverter(defaultInteger));
> - converters.put(intArray.getClass(),
> - new IntegerArrayConverter(intArray));
> - converters.put(Long.TYPE, new LongConverter(defaultLong));
> - converters.put(Long.class, new LongConverter(defaultLong));
> - converters.put(longArray.getClass(),
> - new LongArrayConverter(longArray));
> - converters.put(Short.TYPE, new ShortConverter(defaultShort));
> - converters.put(Short.class, new ShortConverter(defaultShort));
> - converters.put(shortArray.getClass(),
> - new ShortArrayConverter(shortArray));
> - converters.put(String.class, new StringConverter());
> - converters.put(stringArray.getClass(),
> - new StringArrayConverter(stringArray));
> - converters.put(Date.class, new SqlDateConverter());
> - converters.put(Time.class, new SqlTimeConverter());
> - converters.put(Timestamp.class, new SqlTimestampConverter());
>
> - }
>
>
> /**
> @@ -491,10 +305,15 @@
> */
> public static void deregister(Class clazz) {
>
> - converters.remove(clazz);
> + getDefaultConverterSet().deregister(clazz);
>
> }
>
> + public static void deregister() {
> +
> + getDefaultConverterSet().deregister();
> +
> + }
>
> /**
> * Look up and return any registered {@link Converter} for the specified
> @@ -505,7 +324,7 @@
> */
> public static Converter lookup(Class clazz) {
>
> - return ((Converter) converters.get(clazz));
> + return getDefaultConverterSet().lookup(clazz);
>
> }
>
> @@ -520,7 +339,7 @@
> */
> public static void register(Converter converter, Class clazz) {
>
> - converters.put(clazz, converter);
> + getDefaultConverterSet().register(converter, clazz);
>
> }
>
> --- LocaleBeanUtils.java.orig 2003-02-12 10:45:12.000000000 -0600
> +++ LocaleBeanUtils.java 2003-02-12 10:45:14.000000000 -0600
> @@ -179,7 +179,7 @@
> throws IllegalAccessException, InvocationTargetException,
> NoSuchMethodException {
>
> - return getIndexedProperty(bean, name, null);
> + return getIndexedProperty(bean, name, (String)null);
> }
>
> /**
> @@ -231,7 +231,7 @@
> String name, int index)
> throws IllegalAccessException, InvocationTargetException,
> NoSuchMethodException {
> - return getIndexedProperty(bean, name, index, null);
> + return getIndexedProperty(bean, name, index, (String)null);
> }
>
> /**
> @@ -277,7 +277,7 @@
> throws IllegalAccessException, InvocationTargetException,
> NoSuchMethodException {
>
> - return getSimpleProperty(bean, name, null);
> + return getSimpleProperty(bean, name, (String)null);
> }
>
> /**
> @@ -329,7 +329,7 @@
> throws IllegalAccessException, InvocationTargetException,
> NoSuchMethodException {
>
> - return getMappedProperty(bean, name, key, null);
> + return getMappedProperty(bean, name, key, (String)null);
> }
>
>
> @@ -436,7 +436,7 @@
> throws IllegalAccessException, InvocationTargetException,
> NoSuchMethodException {
>
> - return getNestedProperty(bean, name, null);
> + return getNestedProperty(bean, name, (String)null);
> }
>
> /**
> @@ -504,7 +504,7 @@
> public static void setProperty(Object bean, String name, Object value)
> throws IllegalAccessException, InvocationTargetException {
>
> - setProperty(bean, name, value, null);
> + setProperty(bean, name, value, (String)null);
> }
>
> /**
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
> ----- End message from [EMAIL PROTECTED] -----
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]