From 66e0ea1307c0e49282de0eb1a25d602ef0aebc6d Mon Sep 17 00:00:00 2001
From: Nicolas Capponi <nicolas.capponi@forgerock.com>
Date: Tue, 04 Nov 2014 16:31:06 +0000
Subject: [PATCH] OPENDJ-1585 CR-5017 Optimize/Fix CompactDn class

---
 opendj-sdk/opendj-core/src/test/java/org/forgerock/opendj/ldap/CompactDnTestCase.java |   19 +--------
 opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/DN.java                |   52 ++++++++++++-------------
 2 files changed, 27 insertions(+), 44 deletions(-)

diff --git a/opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/DN.java b/opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/DN.java
index c9a7729..c91825b 100644
--- a/opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/DN.java
+++ b/opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/DN.java
@@ -37,6 +37,7 @@
 import org.forgerock.i18n.LocalizableMessage;
 import org.forgerock.i18n.LocalizedIllegalArgumentException;
 import org.forgerock.opendj.ldap.schema.AttributeType;
+import org.forgerock.opendj.ldap.schema.CoreSchema;
 import org.forgerock.opendj.ldap.schema.MatchingRule;
 import org.forgerock.opendj.ldap.schema.Schema;
 import org.forgerock.opendj.ldap.schema.Syntax;
