You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2014/11/28 19:27:38 UTC

svn commit: r1642341 - in /tomcat/trunk: java/org/apache/tomcat/websocket/CaseInsensitiveKeyMap.java java/org/apache/tomcat/websocket/LocalStrings.properties test/org/apache/tomcat/websocket/TestCaseInsensitiveKeyMap.java

Author: markt
Date: Fri Nov 28 18:27:38 2014
New Revision: 1642341

URL: http://svn.apache.org/r1642341
Log:
kkolinko review
Fix a typo.
Simplify where values are known to be non-null
Specify and test behaviour with null and non-String key values.

Modified:
    tomcat/trunk/java/org/apache/tomcat/websocket/CaseInsensitiveKeyMap.java
    tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties
    tomcat/trunk/test/org/apache/tomcat/websocket/TestCaseInsensitiveKeyMap.java

Modified: tomcat/trunk/java/org/apache/tomcat/websocket/CaseInsensitiveKeyMap.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/CaseInsensitiveKeyMap.java?rev=1642341&r1=1642340&r2=1642341&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/CaseInsensitiveKeyMap.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/CaseInsensitiveKeyMap.java Fri Nov 28 18:27:38 2014
@@ -24,9 +24,14 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.tomcat.util.res.StringManager;
+
 /**
- * A Map implementation that uses case-insensitive (using {@link Locale#ENGLISH}
- * strings as keys.
+ * A Map implementation that uses case-insensitive (using {@link
+ * Locale#ENGLISH}) strings as keys.
+ * <p>
+ * Keys must be instances of {@link String}. Note that this means that
+ * <code>null</code> keys are not permitted.
  * <p>
  * This implementation is not thread-safe.
  *
@@ -34,6 +39,9 @@ import java.util.Set;
  */
 public class CaseInsensitiveKeyMap<V> extends AbstractMap<String,V> {
 
+    private static final StringManager sm =
+            StringManager.getManager(CaseInsensitiveKeyMap.class);
+
     private final Map<Key,V> map = new HashMap<>();
 
 
@@ -45,7 +53,11 @@ public class CaseInsensitiveKeyMap<V> ex
 
     @Override
     public V put(String key, V value) {
-        return map.put(Key.getInstance(key), value);
+        Key caseInsensitiveKey = Key.getInstance(key);
+        if (caseInsensitiveKey == null) {
+            throw new NullPointerException(sm.getString("caseInsensitiveKeyMap.nullKey"));
+        }
+        return map.put(caseInsensitiveKey, value);
     }
 
 
@@ -155,9 +167,11 @@ public class CaseInsensitiveKeyMap<V> ex
     private static class Key {
 
         private final String key;
+        private final String lcKey;
 
         private Key(String key) {
             this.key = key;
+            this.lcKey = key.toLowerCase(Locale.ENGLISH);
         }
 
         public String getKey() {
@@ -168,8 +182,7 @@ public class CaseInsensitiveKeyMap<V> ex
         public int hashCode() {
             final int prime = 31;
             int result = 1;
-            result = prime * result +
-                    ((key == null) ? 0 : key.toLowerCase(Locale.ENGLISH).hashCode());
+            result = prime * result + lcKey.hashCode();
             return result;
         }
 
@@ -185,15 +198,7 @@ public class CaseInsensitiveKeyMap<V> ex
                 return false;
             }
             Key other = (Key) obj;
-            if (key == null) {
-                if (other.key != null) {
-                    return false;
-                }
-            } else if (!key.toLowerCase(Locale.ENGLISH).equals(
-                    other.key.toLowerCase(Locale.ENGLISH))) {
-                return false;
-            }
-            return true;
+            return lcKey.equals(other.lcKey);
         }
 
         public static Key getInstance(Object o) {

Modified: tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties?rev=1642341&r1=1642340&r2=1642341&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties Fri Nov 28 18:27:38 2014
@@ -28,6 +28,8 @@ asyncChannelWrapperSecure.wrongStateWrit
 
 backgroundProcessManager.processFailed=A background process failed
 
+caseInsensitiveKeyMap.nullKey=Null keys are not permitted
+
 perMessageDeflate.deflateFailed=Failed to decompress a compressed WebSocket frame
 perMessageDeflate.duplicateParameter=Duplicate definition of the [{0}] extension parameter
 perMessageDeflate.invalidWindowSize=An invalid windows of [{1}] size was specified for [{0}]. Valid values are whole numbers from 8 to 15 inclusive.

Modified: tomcat/trunk/test/org/apache/tomcat/websocket/TestCaseInsensitiveKeyMap.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/tomcat/websocket/TestCaseInsensitiveKeyMap.java?rev=1642341&r1=1642340&r2=1642341&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/tomcat/websocket/TestCaseInsensitiveKeyMap.java (original)
+++ tomcat/trunk/test/org/apache/tomcat/websocket/TestCaseInsensitiveKeyMap.java Fri Nov 28 18:27:38 2014
@@ -43,6 +43,15 @@ public class TestCaseInsensitiveKeyMap {
     }
 
 
+    @Test(expected=NullPointerException.class)
+    public void testPutNullKey() {
+        Object o1 = new Object();
+
+        CaseInsensitiveKeyMap<Object> map = new CaseInsensitiveKeyMap<>();
+        map.put(null, o1);
+    }
+
+
     @Test
     public void testGet() {
         Object o1 = new Object();
@@ -56,6 +65,17 @@ public class TestCaseInsensitiveKeyMap {
 
 
     @Test
+    public void testGetNullKey() {
+        Object o1 = new Object();
+
+        CaseInsensitiveKeyMap<Object> map = new CaseInsensitiveKeyMap<>();
+        map.put("a", o1);
+
+        Assert.assertNull(map.get(null));
+    }
+
+
+    @Test
     public void testContainsKey() {
         Object o1 = new Object();
 
@@ -68,6 +88,28 @@ public class TestCaseInsensitiveKeyMap {
 
 
     @Test
+    public void testContainsKeyNonString() {
+        Object o1 = new Object();
+
+        CaseInsensitiveKeyMap<Object> map = new CaseInsensitiveKeyMap<>();
+        map.put("a", o1);
+
+        Assert.assertFalse(map.containsKey(o1));
+    }
+
+
+    @Test
+    public void testContainsKeyNull() {
+        Object o1 = new Object();
+
+        CaseInsensitiveKeyMap<Object> map = new CaseInsensitiveKeyMap<>();
+        map.put("a", o1);
+
+        Assert.assertFalse(map.containsKey(null));
+    }
+
+
+    @Test
     public void testContainsValue() {
         Object o1 = new Object();
 



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org