Author: niallp
Date: Mon May 21 18:03:37 2007
New Revision: 540385

URL: http://svn.apache.org/viewvc?view=rev&rev=540385
Log:
BEANUTILS-258 - re-factor Converter registration in ConvertUtilsBean to make 
configuring the standard converters for defaults/throwing exceptions easier

Modified:
    
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/ConvertUtilsBean.java
    
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/RowSetDynaClass.java
    
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/WrapDynaClass.java
    jakarta/commons/proper/beanutils/trunk/xdocs/changes.xml

Modified: 
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/ConvertUtilsBean.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/ConvertUtilsBean.java?view=diff&rev=540385&r1=540384&r2=540385
==============================================================================
--- 
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/ConvertUtilsBean.java
 (original)
+++ 
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/ConvertUtilsBean.java
 Mon May 21 18:03:37 2007
@@ -24,9 +24,6 @@
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.net.URL;
-import java.sql.Date;
-import java.sql.Time;
-import java.sql.Timestamp;
 import java.util.Collection;
 import java.util.Map;
 import java.util.HashMap;
@@ -35,6 +32,7 @@
 import org.apache.commons.beanutils.converters.BigIntegerConverter;
 import org.apache.commons.beanutils.converters.BooleanConverter;
 import org.apache.commons.beanutils.converters.ByteConverter;
+import org.apache.commons.beanutils.converters.CalendarConverter;
 import org.apache.commons.beanutils.converters.CharacterConverter;
 import org.apache.commons.beanutils.converters.ClassConverter;
 import org.apache.commons.beanutils.converters.DateConverter;
