From 49663fbe506ec7ebe59369e430c067b378a52ab0 Mon Sep 17 00:00:00 2001
From: gbellato <gbellato@localhost>
Date: Tue, 10 Mar 2009 08:54:36 +0000
Subject: [PATCH] Fix for 3851 : The monitor backend does not follow parent order

---
 opends/src/server/org/opends/server/backends/MonitorBackend.java |   64 +++++++++++++++++++-------------
 1 files changed, 38 insertions(+), 26 deletions(-)

diff --git a/opends/src/server/org/opends/server/backends/MonitorBackend.java b/opends/src/server/org/opends/server/backends/MonitorBackend.java
index ed41ce6..5194590 100644
--- a/opends/src/server/org/opends/server/backends/MonitorBackend.java
+++ b/opends/src/server/org/opends/server/backends/MonitorBackend.java
@@ -808,7 +808,7 @@
    * {@inheritDoc}
    */
   @Override()
-  public void search(SearchOperation searchOperation)
+  public synchronized void search(SearchOperation searchOperation)
          throws DirectoryException
   {
 
@@ -869,8 +869,8 @@
     }
   }
 
-  // Build te internal monitor tree (entries, and children)
-  private void initEntryMaps() {
+  // Build the internal monitor tree (entries, and children)
+  private synchronized void initEntryMaps() {
       this.entryMap.clear();
       this.childDNs.clear();
       for (MonitorProvider<? extends MonitorProviderCfg> monitorProvider :
@@ -879,34 +879,46 @@
                 DN providerdn =
                         DirectoryServer.getMonitorProviderDN(monitorProvider);
                 if (!entryMap.containsKey(providerdn)) {
-                    Entry entry = getEntry(providerdn);
-                    entryMap.put(providerdn, entry);
-                }
-                DN parentdn = providerdn.getParentDNInSuffix();
-                DN child = providerdn;
-                while (parentdn!=null) {
-                    if (!entryMap.containsKey(parentdn)) {
-                        Entry entry = getEntry(parentdn);
-                        entryMap.put(parentdn, entry);
-                    }
-                     if (childDNs.containsKey(parentdn)) {
-                        HashSet<DN> children = childDNs.get(parentdn);
-                        children.add(child);
-                        childDNs.put(parentdn, children);
-                    }
-                    else {
-                        HashSet<DN> children = new HashSet<DN>();
-                        children.add(child);
-                        childDNs.put(parentdn, children);
-                    }
-                    child=parentdn;
-                    parentdn = parentdn.getParentDNInSuffix();
-                }
+                  getAndAddParentInMaps(providerdn);
+                  Entry entry = getEntry(providerdn);
+                  entryMap.put(providerdn, entry);
+              }
             } catch (Exception ex) {
             }
       }
   }
 
+ /**
+  * Recursively builds the entryMap and the childDN Map.
+  */
+  private void getAndAddParentInMaps(DN providerDN)
+  {
+    try
+    {
+      DN parentdn = providerDN.getParentDNInSuffix();
+      DN child = providerDN;
+
+      if ((parentdn != null) && (!entryMap.containsKey(parentdn)))
+      {
+        getAndAddParentInMaps(parentdn);
+        entryMap.put(parentdn, getEntry(parentdn));
+      }
+
+      if (childDNs.containsKey(parentdn))
+      {
+        HashSet<DN> children = childDNs.get(parentdn);
+        children.add(child);
+        childDNs.put(parentdn, children);
+      }
+      else
+      {
+        HashSet<DN> children = new HashSet<DN>();
+        children.add(child);
+        childDNs.put(parentdn, children);
+      }
+    } catch (Exception e)
+    {}
+  }
 
   /**
    * {@inheritDoc}

--
Gitblit v1.10.0