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/CaseIgnoreEqualityMatchingRule.java | 177 ----------------------------------------------------------
1 files changed, 2 insertions(+), 175 deletions(-)
diff --git a/opends/src/server/org/opends/server/schema/CaseIgnoreEqualityMatchingRule.java b/opends/src/server/org/opends/server/schema/CaseIgnoreEqualityMatchingRule.java
index cd6938d..93d2b8b 100644
--- a/opends/src/server/org/opends/server/schema/CaseIgnoreEqualityMatchingRule.java
+++ b/opends/src/server/org/opends/server/schema/CaseIgnoreEqualityMatchingRule.java
@@ -29,7 +29,7 @@
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;
@@ -141,181 +141,8 @@
public ByteString normalizeValue(ByteSequence value)
throws DirectoryException
{
- int valueLength = value.length();
-
- // Find the first non-space character.
- int startPos = 0;
- while ((startPos < valueLength) && (value.byteAt(startPos) == ' '))
- {
- startPos++;
- }
-
- if (startPos == valueLength)
- {
- // This should only happen if the value is composed entirely of spaces.
- // In that case, the normalized value is a single space.
- return ServerConstants.SINGLE_SPACE_VALUE;
- }
-
-
- // Find the last non-space character;
- int endPos = (valueLength-1);
- while ((endPos > startPos) && (value.byteAt(endPos) == ' '))
- {
- endPos--;
- }
-
-
- // Assume that the value contains only ASCII characters and iterate through
- // it a character at a time, converting uppercase letters to lowercase. If
- // we find a non-ASCII character, then fall back on a more correct method.
- StringBuilder buffer = new StringBuilder(endPos-startPos+1);
- boolean lastWasSpace = false;
- for (int i=startPos; i <= endPos; i++)
- {
- byte b = value.byteAt(i);
- if ((b & 0x7F) != b)
- {
- return normalizeNonASCII(value.subSequence(startPos, endPos + 1));
- }
-
- switch (b)
- {
- case ' ':
- if (! lastWasSpace)
- {
- buffer.append(' ');
- lastWasSpace = true;
- }
- break;
- case 'A':
- buffer.append('a');
- lastWasSpace = false;
- break;
- case 'B':
- buffer.append('b');
- lastWasSpace = false;
- break;
- case 'C':
- buffer.append('c');
- lastWasSpace = false;
- break;
- case 'D':
- buffer.append('d');
- lastWasSpace = false;
- break;
- case 'E':
- buffer.append('e');
- lastWasSpace = false;
- break;
- case 'F':
- buffer.append('f');
- lastWasSpace = false;
- break;
- case 'G':
- buffer.append('g');
- lastWasSpace = false;
- break;
- case 'H':
- buffer.append('h');
- lastWasSpace = false;
- break;
- case 'I':
- buffer.append('i');
- lastWasSpace = false;
- break;
- case 'J':
- buffer.append('j');
- lastWasSpace = false;
- break;
- case 'K':
- buffer.append('k');
- lastWasSpace = false;
- break;
- case 'L':
- buffer.append('l');
- lastWasSpace = false;
- break;
- case 'M':
- buffer.append('m');
- lastWasSpace = false;
- break;
- case 'N':
- buffer.append('n');
- lastWasSpace = false;
- break;
- case 'O':
- buffer.append('o');
- lastWasSpace = false;
- break;
- case 'P':
- buffer.append('p');
- lastWasSpace = false;
- break;
- case 'Q':
- buffer.append('q');
- lastWasSpace = false;
- break;
- case 'R':
- buffer.append('r');
- lastWasSpace = false;
- break;
- case 'S':
- buffer.append('s');
- lastWasSpace = false;
- break;
- case 'T':
- buffer.append('t');
- lastWasSpace = false;
- break;
- case 'U':
- buffer.append('u');
- lastWasSpace = false;
- break;
- case 'V':
- buffer.append('v');
- lastWasSpace = false;
- break;
- case 'W':
- buffer.append('w');
- lastWasSpace = false;
- break;
- case 'X':
- buffer.append('x');
- lastWasSpace = false;
- break;
- case 'Y':
- buffer.append('y');
- lastWasSpace = false;
- break;
- case 'Z':
- buffer.append('z');
- lastWasSpace = false;
- break;
- default:
- buffer.append((char) b);
- lastWasSpace = false;
- break;
- }
- }
-
-
- return ByteString.valueOf(buffer.toString());
- }
-
-
-
- /**
- * Normalizes a value that contains a non-ASCII string.
- *
- * @param value The non-ASCII value to normalize.
- *
- * @return The normalized form of the provided value.
- */
- private ByteString normalizeNonASCII(ByteSequence value)
- {
StringBuilder buffer = new StringBuilder();
- toLowerCase(value.toString(), buffer);
+ prepareUnicode(buffer, value, TRIM, CASE_FOLD);
int bufferLength = buffer.length();
if (bufferLength == 0)
--
Gitblit v1.10.0