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

Jean-Noel Rouvignac
30.14.2014 50ef62b427894e02161742009f6ea1a28f0a6269
Improvements to DN class.

Thanks Matt for the suggestion!


DN.java:
In toIrreversibleNormalizedByteString(), initializing the StringBuilder to the number of RDNs was incorrect, creating more garbage than necessary.
In normalizeAVA(), extracted local variable for attributeType + removed useless creation of an Iterator.

DNTestCase.java:
Added more tests to increase code coverage.
2 files modified
93 ■■■■ changed files
opendj-core/src/main/java/org/forgerock/opendj/ldap/DN.java 18 ●●●●● patch | view | raw | blame | history
opendj-core/src/test/java/org/forgerock/opendj/ldap/DNTestCase.java 75 ●●●● patch | view | raw | blame | history
opendj-core/src/main/java/org/forgerock/opendj/ldap/DN.java
@@ -36,6 +36,7 @@
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.i18n.LocalizedIllegalArgumentException;
import org.forgerock.opendj.ldap.schema.AttributeType;
import org.forgerock.opendj.ldap.schema.MatchingRule;
import org.forgerock.opendj.ldap.schema.Schema;
import org.forgerock.opendj.ldap.schema.Syntax;
@@ -512,9 +513,8 @@
    public int hashCode() {
        if (size == 0) {
            return 0;
        } else {
            return 31 * parent.hashCode() + rdn.hashCode();
        }
        return 31 * parent.hashCode() + rdn.hashCode();
    }
    /**
@@ -928,7 +928,7 @@
            return ByteString.empty();
        }
        final StringBuilder builder = new StringBuilder(size());
        final StringBuilder builder = new StringBuilder();
        int i = size() - 1;
        normalizeRDN(builder, parent(i).rdn());
        for (i--; i >= 0; i--) {
@@ -1087,8 +1087,10 @@
     * @return The normalized string representation of the provided AVA.
     */
    private static StringBuilder normalizeAVA(final StringBuilder builder, final AVA ava) {
        final AttributeType attributeType = ava.getAttributeType();
        ByteString value = ava.getAttributeValue();
        final MatchingRule matchingRule = ava.getAttributeType().getEqualityMatchingRule();
        final MatchingRule matchingRule = attributeType.getEqualityMatchingRule();
        if (matchingRule != null) {
            try {
                value = matchingRule.normalizeAttributeValue(ava.getAttributeValue());
@@ -1097,18 +1099,18 @@
            }
        }
        if (!ava.getAttributeType().getNames().iterator().hasNext()) {
            builder.append(ava.getAttributeType().getOID());
        if (attributeType.getNames().isEmpty()) {
            builder.append(attributeType.getOID());
            builder.append("=#");
            builder.append(value.toHexString());
        } else {
            final String name = ava.getAttributeType().getNameOrOID();
            final String name = attributeType.getNameOrOID();
            // Normalizing.
            StaticUtils.toLowerCase(name, builder);
            builder.append("=");
            final Syntax syntax = ava.getAttributeType().getSyntax();
            final Syntax syntax = attributeType.getSyntax();
            if (!syntax.isHumanReadable()) {
                builder.append("#");
                builder.append(value.toHexString());
opendj-core/src/test/java/org/forgerock/opendj/ldap/DNTestCase.java
@@ -22,20 +22,19 @@
 *
 *
 *      Copyright 2010 Sun Microsystems, Inc.
 *      Portions copyright 2011-2012 ForgeRock AS.
 *      Portions copyright 2011-2014 ForgeRock AS.
 */
package org.forgerock.opendj.ldap;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;
import static org.testng.Assert.fail;
import java.util.Iterator;
import java.util.NoSuchElementException;
import org.forgerock.i18n.LocalizedIllegalArgumentException;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import static org.testng.Assert.*;
/**
 * This class defines a set of tests for the org.forgerock.opendj.ldap.DN class.
 */
@@ -976,8 +975,8 @@
    @Test(dataProvider = "createRenameTestData")
    public void testRename(final String dn, final String fromDN, final String toDN,
            final String expectedDN) {
        assertEquals(DN.valueOf(dn).rename(DN.valueOf(fromDN), DN.valueOf(toDN)), DN
                .valueOf(expectedDN));
        DN actual = DN.valueOf(dn).rename(DN.valueOf(fromDN), DN.valueOf(toDN));
        assertEquals(actual, DN.valueOf(expectedDN));
    }
    /**
@@ -991,9 +990,7 @@
        assertEquals(actual.toString(), "deviceId=123,uid=bjensen,dc=test");
    }
    /**
     * Tests the {@link DN#format(String, Object...)} method.
     */
    /** Tests the {@link DN#format(String, Object...)} method. */
    @Test
    public void testFormatEscape() {
        DN actual = DN.format("uid=%s,dc=test", "#cn=foo+sn=bar");
@@ -1002,12 +999,62 @@
        assertEquals(actual.toString(), "uid=\\#cn\\=foo\\+sn\\=bar,dc=test");
    }
    /**
     * Tests the {@link DN#escapeAttributeValue(Object)} method.
     */
    /** Tests the {@link DN#escapeAttributeValue(Object)} method. */
    @Test
    public void testEscapeAttributeValue() {
        String actual = DN.escapeAttributeValue("#cn=foo+sn=bar");
        assertEquals(actual, "\\#cn\\=foo\\+sn\\=bar");
    }
    /** Tests the {@link DN#toIrreversibleNormalizedByteString()} method. */
    @Test
    public void testToIrreversibleNormalizedByteStringWithRootDN() {
        ByteString actual = DN.rootDN().toIrreversibleNormalizedByteString();
        assertEquals(actual, ByteString.empty());
    }
    /** Tests the {@link DN#iterator()} method. */
    @Test
    public void testIterator() {
        final String childRdn = "dc=example";
        final String parentRdn = "dc=com";
        final Iterator<RDN> it = DN.valueOf(childRdn + "," + parentRdn).iterator();
        assertTrue(it.hasNext());
        assertEquals(it.next(), RDN.valueOf(childRdn));
        assertTrue(it.hasNext());
        assertEquals(it.next(), RDN.valueOf(parentRdn));
        assertFalse(it.hasNext());
        try {
            it.next();
            fail("Expected NoSuchElementException to be thrown");
        } catch (NoSuchElementException expected) {
            // do nothing
        }
        try {
            it.remove();
            fail("Expected UnsupportedOperationException to be thrown");
        } catch (UnsupportedOperationException expected) {
            // do nothing
        }
    }
    @DataProvider
    public Object[][] toIrreversibleNormalizedByteStringDataProvider() {
        // @formatter:off
        return new Object[][] {
            { "dc=com", "dc=com" },
            { "dc=example,dc=com", "dc=example,dc=com" },
            { "dc=example,dc=com", "dc = example, dc = com" },
            { "dc=example+cn=test,dc=com", "cn=test+dc=example,dc=com" },
        };
        // @formatter:on
    }
    /** Tests the {@link DN#toIrreversibleNormalizedByteString()} method. */
    @Test(dataProvider = "toIrreversibleNormalizedByteStringDataProvider")
    public void testToIrreversibleNormalizedByteString(String actualStr, String expectedStr) {
        DN actual = DN.valueOf(actualStr);
        DN expected = DN.valueOf(expectedStr);
        assertEquals(actual.toIrreversibleNormalizedByteString(), expected.toIrreversibleNormalizedByteString());
    }
}