mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Yannick Lecaillez
25.46.2015 0d9afb0cda5c70acc780965dbe3687a254d23acf
Fix 3.0 performance regression (CR-7367)
35 files modified
303 ■■■■■ changed files
opendj-sdk/opendj-core/clirr-ignored-api-changes.xml 9 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj-core/src/main/java/com/forgerock/opendj/util/StaticUtils.java 36 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/AVA.java 4 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/ByteString.java 6 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/AuthPasswordExactEqualityMatchingRuleImpl.java 2 ●●● patch | view | raw | blame | history
opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/DoubleMetaphoneApproximateMatchingRuleImpl.java 2 ●●● patch | view | raw | blame | history
opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/ObjectIdentifierEqualityMatchingRuleImpl.java 45 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/Schema.java 43 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaBuilder.java 38 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaUtils.java 8 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/TelephoneNumberEqualityMatchingRuleImpl.java 2 ●●● patch | view | raw | blame | history
opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/TelephoneNumberSubstringMatchingRuleImpl.java 2 ●●● patch | view | raw | blame | history
opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/UUIDEqualityMatchingRuleImpl.java 2 ●●● patch | view | raw | blame | history
opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/UUIDOrderingMatchingRuleImpl.java 2 ●●● patch | view | raw | blame | history
opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/UserPasswordExactEqualityMatchingRuleImpl.java 2 ●●● patch | view | raw | blame | history
opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldif/AbstractLDIFWriter.java 5 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj-core/src/main/resources/com/forgerock/opendj/ldap/core.properties 13 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/authorization/dseecompat/PatternDN.java 8 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/extensions/AESPasswordStorageScheme.java 2 ●●● patch | view | raw | blame | history
opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/extensions/Base64PasswordStorageScheme.java 2 ●●● patch | view | raw | blame | history
opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/extensions/BlowfishPasswordStorageScheme.java 2 ●●● patch | view | raw | blame | history
opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/extensions/CRAMMD5SASLMechanismHandler.java 3 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/extensions/ClearPasswordStorageScheme.java 2 ●●● patch | view | raw | blame | history
opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/extensions/CryptPasswordStorageScheme.java 2 ●●● patch | view | raw | blame | history
opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/extensions/MD5PasswordStorageScheme.java 2 ●●● patch | view | raw | blame | history
opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/extensions/RC4PasswordStorageScheme.java 2 ●●● patch | view | raw | blame | history
opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/extensions/RandomPasswordGenerator.java 2 ●●● patch | view | raw | blame | history
opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/extensions/SHA1PasswordStorageScheme.java 2 ●●● patch | view | raw | blame | history
opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/extensions/SaltedMD5PasswordStorageScheme.java 4 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/extensions/SaltedSHA1PasswordStorageScheme.java 4 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/extensions/SaltedSHA256PasswordStorageScheme.java 4 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/extensions/SaltedSHA384PasswordStorageScheme.java 4 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/extensions/SaltedSHA512PasswordStorageScheme.java 4 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/extensions/TripleDESPasswordStorageScheme.java 2 ●●● patch | view | raw | blame | history
opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/types/RDN.java 31 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj-core/clirr-ignored-api-changes.xml
@@ -432,4 +432,13 @@
    <method>boolean startsWith(org.forgerock.opendj.ldap.ByteSequence)</method>
    <justification>Lack of startsWith() forced to re-implement it multiple times at different location</justification>
  </difference>
    <difference>
        <className>org/forgerock/opendj/ldap/ByteString</className>
        <differenceType>7005</differenceType>
        <method>org.forgerock.opendj.ldap.ByteString valueOf(java.lang.String)
        </method>
        <from>org.forgerock.opendj.ldap.ByteString valueOf(java.lang.String)</from>
        <to>org.forgerock.opendj.ldap.ByteString valueOf(java.lang.CharSequence)</to>
        <justification>Using CharSequence instead of String allows to reduce memory copy.</justification>
    </difference>
</differences>
opendj-sdk/opendj-core/src/main/java/com/forgerock/opendj/util/StaticUtils.java
@@ -22,7 +22,7 @@
 *
 *
 *      Copyright 2009-2010 Sun Microsystems, Inc.
 *      Portions copyright 2011-2014 ForgeRock AS
 *      Portions copyright 2011-2015 ForgeRock AS
 */
