From be2ed817814e6520d4959104a25347d0d62c8ce9 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Tue, 13 Sep 2011 10:42:27 +0000
Subject: [PATCH] Minor cleanup of some virtual attribute providers:

---
 opends/src/server/org/opends/server/extensions/MemberVirtualAttributeProvider.java                        |   10 ++-
 opends/src/server/org/opends/server/extensions/CollectiveAttributeSubentriesVirtualAttributeProvider.java |   42 +++++++++----
 opends/src/server/org/opends/server/extensions/PasswordPolicySubentryVirtualAttributeProvider.java        |   36 +++++++----
 opends/src/server/org/opends/server/extensions/IsMemberOfVirtualAttributeProvider.java                    |   44 +++++++++++---
 4 files changed, 92 insertions(+), 40 deletions(-)

diff --git a/opends/src/server/org/opends/server/extensions/CollectiveAttributeSubentriesVirtualAttributeProvider.java b/opends/src/server/org/opends/server/extensions/CollectiveAttributeSubentriesVirtualAttributeProvider.java
index 482c47c..78b63c4 100644
--- a/opends/src/server/org/opends/server/extensions/CollectiveAttributeSubentriesVirtualAttributeProvider.java
+++ b/opends/src/server/org/opends/server/extensions/CollectiveAttributeSubentriesVirtualAttributeProvider.java
@@ -23,10 +23,12 @@
  *
  *
  *      Copyright 2009-2010 Sun Microsystems, Inc.
+ *      Portions copyright 2011 ForgeRock AS
  */
 
 package org.opends.server.extensions;
 
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -38,11 +40,9 @@
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.SearchOperation;
 import org.opends.server.config.ConfigException;
-import org.opends.server.loggers.debug.DebugTracer;
 import org.opends.server.types.*;
 
 import static org.opends.messages.ExtensionMessages.*;
-import static org.opends.server.loggers.debug.DebugLogger.getTracer;
 
 /**
  * This class implements a virtual attribute provider to serve the
@@ -54,11 +54,6 @@
         CollectiveAttributeSubentriesVirtualAttributeCfg>
 {
   /**
-   * The tracer object for the debug logger.
-   */
-  private static final DebugTracer TRACER = getTracer();
-
-  /**
    * Creates a new instance of this collectiveAttributeSubentries
    * virtual attribute provider.
    */
@@ -103,13 +98,12 @@
   public Set<AttributeValue> getValues(Entry entry,
                                        VirtualAttributeRule rule)
   {
-    Set<AttributeValue> valueSet = new HashSet<AttributeValue>();
+    Set<AttributeValue> values = null;
 
     if (!entry.isSubentry() && !entry.isLDAPSubentry())
     {
-      List<SubEntry> subentries =
-              DirectoryServer.getSubentryManager(
-              ).getCollectiveSubentries(entry);
+      List<SubEntry> subentries = DirectoryServer.getSubentryManager()
+          .getCollectiveSubentries(entry);
 
       AttributeType dnAttrType =
               DirectoryServer.getAttributeType("2.5.4.49");
@@ -121,12 +115,34 @@
           DN subentryDN = subentry.getDN();
           AttributeValue value = AttributeValues.create(
                   dnAttrType, subentryDN.toString());
-          valueSet.add(value);
+
+          if (values == null)
+          {
+            values = Collections.singleton(value);
+          }
+          else if (values.size() == 1)
+          {
+            Set<AttributeValue> tmp = new HashSet<AttributeValue>(2);
+            tmp.addAll(values);
+            tmp.add(value);
+            values = tmp;
+          }
+          else
+          {
+            values.add(value);
+          }
         }
       }
     }
 
-    return valueSet;
+    if (values == null)
+    {
+      return Collections.emptySet();
+    }
+    else
+    {
+      return Collections.unmodifiableSet(values);
+    }
   }
 
 
