From 1d5f9c9484a47d91ab2c4cf3796e5b1effca89ec Mon Sep 17 00:00:00 2001
From: jvergara <jvergara@localhost>
Date: Wed, 18 Apr 2007 14:15:39 +0000
Subject: [PATCH] The following changes have two main goals:

---
 opendj-sdk/opends/src/statuspanel/org/opends/statuspanel/ConfigFromLDAP.java |  202 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 200 insertions(+), 2 deletions(-)

diff --git a/opendj-sdk/opends/src/statuspanel/org/opends/statuspanel/ConfigFromLDAP.java b/opendj-sdk/opends/src/statuspanel/org/opends/statuspanel/ConfigFromLDAP.java
index 4ee12b3..5366004 100644
--- a/opendj-sdk/opends/src/statuspanel/org/opends/statuspanel/ConfigFromLDAP.java
+++ b/opendj-sdk/opends/src/statuspanel/org/opends/statuspanel/ConfigFromLDAP.java
@@ -27,9 +27,13 @@
 
 package org.opends.statuspanel;
 
+import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedHashSet;
 import java.util.Set;
+import java.util.TreeSet;
 
+import javax.naming.NameNotFoundException;
 import javax.naming.NamingEnumeration;
 import javax.naming.NamingException;
 import javax.naming.directory.Attribute;
@@ -55,6 +59,12 @@
     new HashSet<DatabaseDescriptor>();
   private HashSet<String> administrativeUsers = new HashSet<String>();
   private String errorMessage;
+  private boolean synchronizationConfigured = false;
+  private HashSet<String> synchronizedSuffixes = new HashSet<String>();
+  private HashMap<String, Integer> hmMissingChanges =
+    new HashMap<String, Integer>();
+  private HashMap<String, Integer> hmAgeOfOldestMissingChanges =
+    new HashMap<String, Integer>();
 
   private String dn;
   private String pwd;
@@ -130,6 +140,10 @@
     listeners.clear();
     databases.clear();
     administrativeUsers.clear();
+    synchronizationConfigured = false;
+    synchronizedSuffixes.clear();
+    hmMissingChanges.clear();
+    hmAgeOfOldestMissingChanges.clear();
     javaVersion = null;
     openConnections = -1;
 
@@ -138,6 +152,7 @@
       InitialLdapContext ctx = getDirContext();
       updateAdministrativeUsers(ctx);
       updateListeners(ctx);
+      updateSynchronization(ctx);
       updateDatabases(ctx);
       javaVersion = getJavaVersion(ctx);
       openConnections = getOpenConnections(ctx);
