From 9a20087a7c428eabc2c9abb9c27f01f623dbe042 Mon Sep 17 00:00:00 2001
From: Nicolas Capponi <nicolas.capponi@forgerock.com>
Date: Fri, 17 Jun 2016 09:54:07 +0000
Subject: [PATCH] OPENDJ-2655 Move CompactDN class as inner class of StaticGroup and optimize its implementation

---
 opendj-server-legacy/src/main/java/org/opends/server/extensions/FilteredStaticGroupMemberList.java |   14 +
 opendj-server-legacy/src/main/java/org/opends/server/extensions/SimpleStaticGroupMemberList.java   |   16 +-
 opendj-server-legacy/src/main/java/org/opends/server/api/Group.java                                |    7 +
 opendj-server-legacy/src/test/java/org/opends/server/extensions/CompactDnTestCase.java             |   17 +-
 opendj-core/clirr-ignored-api-changes.xml                                                          |   12 +
 opendj-server-legacy/src/main/java/org/opends/server/core/GroupManager.java                        |    4 
 opendj-core/src/main/java/org/forgerock/opendj/ldap/DN.java                                        |   96 ---------------
 opendj-server-legacy/src/main/java/org/opends/server/extensions/StaticGroup.java                   |  154 +++++++++++++++++++------
 8 files changed, 170 insertions(+), 150 deletions(-)

diff --git a/opendj-core/clirr-ignored-api-changes.xml b/opendj-core/clirr-ignored-api-changes.xml
index 1bbdd3a..336dac6 100644
--- a/opendj-core/clirr-ignored-api-changes.xml
+++ b/opendj-core/clirr-ignored-api-changes.xml
@@ -86,5 +86,15 @@
     <to>org/forgerock/opendj/ldap/schema/**SchemaElement$SchemaElementBuilder</to>
     <justification>Renamed class SchemaElement to AbstractSchemaElement</justification>
   </difference>
-  
+   <difference>
+    <className>org/forgerock/opendj/ldap/DN</className>
+    <differenceType>7002</differenceType>
+    <method>org.forgerock.opendj.ldap.DN$CompactDn compact()</method>
+    <justification>CompactDN has been migrated to server</justification>
+  </difference>
+  <difference>
+    <className>org/forgerock/opendj/ldap/DN$CompactDn</className>
+    <differenceType>8001</differenceType>
+    <justification>CompactDN has been migrated to server</justification>
+  </difference>
 </differences>
diff --git a/opendj-core/src/main/java/org/forgerock/opendj/ldap/DN.java b/opendj-core/src/main/java/org/forgerock/opendj/ldap/DN.java
index edb5c32..b165e0d 100644
--- a/opendj-core/src/main/java/org/forgerock/opendj/ldap/DN.java
+++ b/opendj-core/src/main/java/org/forgerock/opendj/ldap/DN.java
@@ -16,7 +16,6 @@
  */
 package org.forgerock.opendj.ldap;
 
-import java.util.Arrays;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.LinkedList;
@@ -35,7 +34,6 @@
 import com.forgerock.opendj.util.SubstringReader;
 
 import static com.forgerock.opendj.ldap.CoreMessages.*;
