You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by ri...@apache.org on 2009/06/19 17:21:14 UTC

svn commit: r786542 - /felix/trunk/framework/src/main/java/org/apache/felix/framework/util/ldap/Parser.java

Author: rickhall
Date: Fri Jun 19 15:21:13 2009
New Revision: 786542

URL: http://svn.apache.org/viewvc?rev=786542&view=rev
Log:
Modified LDAP evaluation so approximate comparisons of Strings ignore
case and whitespace and characters ignore case. (FELIX-1259)

Modified:
    felix/trunk/framework/src/main/java/org/apache/felix/framework/util/ldap/Parser.java

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/util/ldap/Parser.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/util/ldap/Parser.java?rev=786542&r1=786541&r2=786542&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/util/ldap/Parser.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/util/ldap/Parser.java Fri Jun 19 15:21:13 2009
@@ -1663,9 +1663,10 @@
         }
         else if (obj1 instanceof Character)
         {
-            char value1 = ((Character)obj1).charValue();
-            char value2 = ((Character)obj2).charValue();
-            return (value2 >= (value1-((Math.abs(value1)*(char)APPROX_CRITERIA)/(char)100)) 
+            // We should ignore case.
+            char value1 = Character.toLowerCase(((Character) obj1).charValue());
+            char value2 = Character.toLowerCase(((Character) obj2).charValue());
+            return (value2 >= (value1-((Math.abs(value1)*(char)APPROX_CRITERIA)/(char)100))
                 && value2 <= (value1+((Math.abs(value1)*(char)APPROX_CRITERIA)/(char)100)));
         }
         else if (obj1 instanceof Double)
@@ -1705,10 +1706,12 @@
         }
         else if (obj1 instanceof String)
         {
+            // Spec says to ignore case and whitespace, to let's convert
+            // to lower case and remove whitespace.
             int distance = getDistance(
-                obj1.toString().toLowerCase(), obj2.toString().toLowerCase());
-            int size = ((String)obj1).length();
-            return (distance <= ((size*APPROX_CRITERIA)/100));
+                removeWhitespace(obj1.toString()), removeWhitespace(obj2.toString()));
+             int size = ((String)obj1).length();
+             return (distance <= ((size*APPROX_CRITERIA)/100));
         }
         else if (obj1 instanceof BigInteger)
         {
@@ -1737,6 +1740,19 @@
             + obj1.getClass().getName());
     }
 
+    private static String removeWhitespace(String s)
+    {
+        StringBuffer sb = new StringBuffer();
+        for (int i = 0; i < s.length(); i++)
+        {
+            if (!Character.isWhitespace(s.charAt(i)))
+            {
+                sb.append(Character.toLowerCase(s.charAt(i)));
+            }
+        }
+        return sb.toString();
+    }
+
     /**
      * Calculate the Levenshtein distance (LD) between two strings.
      * The Levenshteing distance is a measure of the similarity between