From d90a8f4889fdc359bfe5f089b937b303a4d58973 Mon Sep 17 00:00:00 2001
From: fguigues <fguigues@localhost>
Date: Fri, 12 Dec 2008 13:13:01 +0000
Subject: [PATCH] * Ability to create monitor provider with hierarchical naming * Modification of Network Monitor provider names (includes hierarchical naming) * Provide basic Monitoring objects. * Add monitoring instrumentation for the connection handlers. * Add the ability to do a subtree search in the monitor backend.

---
 opends/src/server/org/opends/server/backends/MonitorBackend.java |  205 +++++++++++++++++++++++++++++----------------------
 1 files changed, 117 insertions(+), 88 deletions(-)

diff --git a/opends/src/server/org/opends/server/backends/MonitorBackend.java b/opends/src/server/org/opends/server/backends/MonitorBackend.java
index a038e5f..bd774fe 100644
--- a/opends/src/server/org/opends/server/backends/MonitorBackend.java
+++ b/opends/src/server/org/opends/server/backends/MonitorBackend.java
@@ -467,25 +467,10 @@
       return getBaseMonitorEntry();
     }
 
-
-    // See if the monitor base entry is the immediate parent for the requested
-    // entry.  If not, then throw an exception.
-    DN parentDN = entryDN.getParentDNInSuffix();
-    if ((parentDN == null) || (! parentDN.equals(baseMonitorDN)))
-    {
-      if (baseMonitorDN.isAncestorOf(entryDN))
-      {
-        Message message = ERR_MONITOR_BASE_TOO_DEEP.get(
-            String.valueOf(entryDN), String.valueOf(baseMonitorDN));
-        throw new DirectoryException(
-                ResultCode.NO_SUCH_OBJECT, message, baseMonitorDN, null);
-      }
-      else
-      {
-        Message message = ERR_MONITOR_INVALID_BASE.get(
-            String.valueOf(entryDN), String.valueOf(baseMonitorDN));
-        throw new DirectoryException(ResultCode.NO_SUCH_OBJECT, message);
-      }
+    if (!isATreeNode(entryDN)) {
+      Message message = ERR_MONITOR_INVALID_BASE.get(
+          String.valueOf(entryDN), String.valueOf(baseMonitorDN));
+      throw new DirectoryException(ResultCode.NO_SUCH_OBJECT, message);
     }
 
 
@@ -499,20 +484,14 @@
               ResultCode.NO_SUCH_OBJECT, message, baseMonitorDN, null);
     }
 
-
-    // Get the RDN value and see if it matches the instance name for one of
-    // the directory server monitor providers.
-    String rdnValue = entryRDN.getAttributeValue(0).getStringValue();
+    String rdnValue = getRdns(entryDN);
     MonitorProvider<? extends MonitorProviderCfg> monitorProvider =
          DirectoryServer.getMonitorProvider(rdnValue.toLowerCase());
-    if (monitorProvider == null)
-    {
-      Message message =
-          ERR_MONITOR_NO_SUCH_PROVIDER.get(String.valueOf(rdnValue));
-      throw new DirectoryException(
-              ResultCode.NO_SUCH_OBJECT, message, baseMonitorDN, null);
-    }
 
+    // Could be a monitor branch
+    if (monitorProvider == null) {
+       return getBranchMonitorEntry(entryDN);
+    }
 
     // Take the data from the monitor provider and stuff it into an entry.
     return getMonitorEntry(entryDN, monitorProvider);
@@ -527,27 +506,7 @@
   public boolean entryExists(DN entryDN)
          throws DirectoryException
   {
-    if (entryDN.equals(baseMonitorDN))
-    {
-      return true;
-    }
-
-    DN parentDN = entryDN.getParentDNInSuffix();
-    if ((parentDN == null) || (! parentDN.equals(baseMonitorDN)))
-    {
-      return false;
-    }
-
-    RDN rdn = entryDN.getRDN();
-    if (rdn.isMultiValued())
-    {
-      return false;
-    }
-
-    String rdnValue = rdn.getAttributeValue(0).getStringValue();
-    MonitorProvider<?> monitorProvider =
-         DirectoryServer.getMonitorProvider(toLowerCase(rdnValue));
-    return (monitorProvider != null);
+      return this.isATreeNode(entryDN);
   }
 
 
@@ -718,7 +677,37 @@
     return e;
   }
 