-import static com.forgerock.opendj.util.StaticUtils.*;
 
 /**
  * A distinguished name (DN) as defined in RFC 4512 section 2.3 is the
@@ -329,6 +327,7 @@
     private final RDN rdn;
     private DN parent;
     private final int size;
+    private int hashCode = -1;
 
     /**
      * The normalized byte string representation of this DN, which is not
@@ -472,7 +471,10 @@
 
     @Override
     public int hashCode() {
-        return toNormalizedByteString().hashCode();
+        if (hashCode == -1) {
+            hashCode = toNormalizedByteString().hashCode();
+        }
+        return hashCode;
     }
 
     /**
@@ -985,92 +987,4 @@
         return UUID.nameUUIDFromBytes(normDN.toByteArray());
     }
 
-    /**
-     * A compact representation of a DN, suitable for equality and comparisons, and providing a natural hierarchical
-     * ordering.
-     * <p>
-     * This representation should be used when it is important to reduce memory usage. The memory consumption compared
-     * to a regular DN object is minimal. Prototypical usage is for static groups implementation where large groups of
-     * DNs must be recorded and must be converted back to DNs.
-     * <p>
-     * This representation can be created either eagerly or lazily.
-     * <ul>
-     *   <li>eagerly: the normalized value is computed immediately at creation time.</li>
-     *   <li>lazily: the normalized value is computed only the first time it is needed.</li>
-     * </ul>
-     *
-     * @deprecated This class will eventually be replaced by a compact implementation of a DN.
-     */
-    @Deprecated
-    public static final class CompactDn implements Comparable<CompactDn> {
-        /** Original string corresponding to the DN. */
-        private final byte[] originalValue;
-
-        /**
-         * Normalized byte string, suitable for equality and comparisons, and providing a natural hierarchical ordering,
-         * but not usable as a valid DN.
-         */
-        private volatile byte[] normalizedValue;
-
-        private final Schema schema;
-
-        private CompactDn(final DN dn) {
-            this.originalValue = getBytes(dn.toString());
-            this.schema = dn.schema;
-        }
-
-        @Override
-        public int compareTo(final CompactDn other) {
-            byte[] normValue = getNormalizedValue();
-            byte[] otherNormValue = other.getNormalizedValue();
-            return ByteString.compareTo(normValue, 0, normValue.length, otherNormValue, 0, otherNormValue.length);
-        }
-
-        /**
-         * Returns the DN corresponding to this compact representation.
-         *
-         *  @return the DN
-         */
-        public DN toDn() {
-            return DN.valueOf(ByteString.toString(originalValue, 0, originalValue.length), schema);
-        }
-
-        @Override
-        public int hashCode() {
-            return Arrays.hashCode(getNormalizedValue());
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            if (this == obj) {
-                return true;
-            } else if (obj instanceof CompactDn) {
-                final CompactDn other = (CompactDn) obj;
-                return Arrays.equals(getNormalizedValue(), other.getNormalizedValue());
-            } else {
-                return false;
-            }
-        }
-
-        @Override
-        public String toString() {
-            return ByteString.toString(originalValue, 0, originalValue.length);
-        }
-
-        private byte[] getNormalizedValue() {
-            if (normalizedValue == null) {
-                normalizedValue = toDn().toNormalizedByteString().toByteArray();
-            }
-            return normalizedValue;
-        }
-    }
-
-    /**
-     * Returns a compact representation of this DN, with lazy evaluation of the normalized value.
-     *
-     * @return the DN compact representation
-     */
-    public CompactDn compact() {
-        return new CompactDn(this);
-    }
 }
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/api/Group.java b/opendj-server-legacy/src/main/java/org/opends/server/api/Group.java
index b58cbf9..5dd385f 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/api/Group.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/api/Group.java
@@ -16,7 +16,6 @@
  */
 package org.opends.server.api;
 
-import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
@@ -288,6 +287,9 @@
    *                         its DN should be added to the list, and
    *                         any DN already contained in the list
    *                         should be skipped.
+   *                         The use of an atomic reference allow to
+   *                         lazily create the Set to optimize memory
+   *                         when there is no nested groups.
    *
    * @return  {@code true} if the specified user is currently a member
    *          of this group, or {@code false} if not.
@@ -339,6 +341,9 @@
    *                         its DN should be added to the list, and
    *                         any DN already contained in the list
    *                         should be skipped.