package com.forgerock.opendj.util;
@@ -1293,36 +1293,36 @@
    /**
     * Construct a byte array containing the UTF-8 encoding of the provided
     * string. This is significantly faster than calling
     * char sequence. This is significantly faster than calling
     * {@link String#getBytes(String)} for ASCII strings.
     *
     * @param s
     *            The string to convert to a UTF-8 byte array.
     *            The char sequence to convert to a UTF-8 byte array.
     * @return Returns a byte array containing the UTF-8 encoding of the
     *         provided string.
     */
    public static byte[] getBytes(final String s) {
    public static byte[] getBytes(final CharSequence s) {
        if (s == null) {
            return null;
        }
        try {
            char c;
            final int length = s.length();
            final byte[] returnArray = new byte[length];
            for (int i = 0; i < length; i++) {
                c = s.charAt(i);
                returnArray[i] = (byte) (c & 0x0000007F);
                if (c != returnArray[i]) {
                    return s.getBytes("UTF-8");
        char c;
        final int length = s.length();
        final byte[] returnArray = new byte[length];
        for (int i = 0; i < length; i++) {
            c = s.charAt(i);
            returnArray[i] = (byte) (c & 0x0000007F);
            if (c != returnArray[i]) {
                try {
                    return s.toString().getBytes("UTF-8");
                } catch (UnsupportedEncodingException e) {
                    // TODO: I18N
                    throw new RuntimeException("Unable to encode UTF-8 string " + s, e);
                }
            }
            return returnArray;
        } catch (final UnsupportedEncodingException e) {
            // TODO: I18N
            throw new RuntimeException("Unable to encode UTF-8 string " + s, e);
        }
        return returnArray;
    }
    /**
opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/AVA.java
@@ -383,7 +383,7 @@
                    reader.reset();
                    // Return what we have got here so far.
                    appendHexChars(reader, valueBuffer, hexBuffer);
                    return ByteString.valueOf(valueBuffer.toString());
                    return ByteString.valueOf(valueBuffer);
                }
                // It is definitely not a delimiter at this point.
                appendHexChars(reader, valueBuffer, hexBuffer);
@@ -393,7 +393,7 @@
        }
        reader.reset();
        return ByteString.valueOf(valueBuffer.toString());
        return ByteString.valueOf(valueBuffer);
    }
    private static AttributeType readAttributeName(final SubstringReader reader, final Schema schema) {
opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/ByteString.java
@@ -136,13 +136,13 @@
    /**
     * Returns a byte string containing the UTF-8 encoded bytes of the provided
     * string.
     * char sequence.
     *
     * @param s
     *            The string to use.
     *            The char sequence to use.
     * @return The byte string with the encoded bytes of the provided string.
     */
    public static ByteString valueOf(final String s) {
    public static ByteString valueOf(final CharSequence s) {
        if (s.length() == 0) {
            return EMPTY;
        }
opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/AuthPasswordExactEqualityMatchingRuleImpl.java
@@ -57,6 +57,6 @@
        normalizedValue.append('$');
        normalizedValue.append(authPWComponents[2]);
        return ByteString.valueOf(normalizedValue.toString());
        return ByteString.valueOf(normalizedValue);
    }
}
opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/DoubleMetaphoneApproximateMatchingRuleImpl.java
@@ -851,7 +851,7 @@
            }
        }
        return ByteString.valueOf(metaphone.toString());
        return ByteString.valueOf(metaphone);
    }
    /**
opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/ObjectIdentifierEqualityMatchingRuleImpl.java
@@ -49,38 +49,21 @@
        super(EMR_OID_NAME);
    }
    static String resolveNames(final Schema schema, final String oid) {
        if (!StaticUtils.isDigit(oid.charAt(0))) {
            // Do an best effort attempt to normalize names to OIDs.
            String schemaName = null;
            if (schema.hasAttributeType(oid)) {
                schemaName = schema.getAttributeType(oid).getOID();
            }
            if (schemaName == null && schema.hasDITContentRule(oid)) {
                schemaName = schema.getDITContentRule(oid).getStructuralClass().getOID();
            }
            if (schemaName == null && schema.hasSyntax(oid)) {
                schemaName = schema.getSyntax(oid).getOID();
            }
            if (schemaName == null && schema.hasObjectClass(oid)) {
                schemaName = schema.getObjectClass(oid).getOID();
            }
            if (schemaName == null && schema.hasMatchingRule(oid)) {
                schemaName = schema.getMatchingRule(oid).getOID();
            }
            if (schemaName == null && schema.hasMatchingRuleUse(oid)) {
                schemaName = schema.getMatchingRuleUse(oid).getMatchingRule().getOID();
            }
            if (schemaName == null && schema.hasNameForm(oid)) {
                schemaName = schema.getNameForm(oid).getOID();
            }
            if (schemaName != null) {
                return schemaName;
            }
            return StaticUtils.toLowerCase(oid);
    static String resolveNames(final Schema schema, final String oidOrName) throws DecodeException {
        if (StaticUtils.isDigit(oidOrName.charAt(0))) {
            return oidOrName;
        }
        return oid;
        // Do a best effort attempt to normalize names to OIDs.
        final String lowerCaseName = StaticUtils.toLowerCase(oidOrName.toLowerCase());
        try {
            final String oid = schema.getOIDForName(lowerCaseName);
            if (oid != null) {
                return oid;
            }
        } catch (UnknownSchemaElementException e) {
            throw DecodeException.error(e.getMessageObject(), e);
        }
        return lowerCaseName;
    }
    @Override
opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/Schema.java
@@ -83,6 +83,8 @@
        Syntax getDefaultSyntax();
        String getOIDForName(String lowerCaseName);
        AttributeType getAttributeType(Schema schema, String name);
        Collection<AttributeType> getAttributeTypes();
@@ -193,6 +195,11 @@
        }
        @Override
        public String getOIDForName(final String lowerCaseName) {
            return strictImpl.getOIDForName(lowerCaseName);
        }
        @Override
        public AttributeType getAttributeType(final Schema schema, final String name) {
            final AttributeType type = strictImpl.getAttributeType0(name);
            return type != null ? type : new AttributeType(schema, name);
@@ -409,6 +416,7 @@
        private final Map<String, ObjectClass> numericOID2ObjectClasses;
        private final Map<String, Syntax> numericOID2Syntaxes;
        private final Map<String, List<NameForm>> objectClass2NameForms;
        private final Map<String, String> name2OIDs;
        private final List<LocalizableMessage> warnings;
        private final String schemaName;
        private final SchemaOptions options;
@@ -438,6 +446,7 @@
                final Map<String, List<DITStructureRule>> name2StructureRules,
                final Map<String, List<NameForm>> objectClass2NameForms,
                final Map<String, List<DITStructureRule>> nameForm2StructureRules,
                final Map<String, String> name2OIDs,
                final List<LocalizableMessage> warnings) {
            this.schemaName = schemaName;
            this.options = SchemaOptions.unmodifiable(options);
@@ -460,6 +469,7 @@
            this.name2StructureRules = Collections.unmodifiableMap(name2StructureRules);
            this.objectClass2NameForms = Collections.unmodifiableMap(objectClass2NameForms);
            this.nameForm2StructureRules = Collections.unmodifiableMap(nameForm2StructureRules);
            this.name2OIDs = Collections.unmodifiableMap(name2OIDs);
            this.warnings = Collections.unmodifiableList(warnings);
            this.strictSchema = new Schema(this);
            this.nonStrictSchema = new Schema(new NonStrictImpl(this));
@@ -491,6 +501,16 @@
        }
        @Override
        public String getOIDForName(String lowerCaseName) {
            final String oid = name2OIDs.get(lowerCaseName);
            // == is correct, AMBIGUOUS_OID is singleton to mark an entry ambiguous
            if (oid == SchemaBuilder.AMBIGUOUS_OID) {
                throw new UnknownSchemaElementException(WARN_NAME_AMBIGUOUS.get(lowerCaseName));
            }
            return oid;
        }
        @Override
        public AttributeType getAttributeType(final Schema schema, final String name) {
            final AttributeType type = getAttributeType0(name);
            if (type != null) {
@@ -531,7 +551,7 @@
                if (rules.size() == 1) {
                    return rules.get(0);
                }
                throw new UnknownSchemaElementException(WARN_DCR_AMBIGIOUS.get(name));
                throw new UnknownSchemaElementException(WARN_DCR_AMBIGUOUS.get(name));
            }
            throw new UnknownSchemaElementException(WARN_DCR_UNKNOWN.get(name));
        }
@@ -595,7 +615,7 @@
                if (rules.size() == 1) {
                    return rules.get(0);
                }
                throw new UnknownSchemaElementException(WARN_MR_AMBIGIOUS.get(name));
                throw new UnknownSchemaElementException(WARN_MR_AMBIGUOUS.get(name));
            }
            throw new UnknownSchemaElementException(WARN_MR_UNKNOWN.get(name));
        }
@@ -631,7 +651,7 @@
                if (uses.size() == 1) {
                    return uses.get(0);
                }
                throw new UnknownSchemaElementException(WARN_MRU_AMBIGIOUS.get(name));
                throw new UnknownSchemaElementException(WARN_MRU_AMBIGUOUS.get(name));
            }
            throw new UnknownSchemaElementException(WARN_MRU_UNKNOWN.get(name));
        }
@@ -662,7 +682,7 @@
                if (forms.size() == 1) {
                    return forms.get(0);
                }
                throw new UnknownSchemaElementException(WARN_NAMEFORM_AMBIGIOUS.get(name));
                throw new UnknownSchemaElementException(WARN_NAMEFORM_AMBIGUOUS.get(name));
            }
            throw new UnknownSchemaElementException(WARN_NAMEFORM_UNKNOWN.get(name));
        }
@@ -701,7 +721,7 @@
                if (classes.size() == 1) {
                    return classes.get(0);
                }
                throw new UnknownSchemaElementException(WARN_OBJECTCLASS_AMBIGIOUS.get(name));
                throw new UnknownSchemaElementException(WARN_OBJECTCLASS_AMBIGUOUS.get(name));
            }
            throw new UnknownSchemaElementException(WARN_OBJECTCLASS_UNKNOWN.get(name));
        }
@@ -826,7 +846,7 @@
                if (attributes.size() == 1) {
                    return attributes.get(0);
                }
                throw new UnknownSchemaElementException(WARN_ATTR_TYPE_AMBIGIOUS.get(name));
                throw new UnknownSchemaElementException(WARN_ATTR_TYPE_AMBIGUOUS.get(name));
            }
            return null;
        }
@@ -1088,6 +1108,17 @@
    }
    /**
     * Return the numerical OID matching the lowerCaseName.
     * @param lowerCaseName The lower case name
     * @return OID matching the name or null if name doesn't match to an OID
     * @throws UnknownSchemaElementException if multiple OID are matching
     * lowerCaseName
     */
    String getOIDForName(String lowerCaseName) {
        return impl.getOIDForName(lowerCaseName);
    }
    /**
     * Returns the attribute type with the specified name or numeric OID.
     * <p>
     * If the requested attribute type is not registered in this schema and this
opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaBuilder.java
@@ -85,6 +85,9 @@
 */
public final class SchemaBuilder {
    /** Constant used for name to oid mapping when one name actually maps to multiple numerical OID. */
    public static final String AMBIGUOUS_OID = "<ambiguous-oid>";
    private static final String ATTR_SUBSCHEMA_SUBENTRY = "subschemaSubentry";
    private static final String[] SUBSCHEMA_ATTRS = { ATTR_LDAP_SYNTAXES,
@@ -151,6 +154,7 @@
    private Map<String, ObjectClass> numericOID2ObjectClasses;
    private Map<String, Syntax> numericOID2Syntaxes;
    private Map<String, List<NameForm>> objectClass2NameForms;
    private Map<String, String> name2OIDs;
    private String schemaName;
    private List<LocalizableMessage> warnings;
    private SchemaOptions options;
@@ -2137,7 +2141,7 @@
                        numericOID2ContentRules, id2StructureRules, name2MatchingRules,
                        name2MatchingRuleUses, name2AttributeTypes, name2ObjectClasses,
                        name2NameForms, name2ContentRules, name2StructureRules,
                        objectClass2NameForms, nameForm2StructureRules, warnings).asStrictSchema();
                        objectClass2NameForms, nameForm2StructureRules, name2OIDs, warnings).asStrictSchema();
        validate(schema);
        // Re-init this builder so that it can continue to be used afterwards.
@@ -2146,6 +2150,12 @@
        return schema;
    }
    private void registerNameToOIDMapping(String name, String anOID) {
        if (name2OIDs.put(name, anOID) != null) {
            name2OIDs.put(name, AMBIGUOUS_OID);
        }
    }
    SchemaBuilder addAttributeType(final AttributeType attribute, final boolean overwrite) {
        AttributeType conflictingAttribute;
        if (numericOID2AttributeTypes.containsKey(attribute.getOID())) {
@@ -2421,6 +2431,7 @@
            }
            removeSyntax(conflictingSyntax);
        }
        numericOID2Syntaxes.put(syntax.getOID(), syntax);
        return this;
    }