@@ -308,6 +323,124 @@
   }
 
   /**
+   * Updates the synchronization configuration data we expose to the user with
+   * the provided InitialLdapContext.
+   * @param ctx the InitialLdapContext to use to update the configuration.
+   * @throws NamingException if there was an error.
+   */
+  private void updateSynchronization(InitialLdapContext ctx)
+  throws NamingException
+  {
+    SearchControls ctls = new SearchControls();
+    ctls.setSearchScope(SearchControls.OBJECT_SCOPE);
+    ctls.setReturningAttributes(
+        new String[] {
+            "ds-cfg-synchronization-provider-enabled"
+        });
+    String filter = "(objectclass=ds-cfg-synchronization-provider)";
+
+    LdapName jndiName = new LdapName(
+      "cn=Multimaster Synchronization,cn=Synchronization Providers,cn=config");
+
+    try
+    {
+      NamingEnumeration syncProviders = ctx.search(jndiName, filter, ctls);
+
+      while(syncProviders.hasMore())
+      {
+        SearchResult sr = (SearchResult)syncProviders.next();
+
+        if ("true".equalsIgnoreCase(getFirstValue(sr,
+          "ds-cfg-synchronization-provider-enabled")))
+        {
+          synchronizationConfigured = true;
+        }
+      }
+    }
+    catch (NameNotFoundException nse)
+    {
+    }
+
+    ctls = new SearchControls();
+    ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);
+    ctls.setReturningAttributes(
+        new String[] {
+            "ds-cfg-synchronization-dn"
+        });
+    filter = "(objectclass=ds-cfg-synchronization-provider-config)";
+
+    jndiName = new LdapName(
+      "cn=Multimaster Synchronization,cn=Synchronization Providers,cn=config");
+
+    try
+    {
+      NamingEnumeration syncProviders = ctx.search(jndiName, filter, ctls);
+
+      while(syncProviders.hasMore())
+      {
+        SearchResult sr = (SearchResult)syncProviders.next();
+
+        synchronizedSuffixes.addAll(getValues(sr, "ds-cfg-synchronization-dn"));
+      }
+    }
+    catch (NameNotFoundException nse)
+    {
+    }
+
+    ctls = new SearchControls();
+    ctls.setSearchScope(SearchControls.ONELEVEL_SCOPE);
+    ctls.setReturningAttributes(
+    new String[] {
+      "approximate-delay", "waiting-changes", "base-dn"
+    });
+    filter = "(approximate-delay=*)";
+
+    jndiName = new LdapName("cn=monitor");
+
+    if (synchronizedSuffixes.size() > 0)
+    {
+      try
+      {
+        NamingEnumeration monitorEntries = ctx.search(jndiName, filter, ctls);
+
+        while(monitorEntries.hasMore())
+        {
+          SearchResult sr = (SearchResult)monitorEntries.next();
+
+          String dn = getFirstValue(sr, "base-dn");
+
+          for (String baseDn: synchronizedSuffixes)
+          {
+
+            if (Utils.areDnsEqual(dn, baseDn))
+            {
+              try
+              {
+                hmAgeOfOldestMissingChanges.put(baseDn,
+                  new Integer(getFirstValue(sr, "approximate-delay")));
+              }
+              catch (Throwable t)
+              {
+              }
+              try
+              {
+                hmMissingChanges.put(baseDn,
+                  new Integer(getFirstValue(sr, "waiting-changes")));
+              }
+              catch (Throwable t)
+              {
+              }
+            }
+          }
+        }
+      }
+      catch (NameNotFoundException nse)
+      {
+      }
+    }
+  }
+
+  /**
    * Updates the database configuration data we expose to the user with the
    * provided InitialLdapContext.
    * @param ctx the InitialLdapContext to use to update the configuration.
@@ -481,6 +614,58 @@
   }
 
   /**
+   * Create the base DN descriptor.  Assumes that the synchronizedSuffixes Set
+   * and synchronizationConfigured have already been initialized.
+   */
+  private BaseDNDescriptor getBaseDNDescriptor(InitialLdapContext ctx,
+      String baseDn)
+  throws NamingException
+  {
+    BaseDNDescriptor.Type type;
+    int missingChanges = -1;
+    int ageOfOldestMissingChange = -1;
+    String mapSuffixDn = null;
+
+    boolean replicated = false;
+    if (synchronizationConfigured)
+    {
+      for (String suffixDn: synchronizedSuffixes)
+      {
+        if (Utils.areDnsEqual(baseDn, suffixDn))
+        {
+          replicated = true;
+          mapSuffixDn = suffixDn;
+          break;
+        }
+      }
+    }
+    if (replicated)
+    {
+      type = BaseDNDescriptor.Type.SYNCHRONIZED;
+
+      Integer missing = hmMissingChanges.get(mapSuffixDn);
+      Integer age = hmAgeOfOldestMissingChanges.get(mapSuffixDn);
+
+      if (age != null)
+      {
+        ageOfOldestMissingChange = age.intValue();
+      }
+
+      if (missing != null)
+      {
+        missingChanges = missing.intValue();
+      }
+    }
+    else
+    {
+      type = BaseDNDescriptor.Type.NOT_SYNCHRONIZED;
+    }
+
+    return new BaseDNDescriptor(type, baseDn, null, ageOfOldestMissingChange,
+      missingChanges);
+  }
+
+  /**
    * Updates the listener configuration data we expose to the user with the
    * provided SearchResult object.
    * @param entry the entry to analyze.
@@ -587,13 +772,26 @@
       InitialLdapContext ctx)
   throws NamingException
   {
-    String baseDn = getFirstValue(entry, "ds-cfg-backend-base-dn");
     String id = getFirstValue(entry, "ds-cfg-backend-id");
 
     if (!isConfigBackend(id))
     {
+      Set<String> baseDns = new TreeSet<String>();
+      baseDns.addAll(getValues(entry, "ds-cfg-backend-base-dn"));
+      Set<BaseDNDescriptor> replicas = new LinkedHashSet<BaseDNDescriptor>();
       int nEntries = getEntryCount(ctx, id);
-      databases.add(new DatabaseDescriptor(id, baseDn, nEntries));
+
+      for (String baseDn : baseDns)
+      {
+        replicas.add(getBaseDNDescriptor(ctx, baseDn));
+      }
+
+      DatabaseDescriptor db = new DatabaseDescriptor(id, replicas, nEntries);
+      databases.add(db);
+      for (BaseDNDescriptor rep: replicas)
+      {
+        rep.setDatabase(db);
+      }
     }
   }
 

--
Gitblit v1.10.0