hi erik

thanks for hanging around while we cut the 1.6.1 release.

i think that some of the changes to beanutils we're (tentatively) got planned will mean that what you need will probably already be provided as a byproduct of the refactoring.

the idea is that the static utility classes in beanutils will be converted into proper beans. the static methods will then call an instance (in the start these will be singletons). you should be able to create two different BeanUtils instances and then add different convertors to the ConvertUtils associated with each.

how does this sound?

- robert

On Thursday, February 20, 2003, at 04:36 PM, Erik Tennant wrote:

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 <commons-
[EMAIL PROTECTED]>
 Subject: [PATCH] [BeanUtils] Addition of ConverterSet
      To: "[EMAIL PROTECTED]" <commons-
[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 [EMAIL PROTECTED] 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 [EMAIL PROTECTED] 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 [EMAIL PROTECTED] 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 [EMAIL PROTECTED] 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 [EMAIL PROTECTED] 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]



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Reply via email to