From 5d4ac645136ba6acc6fae740a4d5eb340051363a Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Mon, 03 Mar 2014 12:20:56 +0000
Subject: [PATCH] StringPrepProfile.java: Made code more readable by extracting method canMapToSpace(). In prepareUnicode(), extracted local variable 'b' earlier in the code. Inlined map() method. Code cleanup.

---
 opendj-sdk/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/SchemaUtilsTest.java |   17 +++
 opendj-sdk/opendj-core/src/main/java/com/forgerock/opendj/util/StringPrepProfile.java      |   84 +++++++---------
 opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaUtils.java     |  148 ++++++++++-------------------
 3 files changed, 105 insertions(+), 144 deletions(-)

diff --git a/opendj-sdk/opendj-core/src/main/java/com/forgerock/opendj/util/StringPrepProfile.java b/opendj-sdk/opendj-core/src/main/java/com/forgerock/opendj/util/StringPrepProfile.java
index 9db5ef7..0c0c694 100644
--- a/opendj-sdk/opendj-core/src/main/java/com/forgerock/opendj/util/StringPrepProfile.java
+++ b/opendj-sdk/opendj-core/src/main/java/com/forgerock/opendj/util/StringPrepProfile.java
@@ -25,7 +25,6 @@
  */
 package com.forgerock.opendj.util;
 
-
 import java.text.Normalizer;
 import java.text.Normalizer.Form;
 import java.util.HashMap;
