Author: niallp
Date: Sun May 20 15:17:33 2007
New Revision: 539965

URL: http://svn.apache.org/viewvc?view=rev&rev=539965
Log:
Fix for BEANUTILS-112 - deprecate the public static defaultTransformers HashMap 
and make it unmodifiable

Modified:
    
jakarta/commons/proper/beanutils/trunk/optional/bean-collections/src/java/org/apache/commons/beanutils/BeanMap.java
    
jakarta/commons/proper/beanutils/trunk/optional/bean-collections/src/test/org/apache/commons/beanutils/TestBeanMap.java

Modified: 
jakarta/commons/proper/beanutils/trunk/optional/bean-collections/src/java/org/apache/commons/beanutils/BeanMap.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/beanutils/trunk/optional/bean-collections/src/java/org/apache/commons/beanutils/BeanMap.java?view=diff&rev=539965&r1=539964&r2=539965
==============================================================================
--- 
jakarta/commons/proper/beanutils/trunk/optional/bean-collections/src/java/org/apache/commons/beanutils/BeanMap.java
 (original)
+++ 
jakarta/commons/proper/beanutils/trunk/optional/bean-collections/src/java/org/apache/commons/beanutils/BeanMap.java
 Sun May 20 15:17:33 2007
@@ -27,8 +27,10 @@
 import java.util.AbstractSet;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.Map;
 import java.util.Set;
 
 import org.apache.commons.collections.list.UnmodifiableList;
@@ -64,10 +66,59 @@
     /**
      * Maps primitive Class types to transformers.  The transformer
      * transform strings into the appropriate primitive wrapper.
+     *
+     * N.B. private & unmodifiable replacement for the (public & static) 
defaultTransformers instance.
+     */
+    private static Map typeTransformers = 
Collections.unmodifiableMap(createTypeTransformers());
+
+    /**
+     * This HashMap has been made unmodifiable to prevent issues when
+     * loaded in a shared ClassLoader enviroment.
+     *
+     * @see http://issues.apache.org/jira/browse/BEANUTILS-112
+     * @deprecated Use [EMAIL PROTECTED] BeanMap#getTypeTransformer(Class)} 
method
      */
-    public static HashMap defaultTransformers = new HashMap();
+    public static HashMap defaultTransformers = new HashMap() {
+        public void clear() {
+            throw new UnsupportedOperationException();
+        }
+        public boolean containsKey(Object key) {
+            return typeTransformers.containsKey(key);
+        }
+        public boolean containsValue(Object value) {
+            return typeTransformers.containsValue(value);
+        }
+        public Set entrySet() {
+            return typeTransformers.entrySet();
+        }
+        public Object get(Object key) {
+            return typeTransformers.get(key);
+        }
+        public boolean isEmpty() {
+            return false;
+        }
+        public Set keySet() {
+            return typeTransformers.keySet();
+        }
+        public Object put(Object key, Object value) {
+            throw new UnsupportedOperationException();
+        }
+        public void putAll(Map m) {
+            throw new UnsupportedOperationException();
+        }
+        public Object remove(Object key) {
+            throw new UnsupportedOperationException();
+        }
+        public int size() {
+            return typeTransformers.size();
+        }
+        public Collection values() {
+            return typeTransformers.values();
+        }
+    };
     
-    static {
+    private static Map createTypeTransformers() {
+        Map defaultTransformers = new HashMap();
         defaultTransformers.put( 
             Boolean.TYPE, 
             new Transformer() {
@@ -132,6 +183,7 @@
                 }
             }
         );
+        return defaultTransformers;
     }
     
     