@@ -2449,6 +2460,7 @@
            objectClass2NameForms = new HashMap<>();
            nameForm2StructureRules = new HashMap<>();
            name2OIDs = new HashMap<>();
            warnings = new LinkedList<>();
        }
@@ -2605,6 +2617,7 @@
                new Syntax[numericOID2Syntaxes.values().size()])) {
            try {
                syntax.validate(schema, warnings);
                registerNameToOIDMapping(syntax.getName(), syntax.getOID());
            } catch (final SchemaException e) {
                removeSyntax(syntax);
                warnings.add(ERR_SYNTAX_VALIDATION_FAIL
@@ -2616,6 +2629,9 @@
                new MatchingRule[numericOID2MatchingRules.values().size()])) {
            try {
                rule.validate(schema, warnings);
                for (final String name : rule.getNames()) {
                    registerNameToOIDMapping(StaticUtils.toLowerCase(name), rule.getOID());
                }
            } catch (final SchemaException e) {
                removeMatchingRule(rule);
                warnings.add(ERR_MR_VALIDATION_FAIL.get(rule.toString(), e.getMessageObject()));
@@ -2633,6 +2649,12 @@
            removeAttributeType(attributeType);
        }
        for (final AttributeType attributeType : numericOID2AttributeTypes.values()) {
            for (final String name : attributeType.getNames()) {
                registerNameToOIDMapping(StaticUtils.toLowerCase(name), attributeType.getOID());
            }
        }
        // Object classes need special processing because they have hierarchical
        // dependencies.
        final List<ObjectClass> invalidObjectClasses = new LinkedList<>();
@@ -2644,10 +2666,18 @@
            removeObjectClass(objectClass);
        }
        for (final ObjectClass objectClass : numericOID2ObjectClasses.values()) {
            for (final String name : objectClass.getNames()) {
                registerNameToOIDMapping(StaticUtils.toLowerCase(name), objectClass.getOID());
            }
        }
        for (final MatchingRuleUse use : numericOID2MatchingRuleUses.values().toArray(
                new MatchingRuleUse[numericOID2MatchingRuleUses.values().size()])) {
            try {
                use.validate(schema, warnings);
                for (final String name : use.getNames()) {
                    registerNameToOIDMapping(StaticUtils.toLowerCase(name), use.getMatchingRuleOID());
                }
            } catch (final SchemaException e) {
                removeMatchingRuleUse(use);
                warnings.add(ERR_MRU_VALIDATION_FAIL.get(use.toString(), e.getMessageObject()));
@@ -2671,6 +2701,9 @@
                } else {
                    forms.add(form);
                }
                for (final String name : form.getNames()) {
                    registerNameToOIDMapping(StaticUtils.toLowerCase(name), form.getOID());
                }
            } catch (final SchemaException e) {
                removeNameForm(form);
                warnings.add(ERR_NAMEFORM_VALIDATION_FAIL
@@ -2682,6 +2715,9 @@
                new DITContentRule[numericOID2ContentRules.values().size()])) {
            try {
                rule.validate(schema, warnings);
                for (final String name : rule.getNames()) {
                    registerNameToOIDMapping(StaticUtils.toLowerCase(name), rule.getStructuralClassOID());
                }
            } catch (final SchemaException e) {
                removeDITContentRule(rule);
                warnings.add(ERR_DCR_VALIDATION_FAIL.get(rule.toString(), e.getMessageObject()));
opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaUtils.java
@@ -702,7 +702,7 @@
            return singleSpaceOrEmpty(value);
        }
        trimUnnecessarySpacesInStringList(buffer);
        return ByteString.valueOf(buffer.toString());
        return ByteString.valueOf(buffer);
    }
    private static void trimUnnecessarySpacesInStringList(StringBuilder buffer) {
@@ -729,7 +729,7 @@
        if (buffer.length() == 0) {
            return singleSpaceOrEmpty(value);
        }
        return ByteString.valueOf(buffer.toString());
        return ByteString.valueOf(buffer);
    }
    static ByteString normalizeIA5StringAttributeValue(final ByteSequence value, boolean trim, boolean foldCase)
@@ -741,7 +741,7 @@
            return singleSpaceOrEmpty(value);
        }
        throwIfIA5IllegalCharacter(buffer, value);
        return ByteString.valueOf(buffer.toString());
        return ByteString.valueOf(buffer);
    }
    static void throwDecodeException(LocalizedLogger logger, LocalizableMessage message) throws DecodeException {
@@ -780,7 +780,7 @@
        if (buffer.length() == 0) {
            return ByteString.empty();
        }
        return ByteString.valueOf(buffer.toString());
        return ByteString.valueOf(buffer);
    }
}
opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/TelephoneNumberEqualityMatchingRuleImpl.java
@@ -59,6 +59,6 @@
            }
        }
        return ByteString.valueOf(buffer.toString());
        return ByteString.valueOf(buffer);
    }
}
opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/TelephoneNumberSubstringMatchingRuleImpl.java
@@ -59,6 +59,6 @@
            }
        }
        return ByteString.valueOf(buffer.toString());
        return ByteString.valueOf(buffer);
    }
}
opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/UUIDEqualityMatchingRuleImpl.java
@@ -122,6 +122,6 @@
            }
        }
        return ByteString.valueOf(builder.toString());
        return ByteString.valueOf(builder);
    }
}
opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/UUIDOrderingMatchingRuleImpl.java
@@ -123,6 +123,6 @@
            }
        }
        return ByteString.valueOf(builder.toString());
        return ByteString.valueOf(builder);
    }
}
opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/UserPasswordExactEqualityMatchingRuleImpl.java
@@ -64,7 +64,7 @@
            final ByteSequence seq2 = value.subSequence(closingBracePos + 1, value.length());
            StaticUtils.toLowerCase(seq1, builder);
            builder.append(seq2);
            return ByteString.valueOf(builder.toString());
            return ByteString.valueOf(builder);
        } else {
            return value.toByteString();
        }
opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldif/AbstractLDIFWriter.java
@@ -22,7 +22,7 @@
 *
 *
 *      Copyright 2009 Sun Microsystems, Inc.
 *      Portions copyright 2011-2013 ForgeRock AS
 *      Portions copyright 2011-2015 ForgeRock AS
 */
package org.forgerock.opendj.ldif;
@@ -300,8 +300,7 @@
    final void writeKeyAndValue(final CharSequence key, final CharSequence value)
            throws IOException {
        // FIXME: We should optimize this at some point.
        writeKeyAndValue(key, ByteString.valueOf(value.toString()));
        writeKeyAndValue(key, ByteString.valueOf(value));
    }
    final void writeLine(final CharSequence line) throws IOException {
opendj-sdk/opendj-core/src/main/resources/com/forgerock/opendj/ldap/core.properties
@@ -441,17 +441,18 @@
  OID "%s" exists in the schema
WARN_SYNTAX_UNKNOWN=No syntax with OID "%s" exists in the \
  schema
WARN_ATTR_TYPE_AMBIGIOUS=Multiple attribute types with name %s \
WARN_NAME_AMBIGUOUS=Multiple OID with name %s exists in the schema
WARN_ATTR_TYPE_AMBIGUOUS=Multiple attribute types with name %s \
  exists in the schema
WARN_OBJECTCLASS_AMBIGIOUS=Multiple object classes with name \
WARN_OBJECTCLASS_AMBIGUOUS=Multiple object classes with name \
  %s exists in the schema
WARN_MR_AMBIGIOUS=Multiple matching rules with name %s \
WARN_MR_AMBIGUOUS=Multiple matching rules with name %s \
  exists in the schema
WARN_MRU_AMBIGIOUS=Multiple matching rule uses with name %s \
WARN_MRU_AMBIGUOUS=Multiple matching rule uses with name %s \
  exists in the schema
WARN_DCR_AMBIGIOUS=Multiple DIT content rules with name %s \
WARN_DCR_AMBIGUOUS=Multiple DIT content rules with name %s \
  exists in the schema
WARN_NAMEFORM_AMBIGIOUS=Multiple name forms with name %s \
WARN_NAMEFORM_AMBIGUOUS=Multiple name forms with name %s \
  exists in the schema
WARN_ATTR_SYNTAX_SUBSTRING_NO_WILDCARDS=The provided \
 value "%s" could not be parsed as a substring assertion because it does not \
opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/authorization/dseecompat/PatternDN.java
@@ -1245,7 +1245,7 @@
        }
      }
      attributeValues.add(ByteString.valueOf(valueString.toString()));
      attributeValues.add(ByteString.valueOf(valueString));
      return pos;
    }