@@ -44,15 +43,17 @@
      * A Table defining the mapped code-points as per RFC 3454.
      */
     private static final class MappingTable {
-        // Set of chars which are deleted from the incoming value.
-        private final static HashSet<Character> MAP_2_NULL = new HashSet<Character>();
+        /** Set of chars which are deleted from the incoming value. */
+        private static final HashSet<Character> MAP_2_NULL = new HashSet<Character>();
 
-        // Set of chars which are replaced by a SPACE when found.
-        private final static HashSet<Character> MAP_2_SPACE = new HashSet<Character>();
+        /** Set of chars which are replaced by a SPACE when found. */
+        private static final HashSet<Character> MAP_2_SPACE = new HashSet<Character>();
 
-        // Table for case-folding. Map of Character and String containing
-        // uppercase and lowercase value as the key-value pair.
-        private final static HashMap<Character, String> CASE_MAP_TABLE =
+        /**
+         * Table for case-folding. Map of Character and String containing
+         * uppercase and lowercase value as the key-value pair.
+         */
+        private static final HashMap<Character, String> CASE_MAP_TABLE =
                 new HashMap<Character, String>();
 
         static {
@@ -88,8 +89,7 @@
 
             // Appendix B.2 RFC 3454.
             // Build an uppercase array and a lowercase array and create a map
-            // of both
-            // values.
+            // of both values.
             final char[] upperCaseArr =
                     new char[] { '\u0041', '\u0042', '\u0043', '\u0044', '\u0045', '\u0046',
                         '\u0047', '\u0048', '\u0049', '\u004A', '\u004B', '\u004C', '\u004D',
@@ -369,7 +369,7 @@
             }
         }
 
-        // Gets the mapped String.
+        /** Checks each character and replaces it with its mapping. */
         private static void map(final StringBuilder buffer, final ByteSequence sequence,
                 final boolean trim, final boolean foldCase) {
             final String value = sequence.toString();
@@ -380,17 +380,9 @@
                 }
 
                 if (MAP_2_SPACE.contains(c)) {
-                    final int buffLen = buffer.length();
-                    if (trim && buffLen == 0 || buffLen > 0
-                            && buffer.charAt(buffLen - 1) == SPACE_CHAR) {
-                        /**
-                         * Do not map this character into a space if: a .
-                         * trimming is wanted and this was the first char. b.
-                         * The last character was a space.
-                         **/
-                        continue;
+                    if (canMapToSpace(buffer, trim)) {
+                        buffer.append(SPACE_CHAR);
                     }
-                    buffer.append(SPACE_CHAR);
                     continue;
                 }
 
@@ -458,46 +450,36 @@
         // common case.
         final int length = sequence.length();
         for (int i = 0; i < length; i++) {
-            if ((sequence.byteAt(i) & 0x7F) != sequence.byteAt(i)) {
+            final byte b = sequence.byteAt(i);
+            if ((b & 0x7F) != b) {
                 // Map the attribute value.
-                map(buffer, sequence.subSequence(i, length), trim, foldCase);
+                MappingTable.map(buffer, sequence.subSequence(i, length), trim, foldCase);
                 // Normalize the attribute value.
                 String normalizedForm = Normalizer.normalize(buffer, Form.NFKD);
                 buffer.setLength(0);
                 buffer.append(normalizedForm);
                 break;
             }
-            int buffLen = buffer.length();
-            switch (sequence.byteAt(i)) {
+
+            switch (b) {
             case ' ':
-                if (trim && buffLen == 0 || buffLen > 0 && buffer.charAt(buffLen - 1) == SPACE_CHAR) {
-                    break;
+                if (canMapToSpace(buffer, trim)) {
+                    buffer.append(' ');
                 }
-                buffer.append(' ');
                 break;
             default:
-                final byte b = sequence.byteAt(i);
                 // Perform mapping.
                 if (b >= '\u0009' && b < '\u000E') {
                     // These characters are mapped to a SPACE.
-                    buffLen = buffer.length();
-                    if (trim && buffLen == 0 || buffLen > 0 && buffer.charAt(buffLen - 1) == ' ') {
-                        /**
-                         * Do not map this character into a space if: a .
-                         * trimming is desired and this was the leading char. b.
-                         * The last character was a space.
-                         **/
-                        break;
-                    } else {
+                    if (canMapToSpace(buffer, trim)) {
                         buffer.append(SPACE_CHAR);
                     }
-                } else if (b >= '\u0000' && b <= '\u0008' || b >= '\u000E' && b <= '\u001F'
+                } else if ((b >= '\u0000' && b <= '\u0008') || (b >= '\u000E' && b <= '\u001F')
                         || b == '\u007F') {
                     // These characters are mapped to nothing and hence not
-                    // copied
-                    // over..
+                    // copied over..
                     break;
-                } else if (foldCase && b >= 65 && b <= 90) {
+                } else if (foldCase && b >= 'A' && b <= 'Z') {
                     // If case-folding is allowed then map to the lower case.
                     buffer.append((char) (b + 32));
                 } else {
@@ -518,13 +500,21 @@
         }
     }
 
-    // Checks each character and replaces it with its mapping.
-    private static void map(final StringBuilder buffer, final ByteSequence value,
-            final boolean trim, final boolean foldCase) {
-        MappingTable.map(buffer, value, trim, foldCase);
+    /**
+     * Do not map this character into a space if:
+     * <ol>
+     * <li>trimming is desired and this was the leading char.</li>
+     * <li>The last character was a space.</li>
+     * </ol>
+     */
+    private static boolean canMapToSpace(final StringBuilder buffer, final boolean trim) {
+        final int buffLen = buffer.length();
+        final boolean doNotMap = (trim && buffLen == 0)
+                || (buffLen > 0 && buffer.charAt(buffLen - 1) == SPACE_CHAR);
+        return !doNotMap;
     }
 
-    // Prevent instantiation.
+    /** Prevent instantiation. */
     private StringPrepProfile() {
         // Nothing to do.
     }
diff --git a/opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaUtils.java b/opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaUtils.java
index 1aaf180..346c781 100644
--- a/opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaUtils.java
+++ b/opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaUtils.java
@@ -39,7 +39,6 @@
 import java.util.Map;
 import java.util.Set;
 
-import org.forgerock.i18n.LocalizableMessage;
 import org.forgerock.opendj.ldap.ByteSequence;
 import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.opendj.ldap.DecodeException;
@@ -154,10 +153,8 @@
                     values = Collections.unmodifiableList(values);
                 }
             } else {
-                final LocalizableMessage message =
-                        ERR_ATTR_SYNTAX_ILLEGAL_CHAR_IN_STRING_OID1.get(String.valueOf(c), reader
-                                .pos() - 1);
-                throw DecodeException.error(message);
+                throw DecodeException.error(
+                        ERR_ATTR_SYNTAX_ILLEGAL_CHAR_IN_STRING_OID1.get(c, reader.pos() - 1));
             }
 
             return values;
@@ -213,19 +210,13 @@
                         && !(c == '\'' && enclosingQuote)) {
                     if (c == '.') {
                         if (lastWasPeriod) {
-                            final LocalizableMessage message =
-                                    ERR_ATTR_SYNTAX_OID_CONSECUTIVE_PERIODS1.get(reader.pos() - 1);
-                            throw DecodeException.error(message);
-                        } else {
-                            lastWasPeriod = true;
+                            throw DecodeException.error(
+                                    ERR_ATTR_SYNTAX_OID_CONSECUTIVE_PERIODS1.get(reader.pos() - 1));
                         }
+                        lastWasPeriod = true;
                     } else if (!isDigit(c)) {
-                        // This must be an illegal character.
-                        // This must have been an illegal character.
-                        final LocalizableMessage message =
-                                ERR_ATTR_SYNTAX_OID_ILLEGAL_CHARACTER1.get(String.valueOf(c),
-                                        reader.pos() - 1);
-                        throw DecodeException.error(message);
+                        throw DecodeException.error(
+                                ERR_ATTR_SYNTAX_OID_ILLEGAL_CHARACTER1.get(c, reader.pos() - 1));
                     } else {
                         lastWasPeriod = false;
                     }
@@ -234,9 +225,8 @@
                 }
 
                 if (lastWasPeriod) {
-                    final LocalizableMessage message =
-                            ERR_ATTR_SYNTAX_OID_ENDS_WITH_PERIOD1.get(reader.pos() - 1);
-                    throw DecodeException.error(message);
+                    throw DecodeException.error(
+                            ERR_ATTR_SYNTAX_OID_ENDS_WITH_PERIOD1.get(reader.pos() - 1));
                 }
             } else if (isAlpha(c)) {
                 // This must be an attribute description. In this case, we will
@@ -245,35 +235,25 @@
                 while (reader.remaining() > 0 && (c = reader.read()) != ' ' && c != ')'
                         && !(c == '\'' && enclosingQuote)) {
                     if (length == 0 && !isAlpha(c)) {
-                        // This is an illegal character.
-                        final LocalizableMessage message =
-                                ERR_ATTR_SYNTAX_ILLEGAL_CHAR_IN_STRING_OID1.get(String.valueOf(c),
-                                        reader.pos() - 1);
-                        throw DecodeException.error(message);
+                        throw DecodeException.error(
+                                ERR_ATTR_SYNTAX_ILLEGAL_CHAR_IN_STRING_OID1.get(c, reader.pos() - 1));
                     }
 
                     if (!isKeyChar(c, allowCompatChars)) {
-                        // This is an illegal character.
-                        final LocalizableMessage message =
-                                ERR_ATTR_SYNTAX_ILLEGAL_CHAR_IN_STRING_OID1.get(String.valueOf(c),
-                                        reader.pos() - 1);
-                        throw DecodeException.error(message);
+                        throw DecodeException.error(
+                                ERR_ATTR_SYNTAX_ILLEGAL_CHAR_IN_STRING_OID1.get(c, reader.pos() - 1));
                     }
 
                     length++;
                 }
             } else {
-                final LocalizableMessage message =
-                        ERR_ATTR_SYNTAX_ILLEGAL_CHAR_IN_STRING_OID1.get(String.valueOf(c), reader
-                                .pos() - 1);
-                throw DecodeException.error(message);
+                throw DecodeException.error(
+                        ERR_ATTR_SYNTAX_ILLEGAL_CHAR_IN_STRING_OID1.get(c, reader.pos() - 1));
             }
 
             if (enclosingQuote && c != '\'') {
-                final LocalizableMessage message =
-                        ERR_ATTR_SYNTAX_EXPECTED_QUOTE_AT_POS1.get(reader.pos() - 1, String
-                                .valueOf(c));
-                throw DecodeException.error(message);
+                throw DecodeException.error(
+                        ERR_ATTR_SYNTAX_EXPECTED_QUOTE_AT_POS1.get(reader.pos() - 1, c));
             }
         }
 
@@ -326,28 +306,24 @@
                 while ((c = reader.read()) != ' ' && c != '{' && !(c == '\'' && enclosingQuote)) {
                     if (c == '.') {
                         if (lastWasPeriod) {
-                            final LocalizableMessage message =
-                                    ERR_ATTR_SYNTAX_OID_CONSECUTIVE_PERIODS1.get(reader.pos() - 1);
-                            throw DecodeException.error(message);
-                        } else {
-                            lastWasPeriod = true;
+                            throw DecodeException.error(
+                                    ERR_ATTR_SYNTAX_OID_CONSECUTIVE_PERIODS1.get(reader.pos() - 1));
                         }
+                        lastWasPeriod = true;
                     } else if (!isDigit(c)) {
-                        // Technically, this must be an illegal character.
-                        // However, it is possible that someone just got sloppy
-                        // and did not
-                        // include a space between the name/OID and a closing
-                        // parenthesis. In that case, we'll assume it's the end
-                        // of the value.
+                        /*
+                         * Technically, this must be an illegal character.
+                         * However, it is possible that someone just got sloppy
+                         * and did not include a space between the name/OID and
+                         * a closing parenthesis.
+                         * In that case, we'll assume it's the end of the value.
+                         */
                         if (c == ')') {
                             break;
                         }
 
-                        // This must have been an illegal character.
-                        final LocalizableMessage message =
-                                ERR_ATTR_SYNTAX_OID_ILLEGAL_CHARACTER1.get(String.valueOf(c),
-                                        reader.pos() - 1);
-                        throw DecodeException.error(message);
+                        throw DecodeException.error(
+                                ERR_ATTR_SYNTAX_OID_ILLEGAL_CHARACTER1.get(c, reader.pos() - 1));
                     } else {
                         lastWasPeriod = false;
                     }
@@ -355,9 +331,8 @@
                 }
 
                 if (length == 0) {
-                    final LocalizableMessage message =
-                            ERR_ATTR_SYNTAX_OID_NO_VALUE1.get(reader.pos() - 1);
-                    throw DecodeException.error(message);
+                    throw DecodeException.error(
+                            ERR_ATTR_SYNTAX_OID_NO_VALUE1.get(reader.pos() - 1));
                 }
             } else if (isAlpha(c)) {
                 // This must be an attribute description. In this case, we will
@@ -366,28 +341,20 @@
                 while ((c = reader.read()) != ' ' && c != ')' && c != '{'
                         && !(c == '\'' && enclosingQuote)) {
                     if (length == 0 && !isAlpha(c)) {
-                        // This is an illegal character.
-                        final LocalizableMessage message =
-                                ERR_ATTR_SYNTAX_ILLEGAL_CHAR_IN_STRING_OID1.get(String.valueOf(c),
-                                        reader.pos() - 1);
-                        throw DecodeException.error(message);
+                        throw DecodeException.error(
+                                ERR_ATTR_SYNTAX_ILLEGAL_CHAR_IN_STRING_OID1.get(c, reader.pos() - 1));
                     }
 
                     if (!isKeyChar(c, allowCompatChars)) {
-                        // This is an illegal character.
-                        final LocalizableMessage message =
-                                ERR_ATTR_SYNTAX_ILLEGAL_CHAR_IN_STRING_OID1.get(String.valueOf(c),
-                                        reader.pos() - 1);
-                        throw DecodeException.error(message);
+                        throw DecodeException.error(
+                                ERR_ATTR_SYNTAX_ILLEGAL_CHAR_IN_STRING_OID1.get(c, reader.pos() - 1));
                     }
 
                     length++;
                 }
             } else {
-                final LocalizableMessage message =
-                        ERR_ATTR_SYNTAX_ILLEGAL_CHAR_IN_STRING_OID1.get(String.valueOf(c), reader
-                                .pos() - 1);
-                throw DecodeException.error(message);
+                throw DecodeException.error(
+                        ERR_ATTR_SYNTAX_ILLEGAL_CHAR_IN_STRING_OID1.get(c, reader.pos() - 1));
             }
 
             reader.reset();
@@ -403,10 +370,9 @@
                 // the closing curly brace.
                 while ((c = reader.read()) != '}') {
                     if (!isDigit(c)) {
-                        final LocalizableMessage message =
+                        throw DecodeException.error(
                                 ERR_ATTR_SYNTAX_OID_ILLEGAL_CHARACTER1.get(reader.getString(),
-                                        reader.pos() - 1);
-                        throw DecodeException.error(message);
+                                        reader.pos() - 1));
                     }
                 }
             } else if (c == '\'') {
@@ -471,10 +437,8 @@
             // The next character must be a single quote.
             final char c = reader.read();
             if (c != '\'') {
-                final LocalizableMessage message =
-                        ERR_ATTR_SYNTAX_EXPECTED_QUOTE_AT_POS1.get(reader.pos() - 1, String
-                                .valueOf(c));
-                throw DecodeException.error(message);
+                throw DecodeException.error(
+                        ERR_ATTR_SYNTAX_EXPECTED_QUOTE_AT_POS1.get(reader.pos() - 1, c));
             }
 
             // Read until we find the closing quote.
@@ -518,9 +482,8 @@
             }
 
             if (length == 0) {
-                final LocalizableMessage message =
-                        ERR_ATTR_SYNTAX_RULE_ID_NO_VALUE1.get(reader.pos() - 1);
-                throw DecodeException.error(message);
+                throw DecodeException.error(
+                        ERR_ATTR_SYNTAX_RULE_ID_NO_VALUE1.get(reader.pos() - 1));
             }
 
             reader.reset();