@@ -776,7 +828,7 @@
      *  or null if the given type is not a primitive type
      */
     protected Transformer getTypeTransformer( Class aType ) {
-        return (Transformer) defaultTransformers.get( aType );
+        return (Transformer) typeTransformers.get( aType );
     }
 
     /**

Modified: 
jakarta/commons/proper/beanutils/trunk/optional/bean-collections/src/test/org/apache/commons/beanutils/TestBeanMap.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/beanutils/trunk/optional/bean-collections/src/test/org/apache/commons/beanutils/TestBeanMap.java?view=diff&rev=539965&r1=539964&r2=539965
==============================================================================
--- 
jakarta/commons/proper/beanutils/trunk/optional/bean-collections/src/test/org/apache/commons/beanutils/TestBeanMap.java
 (original)
+++ 
jakarta/commons/proper/beanutils/trunk/optional/bean-collections/src/test/org/apache/commons/beanutils/TestBeanMap.java
 Sun May 20 15:17:33 2007
@@ -19,12 +19,14 @@
 import java.io.Serializable;
 import java.lang.reflect.Method;
 import java.util.Map;
+import java.util.HashMap;
 
 import junit.framework.Test;
 import junit.textui.TestRunner;
 
 import org.apache.commons.collections.map.AbstractTestMap;
 import org.apache.commons.collections.BulkTest;
+import org.apache.commons.collections.Transformer;
 
 /**
  * Test cases for BeanMap
@@ -341,5 +343,81 @@
         Method method = 
BeanWithProperties.class.getDeclaredMethod("setSomeIntegerValue", new Class[] 
{Integer.class});
         assertEquals(method, map.getWriteMethod("someIntegerValue"));
     }
-    
+
+    /**
+     *  Test the default transformers using the getTypeTransformer() method
+     */
+    public void testGetTypeTransformerMethod() {
+        BeanMap beanMap = new BeanMap();
+        assertEquals("Boolean.TYPE",   Boolean.TRUE,        
beanMap.getTypeTransformer(Boolean.TYPE).transform("true"));
+        assertEquals("Character.TYPE", new Character('B'),  
beanMap.getTypeTransformer(Character.TYPE).transform("BCD"));
+        assertEquals("Byte.TYPE",      new Byte((byte)1),   
beanMap.getTypeTransformer(Byte.TYPE).transform("1"));
+        assertEquals("Short.TYPE",     new Short((short)2), 
beanMap.getTypeTransformer(Short.TYPE).transform("2"));
+        assertEquals("Integer.TYPE",   new Integer(3),      
beanMap.getTypeTransformer(Integer.TYPE).transform("3"));
+        assertEquals("Long.TYPE",      new Long(4),         
beanMap.getTypeTransformer(Long.TYPE).transform("4"));
+        assertEquals("Float.TYPE",     new Float("5"),      
beanMap.getTypeTransformer(Float.TYPE).transform("5"));
+        assertEquals("Double.TYPE",    new Double("6"),     
beanMap.getTypeTransformer(Double.TYPE).transform("6"));
+    }
+
+    /**
+     *  Test the default transformers via the pub static Map instance
+     */
+    public void testGetDefaultTransformersMap() {
+        BeanMap beanMap = new BeanMap();
+        assertEquals("Boolean.TYPE",   Boolean.TRUE,        
((Transformer)BeanMap.defaultTransformers.get(Boolean.TYPE)).transform("true"));
+        assertEquals("Character.TYPE", new Character('B'),  
((Transformer)BeanMap.defaultTransformers.get(Character.TYPE)).transform("BCD"));
+        assertEquals("Byte.TYPE",      new Byte((byte)1),   
((Transformer)BeanMap.defaultTransformers.get(Byte.TYPE)).transform("1"));
+        assertEquals("Short.TYPE",     new Short((short)2), 
((Transformer)BeanMap.defaultTransformers.get(Short.TYPE)).transform("2"));
+        assertEquals("Integer.TYPE",   new Integer(3),      
((Transformer)BeanMap.defaultTransformers.get(Integer.TYPE)).transform("3"));
+        assertEquals("Long.TYPE",      new Long(4),         
((Transformer)BeanMap.defaultTransformers.get(Long.TYPE)).transform("4"));
+        assertEquals("Float.TYPE",     new Float("5"),      
((Transformer)BeanMap.defaultTransformers.get(Float.TYPE)).transform("5"));
+        assertEquals("Double.TYPE",    new Double("6"),     
((Transformer)BeanMap.defaultTransformers.get(Double.TYPE)).transform("6"));
+        try {
+            BeanMap.defaultTransformers.put("FOO", null);
+            fail("put() - expected UnsupportedOperationException");
+        } catch(UnsupportedOperationException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     *  Test the default transformers via the pub static Map instance
+     */
+    public void testDefaultTransformersMap() {
+        assertEquals("Size",     8, BeanMap.defaultTransformers.size());
+        assertEquals("entrySet", 8, 
BeanMap.defaultTransformers.entrySet().size());
+        assertEquals("keySet",   8, 
BeanMap.defaultTransformers.keySet().size());
+        assertEquals("values",   8, 
BeanMap.defaultTransformers.values().size());
+        assertFalse("isEmpty",      BeanMap.defaultTransformers.isEmpty());
+        assertTrue("containsKey(Double)",    
BeanMap.defaultTransformers.containsKey(Double.TYPE));
+        assertFalse("containsKey(Object)",   
BeanMap.defaultTransformers.containsKey(Object.class));
+        assertTrue("containsValue(double)",  
BeanMap.defaultTransformers.containsValue(BeanMap.defaultTransformers.get(Double.TYPE)));
+        assertFalse("containsValue(Object)", 
BeanMap.defaultTransformers.containsValue(Object.class));
+
+        try {
+            BeanMap.defaultTransformers.clear();
+            fail("clear() - expected UnsupportedOperationException");
+        } catch(UnsupportedOperationException e) {
+            // expected result
+        }
+        try {
+            BeanMap.defaultTransformers.put("FOO", null);
+            fail("put() - expected UnsupportedOperationException");
+        } catch(UnsupportedOperationException e) {
+            // expected result
+        }
+        try {
+            BeanMap.defaultTransformers.putAll(new HashMap());
+            fail("putAll() - expected UnsupportedOperationException");
+        } catch(UnsupportedOperationException e) {
+            // expected result
+        }
+        try {
+            BeanMap.defaultTransformers.remove("FOO");
+            fail("remove() - expected UnsupportedOperationException");
+        } catch(UnsupportedOperationException e) {
+            // expected result
+        }
+    }
+   
 }



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

Reply via email to