@@ -1264,7 +1264,7 @@
      else if (c == '*')
      {
        escaped = false;
        attributeValues.add(ByteString.valueOf(valueString.toString()));
        attributeValues.add(ByteString.valueOf(valueString));
      }
      else
      {
@@ -1362,7 +1362,7 @@
            throw new DirectoryException(ResultCode.INVALID_DN_SYNTAX,
                                         message);
          }
          attributeValues.add(ByteString.valueOf(valueString.toString()));
          attributeValues.add(ByteString.valueOf(valueString));
          valueString = new StringBuilder();
          hexChars = new StringBuilder();
        }
@@ -1395,7 +1395,7 @@
      }
      attributeValues.add(ByteString.valueOf(valueString.toString()));
      attributeValues.add(ByteString.valueOf(valueString));
      return pos;
    }
  }
opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/extensions/AESPasswordStorageScheme.java
@@ -160,7 +160,7 @@
        Arrays.fill(plaintextBytes, (byte) 0);
    }
    return ByteString.valueOf(buffer.toString());
    return ByteString.valueOf(buffer);
  }
  /** {@inheritDoc} */
opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/extensions/Base64PasswordStorageScheme.java
@@ -110,7 +110,7 @@
    buffer.append('}');
    buffer.append(Base64.encode(plaintext));
    return ByteString.valueOf(buffer.toString());
    return ByteString.valueOf(buffer);
  }
opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/extensions/BlowfishPasswordStorageScheme.java
@@ -169,7 +169,7 @@
        Arrays.fill(plaintextBytes, (byte) 0);
    }
    return ByteString.valueOf(buffer.toString());
    return ByteString.valueOf(buffer);
  }
opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/extensions/CRAMMD5SASLMechanismHandler.java
@@ -188,8 +188,7 @@
      }
      challengeString.append('>');
      ByteString challenge =
          ByteString.valueOf(challengeString.toString());
      final ByteString challenge = ByteString.valueOf(challengeString);
      clientConnection.setSASLAuthStateInfo(challenge);
      bindOperation.setServerSASLCredentials(challenge);
      bindOperation.setResultCode(ResultCode.SASL_BIND_IN_PROGRESS);
opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/extensions/ClearPasswordStorageScheme.java
@@ -103,7 +103,7 @@
    buffer.append('}');
    buffer.append(plaintext.toString());
    return ByteString.valueOf(buffer.toString());
    return ByteString.valueOf(buffer);
  }
opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/extensions/CryptPasswordStorageScheme.java
@@ -272,7 +272,7 @@
    buffer.append(encodePassword(plaintext));
    return ByteString.valueOf(buffer.toString());
    return ByteString.valueOf(buffer);
  }
  /**
opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/extensions/MD5PasswordStorageScheme.java
@@ -202,7 +202,7 @@
    buffer.append(Base64.encode(digestBytes));
    return ByteString.valueOf(buffer.toString());
    return ByteString.valueOf(buffer);
  }
opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/extensions/RC4PasswordStorageScheme.java
@@ -168,7 +168,7 @@
        Arrays.fill(plaintextBytes, (byte) 0);
    }
    return ByteString.valueOf(buffer.toString());
    return ByteString.valueOf(buffer);
  }
opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/extensions/RandomPasswordGenerator.java
@@ -253,7 +253,7 @@
      }
    }
    return ByteString.valueOf(buffer.toString());
    return ByteString.valueOf(buffer);
  }
opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/extensions/SHA1PasswordStorageScheme.java
@@ -200,7 +200,7 @@
    buffer.append(Base64.encode(digestBytes));
    return ByteString.valueOf(buffer.toString());
    return ByteString.valueOf(buffer);
  }
opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/extensions/SaltedMD5PasswordStorageScheme.java
@@ -246,7 +246,7 @@
                     NUM_SALT_BYTES);
    buffer.append(Base64.encode(hashPlusSalt));
    return ByteString.valueOf(buffer.toString());
    return ByteString.valueOf(buffer);
  }
@@ -383,7 +383,7 @@
    authPWValue.append('$');
    authPWValue.append(Base64.encode(digestBytes));
    return ByteString.valueOf(authPWValue.toString());
    return ByteString.valueOf(authPWValue);
  }
opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/extensions/SaltedSHA1PasswordStorageScheme.java
@@ -245,7 +245,7 @@
                     NUM_SALT_BYTES);
    buffer.append(Base64.encode(hashPlusSalt));
    return ByteString.valueOf(buffer.toString());
    return ByteString.valueOf(buffer);
  }
@@ -382,7 +382,7 @@
    authPWValue.append('$');
    authPWValue.append(Base64.encode(digestBytes));
    return ByteString.valueOf(authPWValue.toString());
    return ByteString.valueOf(authPWValue);
  }
opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/extensions/SaltedSHA256PasswordStorageScheme.java
@@ -250,7 +250,7 @@
                     NUM_SALT_BYTES);
    buffer.append(Base64.encode(hashPlusSalt));
    return ByteString.valueOf(buffer.toString());
    return ByteString.valueOf(buffer);
  }
@@ -389,7 +389,7 @@
    authPWValue.append('$');
    authPWValue.append(Base64.encode(digestBytes));
    return ByteString.valueOf(authPWValue.toString());
    return ByteString.valueOf(authPWValue);
  }
opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/extensions/SaltedSHA384PasswordStorageScheme.java
@@ -251,7 +251,7 @@
                     NUM_SALT_BYTES);
    buffer.append(Base64.encode(hashPlusSalt));
    return ByteString.valueOf(buffer.toString());
    return ByteString.valueOf(buffer);
  }
@@ -390,7 +390,7 @@
    authPWValue.append('$');
    authPWValue.append(Base64.encode(digestBytes));
    return ByteString.valueOf(authPWValue.toString());
    return ByteString.valueOf(authPWValue);
  }
opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/extensions/SaltedSHA512PasswordStorageScheme.java
@@ -250,7 +250,7 @@
                     NUM_SALT_BYTES);
    buffer.append(Base64.encode(hashPlusSalt));
    return ByteString.valueOf(buffer.toString());
    return ByteString.valueOf(buffer);
  }
@@ -389,7 +389,7 @@
    authPWValue.append('$');
    authPWValue.append(Base64.encode(digestBytes));
    return ByteString.valueOf(authPWValue.toString());
    return ByteString.valueOf(authPWValue);
  }
opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/extensions/TripleDESPasswordStorageScheme.java
@@ -169,7 +169,7 @@
        Arrays.fill(plaintextBytes, (byte) 0);
    }
    return ByteString.valueOf(buffer.toString());
    return ByteString.valueOf(buffer);
  }
opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/types/RDN.java
@@ -71,6 +71,8 @@
  /** The set of user-provided names for the attributes in this RDN. */
  private String[] attributeNames;
  /** Representation of the normalized form of this RDN. */
  private ByteString normalizedRDN;
  /**
@@ -1009,8 +1011,13 @@
    return buffer.toString();
  }
  private ByteString toNormalizedByteString() {
    return toNormalizedByteString(new ByteStringBuilder()).toByteString();
  private ByteString toNormalizedByteString()
  {
    if (normalizedRDN == null)
    {
      computeNormalizedByteString(new ByteStringBuilder());
    }
    return normalizedRDN;
  }
  /**
@@ -1024,7 +1031,19 @@
   *           Builder to add this representation to.
   * @return the builder
   */
  public ByteStringBuilder toNormalizedByteString(ByteStringBuilder builder) {
  public ByteStringBuilder toNormalizedByteString(ByteStringBuilder builder)
  {
    if (normalizedRDN != null)
    {
      return builder.append(normalizedRDN);
    }
    return computeNormalizedByteString(builder);
  }
  private ByteStringBuilder computeNormalizedByteString(ByteStringBuilder builder)
  {
    final int startPos = builder.length();
    if (attributeNames.length == 1)
    {
      normalizeAVAToByteString(0, builder);
@@ -1048,6 +1067,12 @@
        builder.append(iterator.next());
      }
    }
    if (normalizedRDN == null)
    {
      normalizedRDN = builder.subSequence(startPos, builder.length()).toByteString();
    }
    return builder;
  }