From 66e0ea567ae7d17fe9c348016b18c90a33fca561 Mon Sep 17 00:00:00 2001
From: Ludovic Poitou <ludovic.poitou@forgerock.com>
Date: Mon, 13 Jun 2011 10:09:55 +0000
Subject: [PATCH] Fix to OPENDJ-197: In the StaticGroup cache, keep members as strings (ByteString) rather than DN objects. These are much more compact. DNs are built from the ByteString only when needed.

---
 opends/src/server/org/opends/server/extensions/SimpleStaticGroupMemberList.java |   34 ++++++++++++++++++++++++++--------
 1 files changed, 26 insertions(+), 8 deletions(-)

diff --git a/opends/src/server/org/opends/server/extensions/SimpleStaticGroupMemberList.java b/opends/src/server/org/opends/server/extensions/SimpleStaticGroupMemberList.java
index b582c06..7b0ccfc 100644
--- a/opends/src/server/org/opends/server/extensions/SimpleStaticGroupMemberList.java
+++ b/opends/src/server/org/opends/server/extensions/SimpleStaticGroupMemberList.java
@@ -23,6 +23,7 @@
  *
  *
  *      Copyright 2008 Sun Microsystems, Inc.
+ *      Portions Copyright 2011 ForgeRock AS
  */
 package org.opends.server.extensions;
 import org.opends.messages.Message;
@@ -33,6 +34,7 @@
 import java.util.LinkedList;
 import java.util.Set;
 
+import org.opends.server.types.ByteString;
 import org.opends.server.types.DirectoryConfig;
 import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
@@ -68,11 +70,11 @@
   private DN groupDN;
 
   // The iterator used to traverse the set of member DNs.
-  private Iterator<DN> memberDNIterator;
+  private Iterator<ByteString> memberDNIterator;
 
   // The set of DNs for the users that are members of the associated static
   // group.
-  private LinkedList<DN> memberDNs;
+  private LinkedList<ByteString> memberDNs;
 
 
 
@@ -85,12 +87,12 @@
    * @param  memberDNs  The set of DNs for the users that are members of the
    *                    associated static group.
    */
-  public SimpleStaticGroupMemberList(DN groupDN, Set<DN> memberDNs)
+  public SimpleStaticGroupMemberList(DN groupDN, Set<ByteString> memberDNs)
   {
     ensureNotNull(groupDN, memberDNs);
 
     this.groupDN   = groupDN;
-    this.memberDNs = new LinkedList<DN>(memberDNs);
+    this.memberDNs = new LinkedList<ByteString>(memberDNs);
     memberDNIterator = memberDNs.iterator();
   }
 
@@ -114,12 +116,28 @@
   public DN nextMemberDN()
          throws MembershipException
   {
+    DN dn = null;
+
     if (memberDNIterator.hasNext())
     {
-      return memberDNIterator.next();
+      try{
+        dn = DN.decode(memberDNIterator.next());
+      }
+      catch (DirectoryException de)
+      {
+        // Should not happen
+        if (debugEnabled())
+        {
+          TRACER.debugCaught(DebugLogLevel.ERROR, de);
+        }
+        Message message = ERR_STATICMEMBERS_CANNOT_DECODE_DN.
+            get(String.valueOf(dn), String.valueOf(groupDN),
+                String.valueOf(de.getMessageObject()));
+        throw new MembershipException(message, true, de);
+      }
     }
 
-    return null;
+    return dn;
   }
 
 
@@ -133,11 +151,11 @@
   {
     if (memberDNIterator.hasNext())
     {
-      DN memberDN = memberDNIterator.next();
+      ByteString memberDN = memberDNIterator.next();
 
       try
       {
-        Entry memberEntry = DirectoryConfig.getEntry(memberDN);
+        Entry memberEntry = DirectoryConfig.getEntry(DN.decode(memberDN));
         if (memberEntry == null)
         {
           Message message = ERR_STATICMEMBERS_NO_SUCH_ENTRY.get(

--
Gitblit v1.10.0