+   *                         The use of an atomic reference allow to
+   *                         lazily create the Set to optimize memory
+   *                         when there is no nested groups.
    *
    * @return  {@code true} if the specified user is currently a member
    *          of this group, or {@code false} if not.
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/core/GroupManager.java b/opendj-server-legacy/src/main/java/org/opends/server/core/GroupManager.java
index 478c1ad..667dde4 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/core/GroupManager.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/core/GroupManager.java
@@ -579,7 +579,7 @@
           {
             try
             {
-              Group<?> groupInstance = groupImplementation.newInstance(null, entry);
+              Group<?> groupInstance = groupImplementation.newInstance(serverContext, entry);
               groupInstances.put(entry.getName(), groupInstance);
               refreshToken++;
             }
@@ -937,7 +937,7 @@
       {
         if (groupImplementation.isGroupDefinition(entry))
         {
-          Group<?> groupInstance = groupImplementation.newInstance(null, entry);
+          Group<?> groupInstance = groupImplementation.newInstance(serverContext, entry);
 
           lock.writeLock().lock();
           try
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/extensions/FilteredStaticGroupMemberList.java b/opendj-server-legacy/src/main/java/org/opends/server/extensions/FilteredStaticGroupMemberList.java
index d4a29fd..bdcee61 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/extensions/FilteredStaticGroupMemberList.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/extensions/FilteredStaticGroupMemberList.java
@@ -25,9 +25,10 @@
 import org.forgerock.i18n.LocalizableMessage;
 import org.forgerock.i18n.LocalizedIllegalArgumentException;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
-import org.forgerock.opendj.ldap.DN.CompactDn;
 import org.forgerock.opendj.ldap.SearchScope;
 import org.forgerock.opendj.ldap.DN;
+import org.opends.server.core.ServerContext;
+import org.opends.server.extensions.StaticGroup.CompactDn;
 import org.opends.server.types.DirectoryConfig;
 import org.opends.server.types.DirectoryException;
 import org.opends.server.types.Entry;
@@ -65,10 +66,14 @@
   /** The search scope to apply against the base DN for the member subset. */
   private SearchScope scope;
 
+  private final ServerContext serverContext;
+
   /**
    * Creates a new filtered static group member list with the provided
    * information.
    *
+   * @param serverContext
+   *            The server context.
    * @param  groupDN    The DN of the static group with which this member list
    *                    is associated.
    * @param  memberDNs  The set of DNs for the users that are members of the
@@ -82,11 +87,12 @@
    *                    match.  If this is {@code null}, then all members will
    *                    be considered eligible.
    */
-  public FilteredStaticGroupMemberList(DN groupDN, Set<CompactDn> memberDNs, DN baseDN, SearchScope scope,
-      SearchFilter filter)
+  public FilteredStaticGroupMemberList(ServerContext serverContext, DN groupDN, Set<CompactDn> memberDNs, DN baseDN,
+      SearchScope scope, SearchFilter filter)
   {
     ifNull(groupDN, memberDNs);
 
+    this.serverContext = serverContext;
     this.groupDN   = groupDN;
     this.memberDNIterator = memberDNs.iterator();
     this.baseDN = baseDN;
@@ -112,7 +118,7 @@
       DN nextDN = null;
       try
       {
-        nextDN = StaticGroup.fromCompactDn(memberDNIterator.next());
+        nextDN = memberDNIterator.next().toDn(serverContext);
       }
       catch (LocalizedIllegalArgumentException e)
       {
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/extensions/SimpleStaticGroupMemberList.java b/opendj-server-legacy/src/main/java/org/opends/server/extensions/SimpleStaticGroupMemberList.java
index e98f64d..98af278 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/extensions/SimpleStaticGroupMemberList.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/extensions/SimpleStaticGroupMemberList.java
@@ -16,13 +16,13 @@
  */
 package org.opends.server.extensions;
 import org.forgerock.i18n.LocalizableMessage;
-
 import org.forgerock.i18n.LocalizedIllegalArgumentException;
 
 import java.util.Iterator;
 import java.util.Set;
 
-import org.forgerock.opendj.ldap.DN.CompactDn;
+import org.opends.server.core.ServerContext;
+import org.opends.server.extensions.StaticGroup.CompactDn;
 import org.opends.server.types.DirectoryConfig;
 import org.opends.server.types.DirectoryException;
 import org.forgerock.opendj.ldap.DN;
@@ -32,7 +32,6 @@
 import org.forgerock.i18n.slf4j.LocalizedLogger;
 
 import static org.opends.messages.ExtensionMessages.*;
-import static org.opends.server.extensions.StaticGroup.*;
 import static org.forgerock.util.Reject.*;
 
 /**
@@ -50,18 +49,23 @@
   /** The iterator used to traverse the set of member DNs. */
   private Iterator<CompactDn> memberDNIterator;
 
+  private final ServerContext serverContext;
+
   /**
    * Creates a new simple static group member list with the provided set of
    * member DNs.
    *
+   * @param serverContext
+   *            The server context.
    * @param  groupDN    The DN of the static group with which this member list
    *                    is associated.
    * @param  memberDNs  The set of DNs for the users that are members of the
    *                    associated static group.
    */
-  public SimpleStaticGroupMemberList(DN groupDN, Set<CompactDn> memberDNs)
+  public SimpleStaticGroupMemberList(ServerContext serverContext, DN groupDN, Set<CompactDn> memberDNs)
   {
     ifNull(groupDN, memberDNs);
+    this.serverContext = serverContext;
     this.groupDN   = groupDN;
     this.memberDNIterator = memberDNs.iterator();
   }
@@ -81,7 +85,7 @@
     {
       try
       {
-        dn = fromCompactDn(memberDNIterator.next());
+        dn = memberDNIterator.next().toDn(serverContext);
       }
       catch (LocalizedIllegalArgumentException e)
       {
@@ -104,7 +108,7 @@
 
       try
       {
-        Entry memberEntry = DirectoryConfig.getEntry(fromCompactDn(memberDN));
+        Entry memberEntry = DirectoryConfig.getEntry(memberDN.toDn(serverContext));
         if (memberEntry == null)
         {
           LocalizableMessage message = ERR_STATICMEMBERS_NO_SUCH_ENTRY.get(memberDN, groupDN);
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/extensions/StaticGroup.java b/opendj-server-legacy/src/main/java/org/opends/server/extensions/StaticGroup.java
index 2a80704..fbd0a53 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/extensions/StaticGroup.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/extensions/StaticGroup.java
@@ -16,7 +16,12 @@
  */
 package org.opends.server.extensions;
 
+import static com.forgerock.opendj.util.StaticUtils.getBytes;
+
+import java.io.UnsupportedEncodingException;
+import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.List;
@@ -30,7 +35,6 @@
 import org.forgerock.opendj.config.server.ConfigException;
 import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.opendj.ldap.DN;
-import org.forgerock.opendj.ldap.DN.CompactDn;
 import org.forgerock.opendj.ldap.ModificationType;
 import org.forgerock.opendj.ldap.ResultCode;
 import org.forgerock.opendj.ldap.SearchScope;
@@ -38,6 +42,7 @@
 import org.forgerock.opendj.server.config.server.GroupImplementationCfg;
 import org.forgerock.opendj.server.config.server.StaticGroupImplementationCfg;
 import org.forgerock.util.Reject;
+import org.forgerock.util.annotations.VisibleForTesting;
 import org.opends.server.api.Group;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.ModifyOperation;
@@ -88,7 +93,7 @@
   private DN groupEntryDN;
 
   /** The set of the DNs of the members for this group. */
-  private LinkedHashSet<CompactDn> memberDNs;
+  private HashSet<CompactDn> memberDNs;
 
   /** The list of nested group DNs for this group. */
   private LinkedList<DN> nestedGroups = new LinkedList<>();
@@ -202,7 +207,7 @@
       {
         try
         {
-          someMemberDNs.add(DN.valueOf(v.toString()).compact());
+          someMemberDNs.add(new CompactDn(DN.valueOf(v.toString())));
         }
         catch (LocalizedIllegalArgumentException e)
         {
@@ -333,8 +338,8 @@
       newNestedGroups.add(nestedGroupDN);
       nestedGroups = newNestedGroups;
       //Add it to the member DN list.
-      LinkedHashSet<CompactDn> newMemberDNs = new LinkedHashSet<>(memberDNs);
-      newMemberDNs.add(toCompactDn(nestedGroupDN));
+      HashSet<CompactDn> newMemberDNs = new HashSet<>(memberDNs);
+      newMemberDNs.add(new CompactDn(nestedGroupDN));
       memberDNs = newMemberDNs;
     }
     finally
@@ -372,7 +377,7 @@
       nestedGroups = newNestedGroups;
       //Remove it from the member DN list.
       LinkedHashSet<CompactDn> newMemberDNs = new LinkedHashSet<>(memberDNs);
-      newMemberDNs.remove(toCompactDn(nestedGroupDN));
+      newMemberDNs.remove(new CompactDn(nestedGroupDN));
       memberDNs = newMemberDNs;
     }
     finally
@@ -385,7 +390,7 @@
   public boolean isMember(DN userDN, Set<DN> examinedGroups) throws DirectoryException
   {
     reloadIfNeeded();
-    CompactDn compactUserDN = toCompactDn(userDN);
+    CompactDn compactUserDN = new CompactDn(userDN);
     lock.readLock().lock();
     try
     {
@@ -440,8 +445,8 @@
         // Check if the group itself has been removed
         if (thisGroup == null)
         {
-          throw new DirectoryException(ResultCode.NO_SUCH_ATTRIBUTE,
-                  ERR_STATICGROUP_GROUP_INSTANCE_INVALID.get(groupEntryDN));
+          throw new DirectoryException(ResultCode.NO_SUCH_ATTRIBUTE, ERR_STATICGROUP_GROUP_INSTANCE_INVALID
+              .get(groupEntryDN));
         }
         else if (thisGroup != this)
         {
@@ -451,7 +456,7 @@
           {
             try
             {
-              newMemberDNs.add(toCompactDn(memberList.nextMemberDN()));
+              newMemberDNs.add(new CompactDn(memberList.nextMemberDN()));
             }
             catch (MembershipException ex)
             {
@@ -463,7 +468,7 @@
         nestedGroups.clear();
         for (CompactDn compactDn : memberDNs)
         {
-          DN dn = fromCompactDn(compactDn);
+          DN dn = compactDn.toDn(serverContext);
           Group<?> group = DirectoryServer.getGroupManager().getGroupInstance(dn);
           if (group != null)
           {
@@ -486,7 +491,7 @@
     lock.readLock().lock();
     try
     {
-      return new SimpleStaticGroupMemberList(groupEntryDN, memberDNs);
+      return new SimpleStaticGroupMemberList(serverContext, groupEntryDN, memberDNs);
     }
     finally
     {
@@ -503,9 +508,9 @@
     {
       if (baseDN == null && filter == null)
       {
-        return new SimpleStaticGroupMemberList(groupEntryDN, memberDNs);
+        return new SimpleStaticGroupMemberList(serverContext, groupEntryDN, memberDNs);
       }
-      return new FilteredStaticGroupMemberList(groupEntryDN, memberDNs, baseDN, scope, filter);
+      return new FilteredStaticGroupMemberList(serverContext, groupEntryDN, memberDNs, baseDN, scope, filter);
     }
     finally
     {
@@ -541,7 +546,7 @@
               for (ByteString v : attribute)
               {
                 DN member = DN.valueOf(v);
-                memberDNs.add(toCompactDn(member));
+                memberDNs.add(new CompactDn(member));
                 if (DirectoryServer.getGroupManager().getGroupInstance(member) != null)
                 {
                   nestedGroups.add(member);
@@ -559,7 +564,7 @@
                 for (ByteString v : attribute)
                 {
                   DN member = DN.valueOf(v);
-                  memberDNs.remove(toCompactDn(member));
+                  memberDNs.remove(new CompactDn(member));
                   nestedGroups.remove(member);
                 }
               }
@@ -570,7 +575,7 @@
               for (ByteString v : attribute)
               {
                 DN member = DN.valueOf(v);
-                memberDNs.add(toCompactDn(member));
+                memberDNs.add(new CompactDn(member));
                 if (DirectoryServer.getGroupManager().getGroupInstance(member) != null)
                 {
                   nestedGroups.add(member);
@@ -595,7 +600,7 @@
     try
     {
       DN userDN = userEntry.getName();
-      CompactDn compactUserDN = toCompactDn(userDN);
+      CompactDn compactUserDN = new CompactDn(userDN);
 
       if (memberDNs.contains(compactUserDN))
       {
@@ -626,7 +631,7 @@
   {
     Reject.ifNull(userDN);
 
-    CompactDn compactUserDN = toCompactDn(userDN);
+    CompactDn compactUserDN = new CompactDn(userDN);
     lock.writeLock().lock();
     try
     {
@@ -680,26 +685,99 @@
   }
 
   /**
-   * Convert the provided DN to a compact DN.
-   *
-   * @param dn
-   *            The DN
-   * @return the compact representation of the DN
+   * A compact representation of a DN, suitable for equality and comparisons, and providing a natural hierarchical
+   * ordering.
+   * <p>
+   * The memory consumption compared to a regular DN object is minimal.
    */
-  private CompactDn toCompactDn(DN dn)
+  static final class CompactDn implements Comparable<CompactDn>
   {
-    return dn.compact();
-  }
+    /** Original string corresponding to the DN. */
+    private final byte[] originalValue;
 
-  /**
-   * Convert the provided compact DN to a DN.
-   *
-   * @param compactDn
-   *            Compact representation of a DN
-   * @return the regular DN
-   */
-  static DN fromCompactDn(CompactDn compactDn)
-  {
-    return compactDn.toDn();
+    /**
+     * Normalized byte string, suitable for equality and comparisons, and providing a natural
+     * hierarchical ordering, but not usable as a valid DN.
+     */
+    private final byte[] normalizedValue;
+
+    @VisibleForTesting
+    CompactDn(DN dn)
+    {
+      this.originalValue = getBytes(dn.toString());
+      this.normalizedValue = dn.toNormalizedByteString().toByteArray();
+    }
+
+    @Override
+    public int compareTo(final CompactDn other)
+    {
+      final int length1 = normalizedValue.length;
+      final int length2 = other.normalizedValue.length;
+      int count = Math.min(length1, length2);
+      int i = 0;
+      int j = 0;
+      while (count-- != 0)
+      {
+        final int firstByte = 0xFF & normalizedValue[i++];
+        final int secondByte = 0xFF & other.normalizedValue[j++];
+        if (firstByte != secondByte)
+        {
+          return firstByte - secondByte;
+        }
+      }
+      return length1 - length2;
+    }
+
+    /**
+     * Returns the DN corresponding to this compact representation.
+     *
+     * @param serverContext
+     *          The server context.
+     *
+     * @return the DN
+     */
+    public DN toDn(ServerContext serverContext)
+    {
+      return DN.valueOf(toString(), serverContext.getSchemaNG());
+    }
+
+    @Override
+    public int hashCode()
+    {
+      return Arrays.hashCode(normalizedValue);
+    }
+
+    @Override
+    public boolean equals(Object obj)
+    {
+      if (this == obj)
+      {
+        return true;
+      }
+      else if (obj instanceof CompactDn)
+      {
+        final CompactDn other = (CompactDn) obj;
+        return Arrays.equals(normalizedValue, other.normalizedValue);
+      }
+      else
+      {
+        return false;
+      }
+    }
+
+    @Override
+    public String toString()
+    {
+      final int length = originalValue.length;
+      if (length == 0) {
+          return "";
+      }
+      try {
+          return new String(originalValue, 0, length, "UTF-8");
+      } catch (final UnsupportedEncodingException e) {
+          // TODO: I18N
+          throw new RuntimeException("Unable to decode bytes as UTF-8 string", e);
+      }
+    }
   }
-}
+}
\ No newline at end of file
diff --git a/opendj-core/src/test/java/org/forgerock/opendj/ldap/CompactDnTestCase.java b/opendj-server-legacy/src/test/java/org/opends/server/extensions/CompactDnTestCase.java
similarity index 86%
rename from opendj-core/src/test/java/org/forgerock/opendj/ldap/CompactDnTestCase.java
rename to opendj-server-legacy/src/test/java/org/opends/server/extensions/CompactDnTestCase.java
index 2b26ad0..ad34c28 100644
--- a/opendj-core/src/test/java/org/forgerock/opendj/ldap/CompactDnTestCase.java
+++ b/opendj-server-legacy/src/test/java/org/opends/server/extensions/CompactDnTestCase.java
@@ -11,20 +11,23 @@
  * Header, with the fields enclosed by brackets [] replaced by your own identifying
  * information: "Portions Copyright [year] [name of copyright owner]".
  *
- * Copyright 2014 ForgeRock AS.
+ * Copyright 2014-2016 ForgeRock AS.
  */
-package org.forgerock.opendj.ldap;
+package org.opends.server.extensions;
 
+import org.forgerock.opendj.ldap.DN;
+import org.opends.server.DirectoryServerTestCase;
+import org.opends.server.extensions.StaticGroup.CompactDn;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
 import static org.fest.assertions.Assertions.*;
 
 /**
- * This class defines a set of tests for the org.forgerock.opendj.ldap.DN.CompactDn class.
+ * This class defines a set of tests for the inner class StaticGroup.CompactDn.
  */
 @SuppressWarnings("javadoc")
-public class CompactDnTestCase extends SdkTestCase {
+public class CompactDnTestCase extends DirectoryServerTestCase {
 
     /**
      * DN test data provider.
@@ -80,11 +83,11 @@
 
     @Test(dataProvider = "equivalentDnRepresentations")
     public void testEquals(String dn, String otherDn) throws Exception {
-        assertThat(DN.valueOf(dn).compact()).isEqualTo(DN.valueOf(otherDn).compact());
+      assertThat(new CompactDn(DN.valueOf(dn))).isEqualTo(new CompactDn(DN.valueOf(otherDn)));
     }
 
     @Test(dataProvider = "equivalentDnRepresentations")
     public void testCompareTo(String dn, String otherDn) throws Exception {
-        assertThat(DN.valueOf(dn).compact().compareTo(DN.valueOf(otherDn).compact())).isEqualTo(0);
+        assertThat(new CompactDn(DN.valueOf(dn)).compareTo(new CompactDn(DN.valueOf(otherDn)))).isEqualTo(0);
     }
-}
+}
\ No newline at end of file

--
Gitblit v1.10.0