From 6bc9517c206b0b8d7cfec7ea4abb7f9dfad535ac Mon Sep 17 00:00:00 2001
From: jvergara <jvergara@localhost>
Date: Tue, 23 Oct 2007 21:16:19 +0000
Subject: [PATCH] Fix for issue 2505 (Provide monitoring information about the number of entries on a given base DN)

---
 opends/src/guitools/org/opends/guitools/statuspanel/ConfigFromLDAP.java |   62 +++++++++++++++++++++++++++++-
 1 files changed, 59 insertions(+), 3 deletions(-)

diff --git a/opends/src/guitools/org/opends/guitools/statuspanel/ConfigFromLDAP.java b/opends/src/guitools/org/opends/guitools/statuspanel/ConfigFromLDAP.java
index cbd8327..b764c95 100644
--- a/opends/src/guitools/org/opends/guitools/statuspanel/ConfigFromLDAP.java
+++ b/opends/src/guitools/org/opends/guitools/statuspanel/ConfigFromLDAP.java
@@ -29,6 +29,7 @@
 
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedHashSet;
 import java.util.Set;
 import java.util.TreeSet;
 
@@ -43,6 +44,7 @@
 import javax.naming.ldap.LdapName;
 
 import org.opends.admin.ads.util.ApplicationTrustManager;
+import org.opends.admin.ads.util.ConnectionUtils;
 import org.opends.quicksetup.util.Utils;
 
 import org.opends.messages.Message;
@@ -798,8 +800,8 @@
       type = BaseDNDescriptor.Type.NOT_REPLICATED;
     }
 
-    return new BaseDNDescriptor(type, baseDn, null, ageOfOldestMissingChange,
-      missingChanges);
+    return new BaseDNDescriptor(type, baseDn, null, -1,
+        ageOfOldestMissingChange, missingChanges);
   }
 
   /**
@@ -932,13 +934,35 @@
       Set<String> baseDns = getValues(entry, "ds-cfg-base-dn");
       TreeSet<BaseDNDescriptor> replicas = new TreeSet<BaseDNDescriptor>();
       int nEntries = getEntryCount(ctx, id);
-
+      Set<String> baseDnEntries = getBaseDNEntryCount(ctx, id);
       DatabaseDescriptor db = new DatabaseDescriptor(id, replicas, nEntries);
 
       for (String baseDn : baseDns)
       {
         BaseDNDescriptor rep = getBaseDNDescriptor(ctx, baseDn);
         rep.setDatabase(db);
+        nEntries = -1;
+        for (String s : baseDnEntries)
+        {
+          int index = s.indexOf(" ");
+          if (index != -1)
+          {
+            String dn = s.substring(index +1);
+            if (Utils.areDnsEqual(baseDn, dn))
+            {
+              try
+              {
+                nEntries = Integer.parseInt(s.substring(0, index));
+              }
+              catch (Throwable t)
+              {
+                /* Ignore */
+              }
+              break;
+            }
+          }
+        }
+        rep.setEntries(nEntries);
         db.getBaseDns().add(rep);
       }
 
@@ -1019,4 +1043,36 @@
   {
     return ConfigFromFile.isConfigBackend(id);
   }
+
+  /**
+   * Returns the values of the ds-base-dn-entry count attributes for the given
+   * backend monitor entry using the provided InitialLdapContext.
+   * @param ctx the InitialLdapContext to use to update the configuration.
+   * @param backendID the id of the backend.
+   * @return the values of the ds-base-dn-entry count attribute.
+   * @throws NamingException if there was an error.
+   */
+  private static Set<String> getBaseDNEntryCount(InitialLdapContext ctx,
+      String backendID) throws NamingException
+  {
+    LinkedHashSet<String> v = new LinkedHashSet<String>();
+    SearchControls ctls = new SearchControls();
+    ctls.setSearchScope(SearchControls.ONELEVEL_SCOPE);
+    ctls.setReturningAttributes(
+        new String[] {
+            "ds-base-dn-entry-count"
+        });
+    String filter = "(ds-backend-id="+backendID+")";
+
+    LdapName jndiName = new LdapName("cn=monitor");
+    NamingEnumeration listeners = ctx.search(jndiName, filter, ctls);
+
+    while(listeners.hasMore())
+    {
+      SearchResult sr = (SearchResult)listeners.next();
+
+      v.addAll(ConnectionUtils.getValues(sr, "ds-base-dn-entry-count"));
+    }
+    return v;
+  }
 }

--
Gitblit v1.10.0