You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ba...@apache.org on 2009/09/15 07:56:01 UTC

svn commit: r815075 - /commons/proper/collections/trunk/src/java/org/apache/commons/collections/map/DefaultedMap.java

Author: bayard
Date: Tue Sep 15 05:56:01 2009
New Revision: 815075

URL: http://svn.apache.org/viewvc?rev=815075&view=rev
Log:
Merging from -r468106:814127 of collections_jdk5_branch - namely where this code was generified; mostly in r738956.

Also see the following revisions:

    ------------------------------------------------------------------------
    r740150 | mbenson | 2009-02-02 15:24:00 -0800 (Mon, 02 Feb 2009) | 1 line
    
    make all [collections] maps implement IterableMap
    ------------------------------------------------------------------------

Modified:
    commons/proper/collections/trunk/src/java/org/apache/commons/collections/map/DefaultedMap.java

Modified: commons/proper/collections/trunk/src/java/org/apache/commons/collections/map/DefaultedMap.java
URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/java/org/apache/commons/collections/map/DefaultedMap.java?rev=815075&r1=815074&r2=815075&view=diff
==============================================================================
--- commons/proper/collections/trunk/src/java/org/apache/commons/collections/map/DefaultedMap.java (original)
+++ commons/proper/collections/trunk/src/java/org/apache/commons/collections/map/DefaultedMap.java Tue Sep 15 05:56:01 2009
@@ -24,6 +24,7 @@
 import java.util.Map;
 
 import org.apache.commons.collections.Factory;
+import org.apache.commons.collections.IterableMap;
 import org.apache.commons.collections.Transformer;
 import org.apache.commons.collections.functors.ConstantTransformer;
 import org.apache.commons.collections.functors.FactoryTransformer;
@@ -63,15 +64,13 @@
  * @author Rafael U.C. Afonso
  * @see LazyMap
  */
-public class DefaultedMap
-        extends AbstractMapDecorator
-        implements Map, Serializable {
+public class DefaultedMap<K, V> extends AbstractMapDecorator<K, V> implements Serializable {
 
     /** Serialization version */
     private static final long serialVersionUID = 19698628745827L;
 
     /** The transformer to use if the map does not contain a key */
-    protected final Object value;
+    private final Transformer<? super K, ? extends V> value;
 
     //-----------------------------------------------------------------------
     /**
@@ -83,11 +82,8 @@
      * @param defaultValue  the default value to return when the key is not found
      * @throws IllegalArgumentException if map is null
      */
-    public static Map decorate(Map map, Object defaultValue) {
-        if (defaultValue instanceof Transformer) {
-            defaultValue = ConstantTransformer.getInstance(defaultValue);
-        }
-        return new DefaultedMap(map, defaultValue);
+    public static <K, V> Map<K, V> decorate(Map<K, V> map, V defaultValue) {
+        return new DefaultedMap<K, V>(map, ConstantTransformer.getInstance(defaultValue));
     }
 
     /**
@@ -100,11 +96,11 @@
      * @param factory  the factory to use to create entries, must not be null
      * @throws IllegalArgumentException if map or factory is null
      */
-    public static Map decorate(Map map, Factory factory) {
+    public static <K, V> IterableMap<K, V> decorate(Map<K, V> map, Factory<? extends V> factory) {
         if (factory == null) {
             throw new IllegalArgumentException("Factory must not be null");
         }
-        return new DefaultedMap(map, FactoryTransformer.getInstance(factory));
+        return new DefaultedMap<K, V>(map, FactoryTransformer.getInstance(factory));
     }
 
     /**
@@ -118,11 +114,11 @@
      * @param transformer  the transformer to use as a factory to create entries, must not be null
      * @throws IllegalArgumentException if map or factory is null
      */
-    public static Map decorate(Map map, Transformer transformer) {
+    public static <K, V> Map<K, V> decorate(Map<K, V> map, Transformer<? super K, ? extends V> transformer) {
         if (transformer == null) {
            throw new IllegalArgumentException("Transformer must not be null");
        }
-       return new DefaultedMap(map, transformer);
+       return new DefaultedMap<K, V>(map, transformer);
     }
 
     //-----------------------------------------------------------------------
@@ -135,12 +131,18 @@
      * 
      * @param defaultValue  the default value to return when the key is not found
      */
-    public DefaultedMap(Object defaultValue) {
-        super(new HashMap());
-        if (defaultValue instanceof Transformer) {
-            defaultValue = ConstantTransformer.getInstance(defaultValue);
-        }
-        this.value = defaultValue;
+    public DefaultedMap(V defaultValue) {
+        this(ConstantTransformer.getInstance(defaultValue));
+    }
+
+    /**
+     * Constructs a new empty <code>DefaultedMap</code> that decorates
+     * a <code>HashMap</code>.
+     * <p>
+     * @param defaultValueTransformer transformer to use to generate missing values.
+     */
+    public DefaultedMap(Transformer<? super K, ? extends V> defaultValueTransformer) {
+        this(new HashMap<K, V>(), defaultValueTransformer);
     }
 
     /**
@@ -150,9 +152,9 @@
      * @param value  the value to use
      * @throws IllegalArgumentException if map or transformer is null
      */
-    protected DefaultedMap(Map map, Object value) {
+    protected DefaultedMap(Map<K, V> map, Transformer<? super K, ? extends V> defaultValueTransformer) {
         super(map);
-        this.value = value;
+        this.value = defaultValueTransformer;
     }
 
     //-----------------------------------------------------------------------
@@ -174,19 +176,18 @@
      * @throws IOException
      * @throws ClassNotFoundException
      */
+    @SuppressWarnings("unchecked")
     private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
         in.defaultReadObject();
         map = (Map) in.readObject();
     }
 
     //-----------------------------------------------------------------------
-    public Object get(Object key) {
+    @SuppressWarnings("unchecked")
+    public V get(Object key) {
         // create value for key if key is not currently in the map
         if (map.containsKey(key) == false) {
-            if (value instanceof Transformer) {
-                return ((Transformer) value).transform(key);
-            }
-            return value;
+            return value.transform((K) key);
         }
         return map.get(key);
     }