diff --git a/opends/src/server/org/opends/server/extensions/IsMemberOfVirtualAttributeProvider.java b/opends/src/server/org/opends/server/extensions/IsMemberOfVirtualAttributeProvider.java
index b2c7985..23a522a 100644
--- a/opends/src/server/org/opends/server/extensions/IsMemberOfVirtualAttributeProvider.java
+++ b/opends/src/server/org/opends/server/extensions/IsMemberOfVirtualAttributeProvider.java
@@ -23,6 +23,7 @@
  *
  *
  *      Copyright 2008-2009 Sun Microsystems, Inc.
+ *      Portions copyright 2011 ForgeRock AS
  */
 package org.opends.server.extensions;
 
@@ -106,15 +107,30 @@
                                        VirtualAttributeRule rule)
   {
     // FIXME -- This probably isn't the most efficient implementation.
-    HashSet<AttributeValue> values = new HashSet<AttributeValue>();
-    for (Group g : DirectoryServer.getGroupManager().getGroupInstances())
+    Set<AttributeValue> values = null;
+    for (Group<?> g : DirectoryServer.getGroupManager().getGroupInstances())
     {
       try
       {
         if (g.isMember(entry))
         {
-          values.add(AttributeValues.create(rule.getAttributeType(),
-                                        g.getGroupDN().toString()));
+          AttributeValue value = AttributeValues.create(
+              rule.getAttributeType(), g.getGroupDN().toString());
+          if (values == null)
+          {
+            values = Collections.singleton(value);
+          }
+          else if (values.size() == 1)
+          {
+            Set<AttributeValue> tmp = new HashSet<AttributeValue>(2);
+            tmp.addAll(values);
+            tmp.add(value);
+            values = tmp;
+          }
+          else
+          {
+            values.add(value);
+          }
         }
       }
       catch (Exception e)
@@ -126,7 +142,14 @@
       }
     }
 
-    return Collections.unmodifiableSet(values);
+    if (values == null)
+    {
+      return Collections.emptySet();
+    }
+    else
+    {
+      return Collections.unmodifiableSet(values);
+    }
   }
 
 
