You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by se...@apache.org on 2010/10/20 03:36:03 UTC

svn commit: r1024482 - /commons/proper/collections/trunk/src/java/org/apache/commons/collections/ExtendedProperties.java

Author: sebb
Date: Wed Oct 20 01:36:02 2010
New Revision: 1024482

URL: http://svn.apache.org/viewvc?rev=1024482&view=rev
Log:
Generics; fix keys as Strings only

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

Modified: commons/proper/collections/trunk/src/java/org/apache/commons/collections/ExtendedProperties.java
URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/java/org/apache/commons/collections/ExtendedProperties.java?rev=1024482&r1=1024481&r2=1024482&view=diff
==============================================================================
--- commons/proper/collections/trunk/src/java/org/apache/commons/collections/ExtendedProperties.java (original)
+++ commons/proper/collections/trunk/src/java/org/apache/commons/collections/ExtendedProperties.java Wed Oct 20 01:36:02 2010
@@ -147,7 +147,7 @@ import java.util.Vector;
  * @author Shinobu Kawai
  * @author <a href="mailto:hps@intermeta.de">Henning P. Schmiedehausen</a>
  */
-public class ExtendedProperties extends Hashtable {
+public class ExtendedProperties extends Hashtable<String, Object> {
 
     private static final long serialVersionUID = -4064305575636043822L;
 
@@ -192,7 +192,7 @@ public class ExtendedProperties extends 
      * you wish to perform operations with configuration
      * information in a particular order.
      */
-    protected ArrayList keysAsListed = new ArrayList();
+    protected ArrayList<String> keysAsListed = new ArrayList<String>();
 
     protected final static String START_TOKEN="${";
     protected final static String END_TOKEN="}";
@@ -223,7 +223,7 @@ public class ExtendedProperties extends 
      *
      * @return the string with the interpolation taken care of
      */
-    protected String interpolateHelper(String base, List priorVariables) {
+    protected String interpolateHelper(String base, List<String> priorVariables) {
         // COPIED from [configuration] 2003-12-29
         if (base == null) {
             return null;
@@ -232,7 +232,7 @@ public class ExtendedProperties extends 
         // on the first call initialize priorVariables
         // and add base as the first element
         if (priorVariables == null) {
-            priorVariables = new ArrayList();
+            priorVariables = new ArrayList<String>();
             priorVariables.add(base);
         }
 
@@ -256,7 +256,7 @@ public class ExtendedProperties extends 
 
                 // create a nice trace of interpolated variables like so:
                 // var1->var2->var3
-                for (Iterator it = priorVariables.iterator(); it.hasNext();) {
+                for (Iterator<?> it = priorVariables.iterator(); it.hasNext();) {
                     priorVariableSb.append(it.next());
                     if (it.hasNext()) {
                         priorVariableSb.append("->");
@@ -706,14 +706,16 @@ public class ExtendedProperties extends 
 
         if (current instanceof String) {
             // one object already in map - convert it to a vector
-            List values = new Vector(2);
+            List<Object> values = new Vector<Object>(2);
             values.add(current);
             values.add(value);
             super.put(key, values);
             
         } else if (current instanceof List) {
             // already a list - just add the new token
-            ((List) current).add(value);
+            @SuppressWarnings("unchecked") // We only add Strings to the Lists
+            List<String> list = (List<String>) current;
+            list.add((String) value);
             
         } else {
             // brand new key - store in keysAsListed to retain order
@@ -755,9 +757,9 @@ public class ExtendedProperties extends 
             theWrtr.println(header);
         }
         
-        Enumeration theKeys = keys();
+        Enumeration<String> theKeys = keys();
         while (theKeys.hasMoreElements()) {
-            String key = (String) theKeys.nextElement();
+            String key = theKeys.nextElement();
             Object value = get(key);
             if (value != null) {
                 if (value instanceof String) {
@@ -768,9 +770,10 @@ public class ExtendedProperties extends 
                     theWrtr.println(currentOutput.toString());
                     
                 } else if (value instanceof List) {
-                    List values = (List) value;
-                    for (Iterator it = values.iterator(); it.hasNext(); ) {
-                        String currentElement = (String) it.next();
+                    @SuppressWarnings("unchecked") // we only add Strings to the Lists
+                    List<String> values = (List<String>) value;
+                    for (Iterator<String> it = values.iterator(); it.hasNext(); ) {
+                        String currentElement = it.next();
                         StringBuilder currentOutput = new StringBuilder();
                         currentOutput.append(key);
                         currentOutput.append("=");
@@ -792,8 +795,8 @@ public class ExtendedProperties extends 
      * @param props  the properties to combine
      */
     public void combine(ExtendedProperties props) {
-        for (Iterator it = props.getKeys(); it.hasNext();) {
-            String key = (String) it.next();
+        for (Iterator<String> it = props.getKeys(); it.hasNext();) {
+            String key = it.next();
             clearProperty(key);
             addPropertyDirect(key, props.get(key));
         }
@@ -824,7 +827,7 @@ public class ExtendedProperties extends 
      *
      * @return an Iterator over the keys
      */
-    public Iterator getKeys() {
+    public Iterator<String> getKeys() {
         return keysAsListed.iterator();
     }
 
@@ -835,14 +838,13 @@ public class ExtendedProperties extends 
      * @param prefix  the prefix to match
      * @return an Iterator of keys that match the prefix
      */
-    public Iterator getKeys(String prefix) {
-        Iterator keys = getKeys();
-        ArrayList matchingKeys = new ArrayList();
+    public Iterator<String> getKeys(String prefix) {
+        Iterator<String> keys = getKeys();
+        ArrayList<String> matchingKeys = new ArrayList<String>();
 
         while (keys.hasNext()) {
-            Object key = keys.next();
-
-            if (key instanceof String && ((String) key).startsWith(prefix)) {
+            String key = keys.next();
+            if (key.startsWith(prefix)) {
                 matchingKeys.add(key);
             }
         }
@@ -856,16 +858,17 @@ public class ExtendedProperties extends 
      *
      * @param prefix  the prefix to get a subset for
      * @return a new independent ExtendedProperties
+     * or {@code null} if no keys matched
      */
     public ExtendedProperties subset(String prefix) {
         ExtendedProperties c = new ExtendedProperties();
-        Iterator keys = getKeys();
+        Iterator<String> keys = getKeys();
         boolean validSubset = false;
 
         while (keys.hasNext()) {
-            Object key = keys.next();
+            String key = keys.next();
 
-            if (key instanceof String && ((String) key).startsWith(prefix)) {
+            if (key.startsWith(prefix)) {
                 if (!validSubset) {
                     validSubset = true;
                 }
@@ -877,10 +880,10 @@ public class ExtendedProperties extends 
                  * subset but it is a valid subset.
                  */
                 String newKey = null;
-                if (((String) key).length() == prefix.length()) {
+                if (key.length() == prefix.length()) {
                     newKey = prefix;
                 } else {
-                    newKey = ((String) key).substring(prefix.length() + 1);
+                    newKey = key.substring(prefix.length() + 1);
                 }
 
                 /*
@@ -903,10 +906,10 @@ public class ExtendedProperties extends 
      * Display the configuration for debugging purposes to System.out.
      */
     public void display() {
-        Iterator i = getKeys();
+        Iterator<String> i = getKeys();
 
         while (i.hasNext()) {
-            String key = (String) i.next();
+            String key = i.next();
             Object value = get(key);
             System.out.println(key + " => " + value);
         }
@@ -947,7 +950,9 @@ public class ExtendedProperties extends 
                 return interpolate(defaultValue);
             }
         } else if (value instanceof List) {
-            return interpolate((String) ((List) value).get(0));
+            @SuppressWarnings("unchecked") // Must be OK as we only add Strings to Lists
+            List<String> entry = (List<String>) value;
+            return interpolate(entry.get(0));
         } else {
             throw new ClassCastException('\'' + key + "' doesn't map to a String object");
         }
@@ -1013,13 +1018,15 @@ public class ExtendedProperties extends 
     public String[] getStringArray(String key) {
         Object value = get(key);
 
-        List values;
+        List<String> values;
         if (value instanceof String) {
-            values = new Vector(1);
-            values.add(value);
+            values = new Vector<String>(1);
+            values.add((String) value);
             
         } else if (value instanceof List) {
-            values = (List) value;
+            @SuppressWarnings("unchecked") // We only add Strings to the Lists
+            List<String> list = (List<String>) value;
+            values = list;
             
         } else if (value == null) {
             if (defaults != null) {
@@ -1033,7 +1040,7 @@ public class ExtendedProperties extends 
 
         String[] tokens = new String[values.size()];
         for (int i = 0; i < tokens.length; i++) {
-            tokens[i] = (String) values.get(i);
+            tokens[i] = values.get(i);
         }
 
         return tokens;
@@ -1048,7 +1055,7 @@ public class ExtendedProperties extends 
      * @throws ClassCastException is thrown if the key maps to an
      * object that is not a Vector.
      */
-    public Vector getVector(String key) {
+    public Vector<String> getVector(String key) {
         return getVector(key, null);
     }
 
@@ -1064,15 +1071,17 @@ public class ExtendedProperties extends 
      * @throws ClassCastException is thrown if the key maps to an
      * object that is not a Vector.
      */
-    public Vector getVector(String key, Vector defaultValue) {
+    public Vector<String> getVector(String key, Vector<String> defaultValue) {
         Object value = get(key);
 
         if (value instanceof List) {
-            return new Vector((List) value);
+            @SuppressWarnings("unchecked") // our lists only contain Strings
+            List<String> list = (List<String>) value;
+            return new Vector<String>(list);
             
         } else if (value instanceof String) {
-            Vector values = new Vector(1);
-            values.add(value);
+            Vector<String> values = new Vector<String>(1);
+            values.add((String) value);
             super.put(key, values);
             return values;
             
@@ -1080,7 +1089,7 @@ public class ExtendedProperties extends 
             if (defaults != null) {
                 return defaults.getVector(key, defaultValue);
             } else {
-                return ((defaultValue == null) ? new Vector() : defaultValue);
+                return ((defaultValue == null) ? new Vector<String>() : defaultValue);
             }
         } else {
             throw new ClassCastException('\'' + key + "' doesn't map to a Vector object");
@@ -1099,7 +1108,7 @@ public class ExtendedProperties extends 
      * object that is not a List.
      * @since Commons Collections 3.2
      */
-    public List getList(String key) {
+    public List<String> getList(String key) {
         return getList(key, null);
     }
 
@@ -1116,15 +1125,17 @@ public class ExtendedProperties extends 
      * object that is not a List.
      * @since Commons Collections 3.2
      */
-    public List getList(String key, List defaultValue) {
+    public List<String> getList(String key, List<String> defaultValue) {
         Object value = get(key);
 
         if (value instanceof List) {
-            return new ArrayList((List) value);
+            @SuppressWarnings("unchecked") // our lists only contain strings
+            List<String> list = (List<String>) value;
+            return new ArrayList<String>(list);
             
         } else if (value instanceof String) {
-            List values = new ArrayList(1);
-            values.add(value);
+            List<String> values = new ArrayList<String>(1);
+            values.add((String) value);
             super.put(key, values);
             return values;
             
@@ -1132,7 +1143,7 @@ public class ExtendedProperties extends 
             if (defaults != null) {
                 return defaults.getList(key, defaultValue);
             } else {
-                return ((defaultValue == null) ? new ArrayList() : defaultValue);
+                return ((defaultValue == null) ? new ArrayList<String>() : defaultValue);
             }
         } else {
             throw new ClassCastException('\'' + key + "' doesn't map to a List object");
@@ -1693,8 +1704,9 @@ public class ExtendedProperties extends 
     public static ExtendedProperties convertProperties(Properties props) {
         ExtendedProperties c = new ExtendedProperties();
 
-        for (Enumeration e = props.propertyNames(); e.hasMoreElements();) {
-            String s = (String) e.nextElement();
+        for (@SuppressWarnings("unchecked") // Properties are supposed to have string keys ...
+        Enumeration<String> e = (Enumeration<String>) props.propertyNames(); e.hasMoreElements();) {
+            String s = e.nextElement(); // ... if props does not, this line would fail anyway ...
             String value = props.getProperty(s);
             if(value != null) {
                 c.setProperty(s, value);
@@ -1713,10 +1725,9 @@ public class ExtendedProperties extends 
      * @return old value of the property
      */
     @Override
-    public Object put(Object key, Object value) {
-        String strKey = String.valueOf(key);
-        Object ret = getProperty(strKey);
-        addProperty(strKey, value);
+    public Object put(String key, Object value) {
+        Object ret = getProperty(key);
+        addProperty(key, value);
         return ret;
     }
 
@@ -1728,15 +1739,17 @@ public class ExtendedProperties extends 
      * @param map full of key/value pair data
      */
     @Override
-    public void putAll(Map map) {
+    public void putAll(Map<? extends String, ? extends Object> map) {
         if (map instanceof ExtendedProperties) {
-            for (Iterator it = ((ExtendedProperties) map).getKeys(); it.hasNext(); ) {
-                Object key = it.next();
+            for (Iterator<String> it = ((ExtendedProperties) map).getKeys(); it.hasNext(); ) {
+                String key = it.next();
                 put(key, map.get(key));
             }
         } else {
-            for (Iterator it = map.entrySet().iterator(); it.hasNext(); ) {
-                Map.Entry entry = (Map.Entry) it.next();
+            @SuppressWarnings("unchecked") // OK to downcast here
+            Map<String, Object> mapso = (Map<String,Object>) map;
+            for (Iterator<Map.Entry<String, Object>> it = mapso.entrySet().iterator(); it.hasNext(); ) {
+                Map.Entry<String,Object> entry = it.next();
                 put(entry.getKey(), entry.getValue());
             }
         }