@@ -600,9 +563,8 @@
 
             if (token == null && reader.remaining() > 0) {
                 reader.reset();
-                final LocalizableMessage message =
-                        ERR_ATTR_SYNTAX_UNEXPECTED_CLOSE_PARENTHESIS1.get(length);
-                throw DecodeException.error(message);
+                throw DecodeException.error(
+                        ERR_ATTR_SYNTAX_UNEXPECTED_CLOSE_PARENTHESIS1.get(length));
             }
 
             return token;
@@ -680,29 +642,21 @@
             // The next character must be a single quote.
             char c = reader.read();
             if (c != '\'') {
-                final LocalizableMessage message =
-                        ERR_ATTR_SYNTAX_EXPECTED_QUOTE_AT_POS1.get(reader.pos() - 1, String
-                                .valueOf(c));
-                throw DecodeException.error(message);
+                throw DecodeException.error(
+                        ERR_ATTR_SYNTAX_EXPECTED_QUOTE_AT_POS1.get(reader.pos() - 1, c));
             }
 
             // Read until we find the closing quote.
             reader.mark();
             while ((c = reader.read()) != '\'') {
                 if (length == 0 && !isAlpha(c)) {
-                    // This is an illegal character.
-                    final LocalizableMessage message =
-                            ERR_ATTR_SYNTAX_ILLEGAL_CHAR_IN_STRING_OID1.get(String.valueOf(c),
-                                    reader.pos() - 1);
-                    throw DecodeException.error(message);
+                    throw DecodeException.error(
+                            ERR_ATTR_SYNTAX_ILLEGAL_CHAR_IN_STRING_OID1.get(c, reader.pos() - 1));
                 }
 
                 if (!isKeyChar(c, allowCompatChars)) {
-                    // This is an illegal character.
-                    final LocalizableMessage message =
-                            ERR_ATTR_SYNTAX_ILLEGAL_CHAR_IN_STRING_OID1.get(String.valueOf(c),
-                                    reader.pos() - 1);
-                    throw DecodeException.error(message);
+                    throw DecodeException.error(
+                            ERR_ATTR_SYNTAX_ILLEGAL_CHAR_IN_STRING_OID1.get(c, reader.pos() - 1));
                 }
 
                 length++;
diff --git a/opendj-sdk/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/SchemaUtilsTest.java b/opendj-sdk/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/SchemaUtilsTest.java
index 7ba7f82..70b7b15 100644
--- a/opendj-sdk/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/SchemaUtilsTest.java
+++ b/opendj-sdk/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/SchemaUtilsTest.java
@@ -244,4 +244,21 @@
             throws Exception {
         testNormalizeStringList(value, trim, foldCase, expected);
     }
+
+    @DataProvider
+    public Object[][] numericStringProvider() throws Exception {
+        return new Object[][] {
+            { "", "" },
+            { "   ", "" },
+            { " 123  ", "123" },
+            { " 123  456  ", "123 456" },
+        };
+    }
+
+    @Test(dataProvider = "numericStringProvider")
+    public void testNormalizeNumericString(String value, String expected) throws Exception {
+        ByteString val = ByteString.valueOf(value);
+        ByteString normValue = SchemaUtils.normalizeNumericStringAttributeValue(val);
+        Assertions.assertThat(normValue.toString()).isEqualTo(expected);
+    }
 }

--
Gitblit v1.10.0