You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by gn...@apache.org on 2015/03/23 09:18:22 UTC

svn commit: r1668536 - in /felix/trunk/framework/src/main/java/org/apache/felix/framework: capabilityset/CapabilitySet.java util/StringComparator.java util/StringMap.java

Author: gnodet
Date: Mon Mar 23 08:18:22 2015
New Revision: 1668536

URL: http://svn.apache.org/r1668536
Log:
[FELIX-4821] Reuse the fast case insensitive comparator for the CapabilitySet indices

Modified:
    felix/trunk/framework/src/main/java/org/apache/felix/framework/capabilityset/CapabilitySet.java
    felix/trunk/framework/src/main/java/org/apache/felix/framework/util/StringComparator.java
    felix/trunk/framework/src/main/java/org/apache/felix/framework/util/StringMap.java

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/capabilityset/CapabilitySet.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/capabilityset/CapabilitySet.java?rev=1668536&r1=1668535&r2=1668536&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/capabilityset/CapabilitySet.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/capabilityset/CapabilitySet.java Mon Mar 23 08:18:22 2015
@@ -81,7 +81,7 @@ public class CapabilitySet
         m_indices = (caseSensitive)
             ? new TreeMap<String, Map<Object, Set<BundleCapability>>>()
             : new TreeMap<String, Map<Object, Set<BundleCapability>>>(
-                new StringComparator(false));
+                StringComparator.COMPARATOR);
         for (int i = 0; (indexProps != null) && (i < indexProps.size()); i++)
         {
             m_indices.put(

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/util/StringComparator.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/util/StringComparator.java?rev=1668536&r1=1668535&r2=1668536&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/util/StringComparator.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/util/StringComparator.java Mon Mar 23 08:18:22 2015
@@ -20,29 +20,54 @@ package org.apache.felix.framework.util;
 
 import java.util.Comparator;
 
-public class StringComparator implements Comparator
+public class StringComparator implements Comparator<String>
 {
-    private final boolean m_isCaseSensitive;
 
-    public StringComparator(boolean b)
-    {
-        m_isCaseSensitive = b;
-    }
+    public static final StringComparator COMPARATOR = new StringComparator();
 
-    public int compare(Object o1, Object o2)
+    public int compare(String s1, String s2)
     {
-        if (m_isCaseSensitive)
-        {
-            return o1.toString().compareTo(o2.toString());
-        }
-        else
+        int n1 = s1.length();
+        int n2 = s2.length();
+        int min = n1 < n2 ? n1 : n2;
+        for ( int i = 0; i < min; i++ )
         {
-            return o1.toString().compareToIgnoreCase(o2.toString());
+            char c1 = s1.charAt( i );
+            char c2 = s2.charAt( i );
+            if ( c1 != c2 )
+            {
+                // Fast check for simple ascii codes
+                if ( c1 <= 128 && c2 <= 128 )
+                {
+                    c1 = toLowerCaseFast(c1);
+                    c2 = toLowerCaseFast(c2);
+                    if ( c1 != c2 )
+                    {
+                        return c1 - c2;
+                    }
+                }
+                else
+                {
+                    c1 = Character.toUpperCase( c1 );
+                    c2 = Character.toUpperCase( c2 );
+                    if ( c1 != c2 )
+                    {
+                        c1 = Character.toLowerCase( c1 );
+                        c2 = Character.toLowerCase( c2 );
+                        if ( c1 != c2 )
+                        {
+                            // No overflow because of numeric promotion
+                            return c1 - c2;
+                        }
+                    }
+                }
+            }
         }
+        return n1 - n2;
     }
 
-    public boolean isCaseSensitive()
+    private static char toLowerCaseFast( char ch )
     {
-        return m_isCaseSensitive;
+        return ( ch >= 'A' && ch <= 'Z' ) ? ( char ) ( ch + 'a' - 'A' ) : ch;
     }
 }
\ No newline at end of file

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/util/StringMap.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/util/StringMap.java?rev=1668536&r1=1668535&r2=1668536&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/util/StringMap.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/util/StringMap.java Mon Mar 23 08:18:22 2015
@@ -18,7 +18,6 @@
  */
 package org.apache.felix.framework.util;
 
-import java.util.Comparator;
 import java.util.Map;
 import java.util.TreeMap;
 
@@ -32,70 +31,19 @@ import java.util.TreeMap;
  **/
 public class StringMap extends TreeMap<String, Object>
 {
-    private static final CaseInsensitiveComparator COMPARATOR = new CaseInsensitiveComparator();
 
     public StringMap()
     {
-        super(COMPARATOR);
+        super(StringComparator.COMPARATOR);
     }
 
     public StringMap(Map<?, ?> map)
     {
-        super(COMPARATOR);
+        this();
         for (Map.Entry<?, ?> e : map.entrySet())
         {
             put(e.getKey().toString(), e.getValue());
         }
     }
 
-    private static class CaseInsensitiveComparator implements Comparator<String>
-    {
-
-        public int compare(String s1, String s2)
-        {
-            int n1 = s1.length();
-            int n2 = s2.length();
-            int min = n1 < n2 ? n1 : n2;
-            for ( int i = 0; i < min; i++ )
-            {
-                char c1 = s1.charAt( i );
-                char c2 = s2.charAt( i );
-                if ( c1 != c2 )
-                {
-                    // Fast check for simple ascii codes
-                    if ( c1 <= 128 && c2 <= 128 )
-                    {
-                        c1 = toLowerCaseFast(c1);
-                        c2 = toLowerCaseFast(c2);
-                        if ( c1 != c2 )
-                        {
-                            return c1 - c2;
-                        }
-                    }
-                    else
-                    {
-                        c1 = Character.toUpperCase( c1 );
-                        c2 = Character.toUpperCase( c2 );
-                        if ( c1 != c2 )
-                        {
-                            c1 = Character.toLowerCase( c1 );
-                            c2 = Character.toLowerCase( c2 );
-                            if ( c1 != c2 )
-                            {
-                                // No overflow because of numeric promotion
-                                return c1 - c2;
-                            }
-                        }
-                    }
-                }
-            }
-            return n1 - n2;
-        }
-    }
-
-    private static char toLowerCaseFast( char ch )
-    {
-        return ( ch >= 'A' && ch <= 'Z' ) ? ( char ) ( ch + 'a' - 'A' ) : ch;
-    }
-
 }