You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2012/05/04 00:04:18 UTC

svn commit: r1333653 - in /cxf/trunk/rt/frontend/jaxrs/src: main/java/org/apache/cxf/jaxrs/impl/MetadataMap.java test/java/org/apache/cxf/jaxrs/impl/MetadataMapTest.java

Author: sergeyb
Date: Thu May  3 22:04:18 2012
New Revision: 1333653

URL: http://svn.apache.org/viewvc?rev=1333653&view=rev
Log:
[CXF-4280] Fixing MetadataMap case-insensitive checks

Modified:
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/MetadataMap.java
    cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/MetadataMapTest.java

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/MetadataMap.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/MetadataMap.java?rev=1333653&r1=1333652&r2=1333653&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/MetadataMap.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/MetadataMap.java Thu May  3 22:04:18 2012
@@ -22,10 +22,12 @@ package org.apache.cxf.jaxrs.impl;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.TreeSet;
 
 import javax.ws.rs.core.MultivaluedMap;
 
@@ -96,12 +98,7 @@ public class MetadataMap<K, V> implement
         if (!caseInsensitive) {
             return m.containsKey(key);
         }
-        for (K theKey : m.keySet()) {
-            if (theKey.toString().toLowerCase().equals(key.toString().toLowerCase())) {
-                return true;
-            }
-        }
-        return false;
+        return getMatchingKey(key) != null;
     }
 
     public boolean containsValue(Object value) {
@@ -116,9 +113,14 @@ public class MetadataMap<K, V> implement
         if (!caseInsensitive) {
             return m.get(key);
         }
-        for (Map.Entry<K, List<V>> entry : m.entrySet()) {
-            if (entry.getKey().toString().toLowerCase().equals(key.toString().toLowerCase())) {
-                return entry.getValue();
+        K realKey = getMatchingKey(key);
+        return realKey == null ? null : m.get(realKey);
+    }
+    
+    private K getMatchingKey(Object key) {
+        for (K entry : m.keySet()) {
+            if (entry.toString().equalsIgnoreCase(key.toString())) {
+                return entry;
             }
         }
         return null;
@@ -129,19 +131,37 @@ public class MetadataMap<K, V> implement
     }
 
     public Set<K> keySet() {
-        return m.keySet();
+        if (!caseInsensitive) {
+            return m.keySet();
+        } else {
+            Set<K> set = new TreeSet<K>(new KeyComparator<K>());
+            set.addAll(m.keySet());
+            return set;
+        }
     }
 
     public List<V> put(K key, List<V> value) {
-        return m.put(key, value);
+        K realKey = !caseInsensitive ? key : getMatchingKey(key);
+        return m.put(realKey == null ? key : realKey, value);
     }
 
     public void putAll(Map<? extends K, ? extends List<V>> map) {
-        m.putAll(map);
+        if (!caseInsensitive) {
+            m.putAll(map);
+        } else {
+            for (Map.Entry<? extends K, ? extends List<V>> entry : map.entrySet()) {
+                this.put(entry.getKey(), entry.getValue());
+            }
+        }
     }
 
     public List<V> remove(Object key) {
-        return m.remove(key);
+        if (caseInsensitive) {
+            K realKey = getMatchingKey(key);
+            return m.remove(realKey == null ? key : realKey);
+        } else {
+            return m.remove(key);
+        }
     }
 
     public int size() {
@@ -166,5 +186,13 @@ public class MetadataMap<K, V> implement
         return m.toString();
     }
     
-    
+    private static class KeyComparator<K> implements Comparator<K> {
+
+        public int compare(K k1, K k2) {
+            String s1 = k1.toString();
+            String s2 = k2.toString();
+            return s1.compareToIgnoreCase(s2);
+        }
+        
+    }
 }

Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/MetadataMapTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/MetadataMapTest.java?rev=1333653&r1=1333652&r2=1333653&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/MetadataMapTest.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/MetadataMapTest.java Thu May  3 22:04:18 2012
@@ -41,6 +41,108 @@ public class MetadataMapTest extends Ass
         List<Object> value2 = m.get("baz");
         assertEquals("Only a single value should be in the list", 1, value2.size());
         assertEquals("Value is wrong", "clazz", value2.get(0));
+        assertNull(m.get("baZ"));
+    }
+    
+    @Test
+    public void testPutSingleCaseInsensitive() {
+        MetadataMap<String, Object> m = new MetadataMap<String, Object>(false, true);
+        List<Object> value1 = new ArrayList<Object>();
+        value1.add("bar");
+        value1.add("foo");
+        m.put("baz", value1);
+        
+        m.putSingle("baz", "clazz");
+        assertEquals(1, m.size());
+        
+        List<Object> value2 = m.get("baz");
+        assertEquals("Only a single value should be in the list", 1, value2.size());
+        assertEquals("Value is wrong", "clazz", value2.get(0));
+        
+        m.putSingle("Baz", "clazz2");
+        assertEquals(1, m.size());
+        value2 = m.get("baz");
+        assertEquals("Only a single value should be in the list", 1, value2.size());
+        assertEquals("Value is wrong", "clazz2", value2.get(0));
+   
+        assertTrue(m.containsKey("Baz"));
+        assertTrue(m.containsKey("baz"));
+    }
+    
+    @Test
+    public void testContainsKeyCaseInsensitive() {
+        MetadataMap<String, Object> m = new MetadataMap<String, Object>(false, true);
+        m.putSingle("a", "b");
+        assertTrue(m.containsKey("a"));
+        assertTrue(m.containsKey("A"));
+    }
+    
+    @Test
+    public void testContainsKeyCaseSensitive() {
+        MetadataMap<String, Object> m = new MetadataMap<String, Object>();
+        m.putSingle("a", "b");
+        assertTrue(m.containsKey("a"));
+        assertFalse(m.containsKey("A"));
+    }
+    
+    
+    @Test
+    public void testKeySetCaseInsensitive() {
+        MetadataMap<String, Object> m = new MetadataMap<String, Object>(false, true);
+        m.putSingle("a", "b");
+        assertTrue(m.keySet().contains("a"));
+        assertTrue(m.keySet().contains("A"));
+    }
+    
+    @Test
+    public void testKeySetCaseSensitive() {
+        MetadataMap<String, Object> m = new MetadataMap<String, Object>();
+        m.putSingle("a", "b");
+        assertTrue(m.keySet().contains("a"));
+        assertFalse(m.keySet().contains("A"));
+    }
+    
+    @Test
+    public void testPutAllCaseInsensitive() {
+        MetadataMap<String, Object> m = new MetadataMap<String, Object>(false, true);
+        List<Object> value1 = new ArrayList<Object>();
+        value1.add("bar");
+        value1.add("foo");
+        m.put("baz", value1);
+        assertEquals(1, m.size());
+        List<Object> values = m.get("baz");
+        assertEquals(2, values.size());
+        assertEquals("bar", values.get(0));
+        assertEquals("foo", values.get(1));
+        
+        MetadataMap<String, Object> m2 = new MetadataMap<String, Object>(false, true);
+        List<Object> value2 = new ArrayList<Object>();
+        value2.add("bar2");
+        value2.add("foo2");
+        m2.put("BaZ", value2);
+        
+        m.putAll(m2);
+        
+        assertEquals(1, m.size());
+        values = m.get("Baz");
+        assertEquals(2, values.size());
+        assertEquals("bar2", values.get(0));
+        assertEquals("foo2", values.get(1));
+    }
+    
+    @Test
+    public void testRemoveCaseInsensitive() {
+        MetadataMap<String, Object> m = new MetadataMap<String, Object>(false, true);
+        List<Object> value1 = new ArrayList<Object>();
+        value1.add("bar");
+        value1.add("foo");
+        m.put("baz", value1);
+        
+        m.putSingle("baz", "clazz");
+        assertEquals(1, m.size());
+        
+        m.remove("Baz");
+        assertEquals(0, m.size());
     }
     
     @Test