@@ -130,6 +128,8 @@
 
 public class ConvertUtilsBean {
     
+    private static final Integer ZERO = new Integer(0);
+
     // ------------------------------------------------------- Class Methods
     /**
      * Get singleton instance
@@ -557,76 +557,217 @@
 
                converters.clear();
         
-        // Note: these two converters have no default values. This is
-        // not consistent with the other numeric converters, but cannot
-        // be fixed without breaking backwards compatibility.
+        registerPrimitives(false);
+        registerStandard(false, false);
+        registerOther(true);
+        registerArrays(false, 0);
         register(BigDecimal.class, new BigDecimalConverter());
         register(BigInteger.class, new BigIntegerConverter());
-        registerArrayConverter(BigDecimal[].class, new BigDecimalConverter());
-        registerArrayConverter(BigInteger[].class, new BigIntegerConverter());
+    }
 
-        register(Boolean.TYPE, new BooleanConverter(defaultBoolean));
-        register(Boolean.class,  new BooleanConverter(defaultBoolean));
-        registerArrayConverter(boolean[].class, new BooleanConverter());
-        registerArrayConverter(Boolean[].class, new BooleanConverter());
-        register(Byte.TYPE, new ByteConverter(defaultByte));
-        register(Byte.class, new ByteConverter(defaultByte));
-        registerArrayConverter(byte[].class, new ByteConverter());
-        registerArrayConverter(Byte[].class, new ByteConverter());
-        register(Character.TYPE,
-                       new CharacterConverter(defaultCharacter));
-        register(Character.class,
-                       new CharacterConverter(defaultCharacter));
-        registerArrayConverter(char[].class,      new CharacterConverter());
-        registerArrayConverter(Character[].class, new CharacterConverter());
-        register(Class.class, new ClassConverter());
-        register(Double.TYPE, new DoubleConverter(defaultDouble));
-        register(Double.class, new DoubleConverter(defaultDouble));
-        registerArrayConverter(double[].class, new DoubleConverter());
-        registerArrayConverter(Double[].class, new DoubleConverter());
-        register(Float.TYPE, new FloatConverter(defaultFloat));
-        register(Float.class, new FloatConverter(defaultFloat));
-        registerArrayConverter(float[].class, new FloatConverter());
-        registerArrayConverter(Float[].class, new FloatConverter());
-        register(Integer.TYPE, new IntegerConverter(defaultInteger));
-        register(Integer.class, new IntegerConverter(defaultInteger));
-        registerArrayConverter(int[].class,     new IntegerConverter());
-        registerArrayConverter(Integer[].class, new IntegerConverter());
-        register(Long.TYPE, new LongConverter(defaultLong));
-        register(Long.class, new LongConverter(defaultLong));
-        registerArrayConverter(long[].class, new LongConverter());
-        registerArrayConverter(Long[].class, new LongConverter());
-        register(Short.TYPE, new ShortConverter(defaultShort));
-        register(Short.class, new ShortConverter(defaultShort));
-        registerArrayConverter(short[].class, new ShortConverter());
-        registerArrayConverter(Short[].class, new ShortConverter());
-        register(String.class, new StringConverter());
-        registerArrayConverter(String[].class, new StringConverter());
-        register(Date.class, new SqlDateConverter());
-        registerArrayConverter(Date[].class, new SqlDateConverter());
-        register(Time.class, new SqlTimeConverter());
-        registerArrayConverter(Time[].class, new SqlTimeConverter());
-        register(Timestamp.class, new SqlTimestampConverter());
-        registerArrayConverter(Timestamp[].class, new SqlTimestampConverter());
-        register(File.class, new FileConverter());
-        register(URL.class, new URLConverter());
-        register(java.util.Date.class,                     new 
DateConverter());
-        register(java.util.Calendar.class,                 new 
DateConverter());
-        registerArrayConverter(java.util.Date[].class,     new 
DateConverter());
-        registerArrayConverter(java.util.Calendar[].class, new 
DateConverter());
+    /**
+     * Register the standard converters with the specified defaults.
+     * </p>
+     * This method delegates to the following methods (see their docs
+     * to find out which converters each one registers.
+     * <ul>
+     *     <li>[EMAIL PROTECTED] 
ConvertUtilsBean#registerPrimitives(boolean)}</li>
+     *     <li>[EMAIL PROTECTED] ConvertUtilsBean#registerStandard(boolean, 
boolean)}</li>
+     *     <li>[EMAIL PROTECTED] ConvertUtilsBean#registerOther(boolean)}</li>
+     *     <li>[EMAIL PROTECTED] ConvertUtilsBean#registerArrays(boolean, 
int)}</li>
+     * </ul>
+     *
+     * @param throwException <code>true</code> if the converters should
+     * throw an exception when a conversion error occurs, otherwise <code>
+     * <code>false</code> if a default value should be used.
+     * @param defaultNull <code>true</code>if the <i>standard</i> converters
+     * (see [EMAIL PROTECTED] ConvertUtilsBean#registerStandard(boolean, 
boolean)})
+     * should use a default value of <code>null</code>, otherwise 
<code>false</code>.
+     * N.B. This values is ignored if <code>throwException</code> is 
<code>true</code>
+     * @param defaultArraySize The size of the default array value for array 
converters
+     * (see [EMAIL PROTECTED] ConvertUtilsBean#registerArrays(boolean, int)}).
+     * N.B. This values is ignored if <code>throwException</code> is 
<code>true</code>
+     */
+    public void register(boolean throwException, boolean defaultNull, int 
defaultArraySize) {
+        registerPrimitives(throwException);
+        registerStandard(throwException, defaultNull);
+        registerOther(throwException);
+        registerArrays(throwException, defaultArraySize);
+    }
+
+    /**
+     * Register the converters for primitive types.
+     * </p>
+     * This method registers the following converters:
+     * <ul>
+     *     <li><code>Boolean.TYPE</code> - [EMAIL PROTECTED] 
BooleanConverter}</li>
+     *     <li><code>Byte.TYPE</code> - [EMAIL PROTECTED] ByteConverter}</li>
+     *     <li><code>Character.TYPE</code> - [EMAIL PROTECTED] 
CharacterConverter}</li>
+     *     <li><code>Double.TYPE</code> - [EMAIL PROTECTED] 
DoubleConverter}</li>
+     *     <li><code>Float.TYPE</code> - [EMAIL PROTECTED] FloatConverter}</li>
+     *     <li><code>Integer.TYPE</code> - [EMAIL PROTECTED] 
IntegerConverter}</li>
+     *     <li><code>Long.TYPE</code> - [EMAIL PROTECTED] LongConverter}</li>
+     *     <li><code>Short.TYPE</code> - [EMAIL PROTECTED] ShortConverter}</li>
+     * </ul>
+     * @param throwException <code>true</code> if the converters should
+     * throw an exception when a conversion error occurs, otherwise <code>
+     * <code>false</code> if a default value should be used.
+     */
+    public void registerPrimitives(boolean throwException) {
+        register(Boolean.TYPE,   throwException ? new BooleanConverter()    : 
new BooleanConverter(Boolean.FALSE));
+        register(Byte.TYPE,      throwException ? new ByteConverter()       : 
new ByteConverter(ZERO));
+        register(Character.TYPE, throwException ? new CharacterConverter()  : 
new CharacterConverter(new Character(' ')));
+        register(Double.TYPE,    throwException ? new DoubleConverter()     : 
new DoubleConverter(ZERO));
+        register(Float.TYPE,     throwException ? new FloatConverter()      : 
new FloatConverter(ZERO));
+        register(Integer.TYPE,   throwException ? new IntegerConverter()    : 
new IntegerConverter(ZERO));
+        register(Long.TYPE,      throwException ? new LongConverter()       : 
new LongConverter(ZERO));
+        register(Short.TYPE,     throwException ? new ShortConverter()      : 
new ShortConverter(ZERO));
+    }
+
+    /**
+     * Register the converters for standard types.
+     * </p>
+     * This method registers the following converters:
+     * <ul>
+     *     <li><code>BigDecimal.class</code> - [EMAIL PROTECTED] 
BigDecimalConverter}</li>
+     *     <li><code>BigInteger.class</code> - [EMAIL PROTECTED] 
BigIntegerConverter}</li>
+     *     <li><code>Boolean.class</code> - [EMAIL PROTECTED] 
BooleanConverter}</li>
+     *     <li><code>Byte.class</code> - [EMAIL PROTECTED] ByteConverter}</li>
+     *     <li><code>Character.class</code> - [EMAIL PROTECTED] 
CharacterConverter}</li>
+     *     <li><code>Double.class</code> - [EMAIL PROTECTED] 
DoubleConverter}</li>
+     *     <li><code>Float.class</code> - [EMAIL PROTECTED] 
FloatConverter}</li>
+     *     <li><code>Integer.class</code> - [EMAIL PROTECTED] 
IntegerConverter}</li>
+     *     <li><code>Long.class</code> - [EMAIL PROTECTED] LongConverter}</li>
+     *     <li><code>Short.class</code> - [EMAIL PROTECTED] 
ShortConverter}</li>
+     *     <li><code>String.class</code> - [EMAIL PROTECTED] 
StringConverter}</li>
+     * </ul>
+     * @param throwException <code>true</code> if the converters should
+     * throw an exception when a conversion error occurs, otherwise <code>
+     * <code>false</code> if a default value should be used.
+     * @param defaultNull <code>true</code>if the <i>standard</i> converters
+     * (see [EMAIL PROTECTED] ConvertUtilsBean#registerStandard(boolean, 
boolean)})
+     * should use a default value of <code>null</code>, otherwise 
<code>false</code>.
+     * N.B. This values is ignored if <code>throwException</code> is 
<code>true</code>
+     */
+    public void registerStandard(boolean throwException, boolean defaultNull) {
+
+        Number     defaultNumber     = defaultNull ? null : ZERO;
+        BigDecimal bigDecimalDefault = defaultNull ? null : new 
BigDecimal("0.0");
+        BigInteger bigIntegerDefault = defaultNull ? null : new 
BigInteger("0");
+        Boolean    booleanDefault    = defaultNull ? null : Boolean.FALSE;
+        Character  charDefault       = defaultNull ? null : new Character(' ');
+        String     stringDefault     = defaultNull ? null : "";
+
+        register(BigDecimal.class, throwException ? new BigDecimalConverter() 
: new BigDecimalConverter(bigDecimalDefault));
+        register(BigInteger.class, throwException ? new BigIntegerConverter() 
: new BigIntegerConverter(bigIntegerDefault));
+        register(Boolean.class,    throwException ? new BooleanConverter()    
: new BooleanConverter(booleanDefault));
+        register(Byte.class,       throwException ? new ByteConverter()       
: new ByteConverter(defaultNumber));
+        register(Character.class,  throwException ? new CharacterConverter()  
: new CharacterConverter(charDefault));
+        register(Double.class,     throwException ? new DoubleConverter()     
: new DoubleConverter(defaultNumber));
+        register(Float.class,      throwException ? new FloatConverter()      
: new FloatConverter(defaultNumber));
+        register(Integer.class,    throwException ? new IntegerConverter()    
: new IntegerConverter(defaultNumber));
+        register(Long.class,       throwException ? new LongConverter()       
: new LongConverter(defaultNumber));
+        register(Short.class,      throwException ? new ShortConverter()      
: new ShortConverter(defaultNumber));
+        register(String.class,     throwException ? new StringConverter()     
: new StringConverter(stringDefault));
+        
+    }
 
+    /**
+     * Register the converters for other types.
+     * </p>
+     * This method registers the following converters:
+     * <ul>
+     *     <li><code>Class.class</code> - [EMAIL PROTECTED] 
ClassConverter}</li>
+     *     <li><code>java.util.Date.class</code> - [EMAIL PROTECTED] 
DateConverter}</li>
+     *     <li><code>java.util.Calendar.class</code> - [EMAIL PROTECTED] 
CalendarConverter}</li>
+     *     <li><code>File.class</code> - [EMAIL PROTECTED] FileConverter}</li>
+     *     <li><code>java.sql.Date.class</code> - [EMAIL PROTECTED] 
SqlDateConverter}</li>
+     *     <li><code>java.sql.Time.class</code> - [EMAIL PROTECTED] 
SqlTimeConverter}</li>
+     *     <li><code>java.sql.Timestamp.class</code> - [EMAIL PROTECTED] 
SqlTimestampConverter}</li>
+     *     <li><code>URL.class</code> - [EMAIL PROTECTED] URLConverter}</li>
+     * </ul>
+     * @param throwException <code>true</code> if the converters should
+     * throw an exception when a conversion error occurs, otherwise <code>
+     * <code>false</code> if a default value should be used.
+     */
+    public void registerOther(boolean throwException) {
+        register(Class.class,              throwException ? new 
ClassConverter()        : new ClassConverter(null));
+        register(java.util.Date.class,     throwException ? new 
DateConverter()         : new DateConverter(null));
+        register(java.util.Calendar.class, throwException ? new 
CalendarConverter()     : new CalendarConverter(null));
+        register(File.class,               throwException ? new 
FileConverter()         : new FileConverter(null));
+        register(java.sql.Date.class,      throwException ? new 
SqlDateConverter()      : new SqlDateConverter(null));
+        register(java.sql.Time.class,      throwException ? new 
SqlTimeConverter()      : new SqlTimeConverter(null));
+        register(java.sql.Timestamp.class, throwException ? new 
SqlTimestampConverter() : new SqlTimestampConverter(null));
+        register(URL.class,                throwException ? new URLConverter() 
         : new URLConverter(null));
     }
 
     /**
-     * Create a new ArrayConverter with the specified element delegate 
converter
-     * and the default size.
-     */
-    private void registerArrayConverter(Class clazz, Converter converter) {
-        if (defaultArraySize < 0) {
-            register(clazz, new ArrayConverter(clazz, converter));
+     * Register array converters.
+     *
+     * @param throwException <code>true</code> if the converters should
+     * throw an exception when a conversion error occurs, otherwise <code>
+     * <code>false</code> if a default value should be used.
+     * @param defaultArraySize The size of the default array value for array 
converters
+     * (N.B. This values is ignored if <code>throwException</code> is 
<code>true</code>).
+     * Specifying a value less than zero causes a <code>null<code> value to be 
used for
+     * the default.
+     */
+    public void registerArrays(boolean throwException, int defaultArraySize) {
+
+        // Primitives
+        registerArrayConverter(Boolean.TYPE,   new BooleanConverter(),   
throwException, defaultArraySize);
+        registerArrayConverter(Byte.TYPE,      new ByteConverter(),      
throwException, defaultArraySize);
+        registerArrayConverter(Character.TYPE, new CharacterConverter(), 
throwException, defaultArraySize);
+        registerArrayConverter(Double.TYPE,    new DoubleConverter(),    
throwException, defaultArraySize);
+        registerArrayConverter(Float.TYPE,     new FloatConverter(),     
throwException, defaultArraySize);
+        registerArrayConverter(Integer.TYPE,   new IntegerConverter(),   
throwException, defaultArraySize);
+        registerArrayConverter(Long.TYPE,      new LongConverter(),      
throwException, defaultArraySize);
+        registerArrayConverter(Short.TYPE,     new ShortConverter(),     
throwException, defaultArraySize);
+
+        // Standard
+        registerArrayConverter(BigDecimal.class, new BigDecimalConverter(), 
throwException, defaultArraySize);
+        registerArrayConverter(BigInteger.class, new BigIntegerConverter(), 
throwException, defaultArraySize);
+        registerArrayConverter(Boolean.class,    new BooleanConverter(),    
throwException, defaultArraySize);
+        registerArrayConverter(Byte.class,       new ByteConverter(),       
throwException, defaultArraySize);
+        registerArrayConverter(Character.class,  new CharacterConverter(),  
throwException, defaultArraySize);
+        registerArrayConverter(Double.class,     new DoubleConverter(),     
throwException, defaultArraySize);
+        registerArrayConverter(Float.class,      new FloatConverter(),      
throwException, defaultArraySize);
+        registerArrayConverter(Integer.class,    new IntegerConverter(),    
throwException, defaultArraySize);
+        registerArrayConverter(Long.class,       new LongConverter(),       
throwException, defaultArraySize);
+        registerArrayConverter(Short.class,      new ShortConverter(),      
throwException, defaultArraySize);
+        registerArrayConverter(String.class,     new StringConverter(),     
throwException, defaultArraySize);
+
+        // Other
+        registerArrayConverter(Class.class,              new ClassConverter(), 
       throwException, defaultArraySize);
+        registerArrayConverter(java.util.Date.class,     new DateConverter(),  
       throwException, defaultArraySize);
+        registerArrayConverter(java.util.Calendar.class, new DateConverter(),  
       throwException, defaultArraySize);
+        registerArrayConverter(File.class,               new FileConverter(),  
       throwException, defaultArraySize);
+        registerArrayConverter(java.sql.Date.class,      new 
SqlDateConverter(),      throwException, defaultArraySize);
+        registerArrayConverter(java.sql.Time.class,      new 
SqlTimeConverter(),      throwException, defaultArraySize);
+        registerArrayConverter(java.sql.Timestamp.class, new 
SqlTimestampConverter(), throwException, defaultArraySize);
+        registerArrayConverter(URL.class,                new URLConverter(),   
       throwException, defaultArraySize);
+
+    }
+
+    /**
+     * Register a new ArrayConverter with the specified element delegate 
converter
+     * that returns a default array of the specified size in the event of 
conversion errors.
+     *
+     * @param componentType The component type of the array
+     * @param componentConverter The converter to delegate to for the array 
elements
+     * @param throwException Whether a conversion exception should be thrown 
or a default
+     * value used in the event of a conversion error
+     * @param defaultArraySize The size of the default array
+     */
+    private void registerArrayConverter(Class componentType, Converter 
componentConverter, boolean throwException, int defaultArraySize) {
+        Class arrayType = Array.newInstance(componentType, 0).getClass();
+        Converter arrayConverter = null;
+        if (throwException) {
+            arrayConverter = new ArrayConverter(arrayType, componentConverter);
         } else {
-            register(clazz, new ArrayConverter(clazz, converter, 
defaultArraySize));
+            arrayConverter = new ArrayConverter(arrayType, componentConverter, 
defaultArraySize);
         }
+        register(arrayType, arrayConverter);
     }
 
     /** strictly for convenience since it has same parameter order as Map.put 
*/

Modified: 
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/RowSetDynaClass.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/RowSetDynaClass.java?view=diff&rev=540385&r1=540384&r2=540385
==============================================================================
--- 
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/RowSetDynaClass.java
 (original)
+++ 
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/RowSetDynaClass.java
 Mon May 21 18:03:37 2007
@@ -229,7 +229,15 @@
             DynaBean bean = createDynaBean();
             for (int i = 0; i < properties.length; i++) {
                 String name = properties[i].getName();
-                bean.set(name, resultSet.getObject(name));
+                Object value = resultSet.getObject(name);
+                if (value != null) {
+                    Class type = properties[i].getClass();
+                    try {
+                        value = ConvertUtils.convert(value, type);
+                    } catch (Throwable t) {
+                    }
+                }
+                bean.set(name, value);
             }
             rows.add(bean);
         }

Modified: 
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/WrapDynaClass.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/WrapDynaClass.java?view=diff&rev=540385&r1=540384&r2=540385
==============================================================================
--- 
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/WrapDynaClass.java
 (original)
+++ 
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/WrapDynaClass.java
 Mon May 21 18:03:37 2007
@@ -19,9 +19,12 @@
 
 
 import java.beans.PropertyDescriptor;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
+import java.util.Set;
+import java.util.WeakHashMap;
 
 
 /**
@@ -105,6 +108,20 @@
     // ------------------------------------------------------- Static Variables
 
 
+    private static final ContextClassLoaderLocal wrapDynaClassesByClassLoader 
= 
+        new ContextClassLoaderLocal() {
+            protected Object initialValue() {
+                return new WeakHashMap();
+        }
+    };
+
+    /**
+     * Get the wrap dyna classes cache
+     */
+    private static Map getDynaClassesMap() {
+        return (Map)wrapDynaClassesByClassLoader.get();
+    }
+
     /**
      * The set of <code>WrapDynaClass</code> instances that have ever been
      * created, keyed by the underlying bean Class. The keys to this map
@@ -121,8 +138,70 @@
      * classes loaded via a webapp classloader even after the webapp has been
      * undeployed. That will prevent the entire classloader and all the classes
      * it refers to and all their static members from being freed.
+     *
+     ************* !!!!!!!!!!!! PLEASE NOTE !!!!!!!!!!!! *************
+     *
+     * THE FOLLOWING IS A NASTY HACK TO SO THAT BEANUTILS REMAINS BINARY
+     *              COMPATIBLE WITH PREVIOUS RELEASES.
+     *
+     * There are two issues here:
+     * 
+     * 1) Memory Issues: The static HashMap caused memory problems (See 
BEANUTILS-59)
+     *    to resolve this it has been moved into a ContextClassLoaderLocal 
instance
+     *    (named wrapDynaClassesByClassLoader above) which holds one copy per
+     *    ClassLoader in a WeakHashMap.
+     * 
+     * 2) Binary Compatibility: As the "dynaClasses" static HashMap is 
"protected"
+     *    removing it breaks BeanUtils binary compatibility with previous 
versions.
+     *    To resolve this all the methods have been overriden to delegate to 
the
+     *    Map for the ClassLoader in the ContextClassLoaderLocal.
+     *
+     * @deprecated The dynaClasses Map will be removed in a subsequent release
      */
-    protected static HashMap dynaClasses = new HashMap();
+    protected static HashMap dynaClasses = new HashMap() {
+        public void clear() {
+            getDynaClassesMap().clear();
+        }
+        public boolean containsKey(Object key) {
+            return getDynaClassesMap().containsKey(key);
+        }
+        public boolean containsValue(Object value) {
+            return getDynaClassesMap().containsValue(value);
+        }
+        public Set entrySet() {
+            return getDynaClassesMap().entrySet();
+        }
+        public boolean equals(Object o) {
+            return getDynaClassesMap().equals(o);
+        }
+        public Object get(Object key) {
+            return getDynaClassesMap().get(key);
+        }
+        public int hashCode() {
+            return getDynaClassesMap().hashCode();
+        }
+        public boolean isEmpty() {
+            return getDynaClassesMap().isEmpty();
+        }
+        public Set keySet() {
+            return getDynaClassesMap().keySet();
+        }
+        public Object put(Object key, Object value) {
+            return getDynaClassesMap().put(key, value);
+        }
+        public void putAll(Map m) {
+            getDynaClassesMap().putAll(m);
+        }
+        public Object remove(Object key) {
+            return getDynaClassesMap().remove(key);
+        }
+        public int size() {
+            return getDynaClassesMap().size();
+        }
+        public Collection values() {
+            return getDynaClassesMap().values();
+        }
+    };
 
 
     // ------------------------------------------------------ DynaClass Methods
@@ -234,9 +313,7 @@
      */
     public static void clear() {
 
-        synchronized (dynaClasses) {
-            dynaClasses.clear();
-        }
+        getDynaClassesMap().clear();
 
     }
 
@@ -250,15 +327,13 @@
      */
     public static WrapDynaClass createDynaClass(Class beanClass) {
 
-        synchronized (dynaClasses) {
             WrapDynaClass dynaClass =
-                    (WrapDynaClass) dynaClasses.get(beanClass);
+                    (WrapDynaClass) getDynaClassesMap().get(beanClass);
             if (dynaClass == null) {
                 dynaClass = new WrapDynaClass(beanClass);
-                dynaClasses.put(beanClass, dynaClass);
+                getDynaClassesMap().put(beanClass, dynaClass);
             }
             return (dynaClass);
-        }
 
     }
 

Modified: jakarta/commons/proper/beanutils/trunk/xdocs/changes.xml
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/beanutils/trunk/xdocs/changes.xml?view=diff&rev=540385&r1=540384&r2=540385
==============================================================================
--- jakarta/commons/proper/beanutils/trunk/xdocs/changes.xml (original)
+++ jakarta/commons/proper/beanutils/trunk/xdocs/changes.xml Mon May 21 
18:03:37 2007
@@ -40,6 +40,9 @@
   <body>
 
     <release version="1.8.0" date="in SVN">
+      <action dev="niallp" type="fix" issue="BEANUTILS-243" due-to="Henri 
Yandell">
+         BeanUtils's tests fail to compile under JDK 1.6
+      </action>
       <action dev="niallp" type="add" issue="BEANUTILS-259">
          Add plugable property name expression <b><i>Resolver</i></b>.
       </action>



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

Reply via email to