@@ -138,7 +161,7 @@
   public boolean hasValue(Entry entry, VirtualAttributeRule rule)
   {
     // FIXME -- This probably isn't the most efficient implementation.
-    for (Group g : DirectoryServer.getGroupManager().getGroupInstances())
+    for (Group<?> g : DirectoryServer.getGroupManager().getGroupInstances())
     {
       try
       {
@@ -171,7 +194,7 @@
     try
     {
       DN groupDN = DN.decode(value.getValue());
-      Group g = DirectoryServer.getGroupManager().getGroupInstance(groupDN);
+      Group<?> g = DirectoryServer.getGroupManager().getGroupInstance(groupDN);
       if (g == null)
       {
         return false;
@@ -344,7 +367,7 @@
                             SearchOperation searchOperation)
   {
     SearchFilter filter = searchOperation.getFilter();
-    Group group = extractGroup(rule.getAttributeType(), filter);
+    Group<?> group = extractGroup(rule.getAttributeType(), filter);
     if (group == null)
     {
       return;
@@ -393,14 +416,15 @@
    * @return  The first group encountered in the provided filter, or
    *          {@code null} if there is no match.
    */
-  private Group extractGroup(AttributeType attributeType, SearchFilter filter)
+  private Group<?> extractGroup(AttributeType attributeType,
+      SearchFilter filter)
   {
     switch (filter.getFilterType())
     {
       case AND:
         for (SearchFilter f : filter.getFilterComponents())
         {
-          Group g = extractGroup(attributeType, f);
+          Group<?> g = extractGroup(attributeType, f);
           if (g != null)
           {
             return g;
diff --git a/opends/src/server/org/opends/server/extensions/MemberVirtualAttributeProvider.java b/opends/src/server/org/opends/server/extensions/MemberVirtualAttributeProvider.java
index b83cd1f..0bff57b 100644
--- a/opends/src/server/org/opends/server/extensions/MemberVirtualAttributeProvider.java
+++ b/opends/src/server/org/opends/server/extensions/MemberVirtualAttributeProvider.java
@@ -23,6 +23,7 @@
  *
  *
  *      Copyright 2008-2009 Sun Microsystems, Inc.
+ *      Portions copyright 2011 ForgeRock AS
  */
 package org.opends.server.extensions;
 import org.opends.messages.Message;
@@ -130,7 +131,8 @@
       return Collections.emptySet();
     }
 
-    Group g = DirectoryServer.getGroupManager().getGroupInstance(entry.getDN());
+    Group<?> g =
+      DirectoryServer.getGroupManager().getGroupInstance(entry.getDN());
     if (g == null)
     {
       return Collections.emptySet();
@@ -179,7 +181,8 @@
   @Override()
   public boolean hasValue(Entry entry, VirtualAttributeRule rule)
   {
-    Group g = DirectoryServer.getGroupManager().getGroupInstance(entry.getDN());
+    Group<?> g =
+      DirectoryServer.getGroupManager().getGroupInstance(entry.getDN());
     if (g == null)
     {
       return false;
@@ -228,7 +231,8 @@
   public boolean hasValue(Entry entry, VirtualAttributeRule rule,
                           AttributeValue value)
   {
-    Group g = DirectoryServer.getGroupManager().getGroupInstance(entry.getDN());
+    Group<?> g =
+      DirectoryServer.getGroupManager().getGroupInstance(entry.getDN());
     if (g == null)
     {
       return false;
diff --git a/opends/src/server/org/opends/server/extensions/PasswordPolicySubentryVirtualAttributeProvider.java b/opends/src/server/org/opends/server/extensions/PasswordPolicySubentryVirtualAttributeProvider.java
index 52f3a4a..d4fc10d 100644
--- a/opends/src/server/org/opends/server/extensions/PasswordPolicySubentryVirtualAttributeProvider.java
+++ b/opends/src/server/org/opends/server/extensions/PasswordPolicySubentryVirtualAttributeProvider.java
@@ -28,7 +28,7 @@
 
 package org.opends.server.extensions;
 
-import java.util.HashSet;
+import java.util.Collections;
 import java.util.Set;
 
 import org.opends.messages.Message;
@@ -106,8 +106,6 @@
   public Set<AttributeValue> getValues(Entry entry,
                                        VirtualAttributeRule rule)
   {
-    Set<AttributeValue> valueSet = new HashSet<AttributeValue>();
-
     if (!entry.isSubentry() && !entry.isLDAPSubentry())
     {
       AuthenticationPolicy policy = null;
@@ -131,28 +129,38 @@
         }
       }
 
-      if (policy != null && policy.isPasswordPolicy())
+      if (policy == null)
       {
-        AttributeType dnAttrType = DirectoryServer.getAttributeType(
-                "1.3.6.1.4.1.42.2.27.8.1.23");
+        // No authentication policy: debug log this as an error since all
+        // entries should have at least the default password policy.
+        if (debugEnabled())
+        {
+          TRACER.debugError("No applicable password policy for user %s", entry
+              .getDN().toString());
+        }
+      }
+      else if (policy.isPasswordPolicy())
+      {
+        AttributeType dnAttrType = DirectoryServer
+            .getAttributeType("1.3.6.1.4.1.42.2.27.8.1.23");
         DN policyDN = policy.getDN();
-        AttributeValue value = AttributeValues.create(
-                dnAttrType, policyDN.toString());
-        valueSet.add(value);
+        AttributeValue value = AttributeValues.create(dnAttrType,
+            policyDN.toString());
+        return Collections.singleton(value);
       }
       else
       {
-        // No default policy, debug log this.
+        // Not a password policy, could be PTA, etc.
         if (debugEnabled())
         {
-          TRACER.debugError(
-                  "No applicable password policy for user %s"
-                  + entry.getDN().toString());
+          TRACER.debugVerbose("Authentication policy %s found for user %s is "
+              + "not a password policy", policy.getDN().toString(), entry
+              .getDN().toString());
         }
       }
     }
 
-    return valueSet;
+    return Collections.emptySet();
   }
 
 

--
Gitblit v1.10.0