From 81478c69903dbcd299e2748a3a37857647f8fa70 Mon Sep 17 00:00:00 2001
From: sin <sin@localhost>
Date: Thu, 26 Mar 2009 03:24:33 +0000
Subject: [PATCH] Fix for issue#3880:Core matching rules don't support unicode characters

---
 opends/src/server/org/opends/server/schema/NumericStringEqualityMatchingRule.java |   62 +++++++++++++++++--------------
 1 files changed, 34 insertions(+), 28 deletions(-)

diff --git a/opends/src/server/org/opends/server/schema/NumericStringEqualityMatchingRule.java b/opends/src/server/org/opends/server/schema/NumericStringEqualityMatchingRule.java
index cc18603..e2b5a1b 100644
--- a/opends/src/server/org/opends/server/schema/NumericStringEqualityMatchingRule.java
+++ b/opends/src/server/org/opends/server/schema/NumericStringEqualityMatchingRule.java
@@ -22,7 +22,7 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2006-2008 Sun Microsystems, Inc.
+ *      Copyright 2006-2009 Sun Microsystems, Inc.
  */
 package org.opends.server.schema;
 
@@ -31,6 +31,7 @@
 import static org.opends.messages.SchemaMessages.*;
 import static org.opends.server.schema.SchemaConstants.*;
 import static org.opends.server.util.StaticUtils.*;
+import static org.opends.server.schema.StringPrepProfile.*;
 
 import java.util.Collection;
 import java.util.Collections;
@@ -146,41 +147,46 @@
   public ByteString normalizeValue(ByteSequence value)
          throws DirectoryException
   {
-    String        valueString = value.toString();
-    int           valueLength = valueString.length();
-    StringBuilder valueBuffer = new StringBuilder(valueLength);
+    StringBuilder buffer = new StringBuilder();
+    prepareUnicode(buffer, value, TRIM, NO_CASE_FOLD);
+    int bufferLength = buffer.length();
 
     boolean logged = false;
-    for (int i=0; i < valueLength; i++)
+    for (int pos = bufferLength-1; pos > 0; pos--)
     {
-      char c = valueString.charAt(i);
-      if (isDigit(c))
+      char c = buffer.charAt(pos);
+      if (!isDigit(c))
       {
-        valueBuffer.append(c);
-      }
-      else if (c != ' ')
-      {
-        // This is an illegal character.  Either log it or reject it.
-
-        Message message = WARN_ATTR_SYNTAX_NUMERIC_STRING_ILLEGAL_CHAR.get(
-                valueString, String.valueOf(c), i);
-
-        switch (DirectoryServer.getSyntaxEnforcementPolicy())
+        if (c == ' ')
         {
-          case REJECT:
-            throw new DirectoryException(ResultCode.INVALID_ATTRIBUTE_SYNTAX,
-                                         message);
-          case WARN:
-            if (! logged)
-            {
-              ErrorLogger.logError(message);
-              logged = true;
-            }
+          buffer.delete(pos, pos+1);
+        }
+        else
+        {
+          // This is an illegal character.  Either log it or reject it.
+          Message message = WARN_ATTR_SYNTAX_NUMERIC_STRING_ILLEGAL_CHAR.get(
+                  value.toString(), String.valueOf(c), pos);
+
+          switch (DirectoryServer.getSyntaxEnforcementPolicy())
+          {
+            case REJECT:
+              throw new DirectoryException(ResultCode.INVALID_ATTRIBUTE_SYNTAX,
+                                           message);
+            case WARN:
+              if (! logged)
+              {
+                ErrorLogger.logError(message);
+                logged = true;
+              }
+          }
         }
       }
     }
-
-    return ByteString.valueOf(valueBuffer.toString());
+    if(buffer.length() == 0)
+    {
+      return ByteString.empty();
+    }
+    return ByteString.valueOf(buffer.toString());
   }
 }
 

--
Gitblit v1.10.0