@@ -66,7 +67,7 @@
  *      Models </a>
  */
 public final class DN implements Iterable<RDN>, Comparable<DN> {
-    private static final DN ROOT_DN = new DN(null, null, "");
+    private static final DN ROOT_DN = new DN(CoreSchema.getInstance(), null, null, "");
 
     /**
      * This is the size of the per-thread per-schema DN cache. We should
@@ -342,7 +343,7 @@
             parent = ROOT_DN;
         }
 
-        return new DN(parent, rdn, dnString);
+        return new DN(schema, parent, rdn, dnString);
     }
 
     @SuppressWarnings("serial")
@@ -374,13 +375,17 @@
      */
     private String stringValue;
 
+    /** The schema used to create this DN. */
+    private final Schema schema;
+
     /** Private constructor. */
-    private DN(final DN parent, final RDN rdn, final String stringValue) {
-        this(parent, rdn, stringValue, parent != null ? parent.size + 1 : 0);
+    private DN(final Schema schema, final DN parent, final RDN rdn, final String stringValue) {
+        this(schema, parent, rdn, stringValue, parent != null ? parent.size + 1 : 0);
     }
 
     /** Private constructor. */
-    private DN(final DN parent, final RDN rdn, final String stringValue, final int size) {
+    private DN(final Schema schema, final DN parent, final RDN rdn, final String stringValue, final int size) {
+        this.schema = schema;
         this.parent = parent;
         this.rdn = rdn;
         this.stringValue = stringValue;
@@ -412,7 +417,7 @@
             }
             DN newDN = this;
             for (i = 0; i < rdns.length; i++) {
-                newDN = new DN(newDN, rdns[i], null);
+                newDN = new DN(this.schema, newDN, rdns[i], null);
             }
             return newDN;
         }
@@ -436,7 +441,7 @@
      */
     public DN child(final RDN rdn) {
         Reject.ifNull(rdn);
-        return new DN(this, rdn, null);
+        return new DN(this.schema, this, rdn, null);
     }
 
     /**
@@ -792,11 +797,11 @@
         } else if (index >= size) {
             return this;
         } else {
-            final DN localName = new DN(null, rdn, null, index);
+            final DN localName = new DN(this.schema, null, rdn, null, index);
             DN nextLocalName = localName;
             DN lastDN = parent;
             for (int i = index - 1; i > 0; i--) {
-                nextLocalName.parent = new DN(null, lastDN.rdn, null, i);
+                nextLocalName.parent = new DN(this.schema, null, lastDN.rdn, null, i);
                 nextLocalName = nextLocalName.parent;
                 lastDN = lastDN.parent;
             }
@@ -965,19 +970,21 @@
          * Normalized byte string, suitable for equality and comparisons, and providing a natural hierarchical ordering,
          * but not usable as a valid DN.
          */
-        private byte[] normalizedValue;
+        private volatile byte[] normalizedValue;
 
-        private CompactDn(final DN dn, final boolean initializeNormalizedValueEagerly) {
+        private final Schema schema;
+
+        private CompactDn(final DN dn) {
             this.originalValue = dn.stringValue != null ? getBytes(dn.stringValue) : new byte[0];
-            if (initializeNormalizedValueEagerly) {
-                normalizedValue = dn.toIrreversibleNormalizedByteString().toByteArray();
-            }
+            this.schema = dn.schema;
         }
 
         /** {@inheritDoc} */
         @Override
         public int compareTo(final CompactDn other) {
-            return ByteString.wrap(getNormalizedValue()).compareTo(ByteString.wrap(other.getNormalizedValue()));
+            byte[] normValue = getNormalizedValue();
+            byte[] otherNormValue = other.getNormalizedValue();
+            return ByteString.compareTo(normValue, 0, normValue.length, otherNormValue, 0, otherNormValue.length);
         }
 
         /**
@@ -986,7 +993,7 @@
          *  @return the DN
          */
         public DN toDn() {
-            return DN.valueOf(ByteString.wrap(originalValue).toString());
+            return DN.valueOf(ByteString.toString(originalValue, 0, originalValue.length), schema);
         }
 
         /** {@inheritDoc} */
@@ -1011,7 +1018,7 @@
         /** {@inheritDoc} */
         @Override
         public String toString() {
-            return ByteString.wrap(originalValue).toString();
+            return ByteString.toString(originalValue, 0, originalValue.length);
         }
 
         private byte[] getNormalizedValue() {
@@ -1028,16 +1035,7 @@
      * @return the DN compact representation
      */
     public CompactDn compact() {
-        return new CompactDn(this, false);
-    }
-
-    /**
-     * Returns a compact representation of this DN, with eager evaluation of the normalized value.
-     *
-     * @return the DN compact representation
-     */
-    public CompactDn compactEagerly() {
-        return new CompactDn(this, true);
+        return new CompactDn(this);
     }
 
     /**
diff --git a/opendj-sdk/opendj-core/src/test/java/org/forgerock/opendj/ldap/CompactDnTestCase.java b/opendj-sdk/opendj-core/src/test/java/org/forgerock/opendj/ldap/CompactDnTestCase.java
index 7c52578..4dceee4 100644
--- a/opendj-sdk/opendj-core/src/test/java/org/forgerock/opendj/ldap/CompactDnTestCase.java
+++ b/opendj-sdk/opendj-core/src/test/java/org/forgerock/opendj/ldap/CompactDnTestCase.java
@@ -25,7 +25,6 @@
  */
 package org.forgerock.opendj.ldap;
 
-import org.forgerock.opendj.ldap.DN.CompactDn;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
@@ -91,25 +90,11 @@
 
     @Test(dataProvider = "equivalentDnRepresentations")
     public void testEquals(String dn, String otherDn) throws Exception {
-        CompactDn compactDn = DN.valueOf(dn).compact();
-        CompactDn compactDnEager = DN.valueOf(dn).compactEagerly();
-        CompactDn compactOtherDn = DN.valueOf(otherDn).compact();
-        CompactDn compactOtherDnEager = DN.valueOf(otherDn).compactEagerly();
-
-        assertThat(compactDn).isEqualTo(compactOtherDn);
-        assertThat(compactDn).isEqualTo(compactOtherDnEager);
-        assertThat(compactDnEager).isEqualTo(compactOtherDn);
+        assertThat(DN.valueOf(dn).compact()).isEqualTo(DN.valueOf(otherDn).compact());
     }
 
     @Test(dataProvider = "equivalentDnRepresentations")
     public void testCompareTo(String dn, String otherDn) throws Exception {
-        CompactDn compactDn = DN.valueOf(dn).compact();
-        CompactDn compactDnEager = DN.valueOf(dn).compactEagerly();
-        CompactDn compactOtherDn = DN.valueOf(otherDn).compact();
-        CompactDn compactOtherDnEager = DN.valueOf(otherDn).compactEagerly();
-
-        assertThat(compactDn.compareTo(compactOtherDn)).isEqualTo(0);
-        assertThat(compactDn.compareTo(compactOtherDnEager)).isEqualTo(0);
-        assertThat(compactDnEager.compareTo(compactOtherDn)).isEqualTo(0);
+        assertThat(DN.valueOf(dn).compact().compareTo(DN.valueOf(otherDn).compact())).isEqualTo(0);
     }
 }

--
Gitblit v1.10.0