+   /**
+   * Retrieves the branch monitor entry for the Directory Server.
+   * @param dn to get.
+   * @return  The branch monitor entry for the Directory Server.
+   */
+  public Entry getBranchMonitorEntry(DN dn) {
 
+    Entry e=null;
+    // Construct the set of objectclasses to include in the base monitor entry.
+    HashMap<ObjectClass,String> monitorClasses =
+         new LinkedHashMap<ObjectClass,String>(3);
+    monitorClasses.putAll(monitorObjectClasses);
+    ObjectClass monitorOC = DirectoryServer.getObjectClass(OC_MONITOR_BRANCH,
+                                                           true);
+    monitorClasses.put(monitorOC, OC_MONITOR_BRANCH);
+
+    // Iterate through all of the monitor providers defined in the server.
+
+    for (MonitorProvider<? extends MonitorProviderCfg> monitorProvider :
+           DirectoryServer.getMonitorProviders().values()) {
+
+      DN providerDN = DirectoryServer.getMonitorProviderDN(monitorProvider);
+      if (providerDN.isDescendantOf(dn)) {
+         // Construct and return the entry.
+         e = new Entry(dn, monitorClasses, null, null);
+         break;
+      }
+    }
+
+    return e;
+  }
 
   /**
    * Generates and returns a monitor entry based on the contents of the
@@ -872,60 +861,100 @@
     DN    baseDN    = searchOperation.getBaseDN();
     Entry baseEntry = getEntry(baseDN);
 
+    if (baseEntry==null) {
+      Message message =
+          ERR_MONITOR_NO_SUCH_PROVIDER.get(String.valueOf(baseDN.toString()));
+      throw new DirectoryException(
+              ResultCode.NO_SUCH_OBJECT, message, baseMonitorDN, null);
+
+    }
 
     // Figure out whether the base is the monitor base entry or one of its
     // children for a specific monitor.
     SearchScope  scope  = searchOperation.getScope();
     SearchFilter filter = searchOperation.getFilter();
-    if (baseMonitorDN.equals(baseDN))
+    if ((scope == SearchScope.BASE_OBJECT) ||
+        (scope == SearchScope.WHOLE_SUBTREE))
     {
-      // If it is a base-level or subtree search, then we need to look at the
-      // base monitor entry.
-      if ((scope == SearchScope.BASE_OBJECT) ||
-          (scope == SearchScope.WHOLE_SUBTREE))
+      if (filter.matchesEntry(baseEntry))
       {
-        if (filter.matchesEntry(baseEntry))
-        {
-          searchOperation.returnEntry(baseEntry, null);
-        }
-
-
-        // If it is a base-level search, then we're done.
-        if (scope == SearchScope.BASE_OBJECT)
-        {
-          return;
-        }
+        searchOperation.returnEntry(baseEntry, null);
       }
 
 
-      // Iterate through all of the monitor providers defined in the server.
-      // Get an entry for each and compare it against the filter.
-      for (MonitorProvider<? extends MonitorProviderCfg> monitorProvider :
-           DirectoryServer.getMonitorProviders().values())
+      // If it is a base-level search, then we're done.
+      if (scope == SearchScope.BASE_OBJECT)
       {
-        DN providerDN = DirectoryServer.getMonitorProviderDN(monitorProvider);
-        Entry monitorEntry = getMonitorEntry(providerDN, monitorProvider);
-        if (filter.matchesEntry(monitorEntry))
-        {
-          searchOperation.returnEntry(monitorEntry, null);
-        }
+        return;
       }
     }
-    else
-    {
-      // Look at the scope for the search.  We only need to return something if
-      // it is a base-level or subtree search.
-      if ((scope == SearchScope.BASE_OBJECT) ||
-          (scope == SearchScope.WHOLE_SUBTREE))
-      {
-        if (filter.matchesEntry(baseEntry))
-        {
-          searchOperation.returnEntry(baseEntry, null);
-        }
+
+    HashSet<DN> branches = new HashSet<DN>();
+    // Iterate through all of the monitor providers defined in the server.
+    // Get an entry for each and compare it against the filter.
+    for (MonitorProvider<? extends MonitorProviderCfg> monitorProvider :
+           DirectoryServer.getMonitorProviders().values()) {
+
+      DN providerDN = DirectoryServer.getMonitorProviderDN(monitorProvider);
+      if (baseDN.isAncestorOf(providerDN)) {
+         DN parentDN = providerDN.getParentDNInSuffix();
+         while ((parentDN!=null) && (!parentDN.equals(baseMonitorDN)) &&
+                 (!parentDN.equals(baseDN))) {
+            if ((!branches.contains(parentDN)) && (
+                    isABranch(parentDN))) {
+              Entry branchEntry = getBranchMonitorEntry(parentDN);
+              if (filter.matchesEntry(branchEntry)) {
+                  searchOperation.returnEntry(branchEntry, null);
+              }
+              branches.add(parentDN);
+            }
+            parentDN = parentDN.getParentDNInSuffix();
+         }
+         if (!providerDN.equals(baseDN)) {
+             Entry monitorEntry = getMonitorEntry(providerDN, monitorProvider);
+             if (filter.matchesEntry(monitorEntry)) {
+                searchOperation.returnEntry(monitorEntry, null);
+             }
+         }
+
       }
     }
   }
 
+  private boolean isABranch(DN dn) {
+      boolean found=false;
+      for (MonitorProvider<? extends MonitorProviderCfg> monitorProvider :
+           DirectoryServer.getMonitorProviders().values()) {
+         DN providerDN = DirectoryServer.getMonitorProviderDN(monitorProvider);
+         if (dn.equals(providerDN)) {
+             found=true;
+         }
+      }
+      return (!found);
+  }
+
+  private boolean isATreeNode(DN dn) {
+      boolean found=false;
+
+      if (dn.equals(baseMonitorDN)) {
+          return true;
+      }
+      for (MonitorProvider<? extends MonitorProviderCfg> monitorProvider :
+           DirectoryServer.getMonitorProviders().values()) {
+         DN providerDN = DirectoryServer.getMonitorProviderDN(monitorProvider);
+         if ((dn.isAncestorOf(providerDN)) ||
+                 (dn.equals(providerDN))) {
+             found=true;
+             return (found);
+         }
+      }
+      return (found);
+  }
+
+  private String getRdns(DN dn) {
+      int index = dn.toString().lastIndexOf(",");
+      return dn.toString().substring(3, index);
+  }
 
 
   /**

--
Gitblit v1.10.0