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]