From e1ea3e0d8999105f144d2be98e0286928b8319ed Mon Sep 17 00:00:00 2001
From: neil_a_wilson <neil_a_wilson@localhost>
Date: Tue, 03 Apr 2007 18:52:11 +0000
Subject: [PATCH] Add initial support for a virtual attribute subsystem, and implement a few different kinds of virtual attributes.  This commit addresses the following issues:

---
 opends/src/server/org/opends/server/core/DirectoryServer.java |  125 +++++++++++++++++++++++++++++++++++++++--
 1 files changed, 119 insertions(+), 6 deletions(-)

diff --git a/opends/src/server/org/opends/server/core/DirectoryServer.java b/opends/src/server/org/opends/server/core/DirectoryServer.java
index 43fb847..205e04c 100644
--- a/opends/src/server/org/opends/server/core/DirectoryServer.java
+++ b/opends/src/server/org/opends/server/core/DirectoryServer.java
@@ -296,10 +296,6 @@
   // between the mechanism name and the handler).
   private ConcurrentHashMap<String,SASLMechanismHandler> saslMechanismHandlers;
 
-  // The set of virtual attributes defined in the server (mapped between the
-  // lowercase names and the virtual attributes).
-  private ConcurrentHashMap<String,VirtualAttribute> virtualAttributes;
-
   // The connection handler configuration manager for the Directory Server.
   private ConnectionHandlerConfigManager connectionHandlerConfigManager;
 
@@ -341,6 +337,9 @@
   private CopyOnWriteArrayList<SynchronizationProvider>
                synchronizationProviders;
 
+  // The set of virtual attributes defined in the server.
+  private CopyOnWriteArrayList<VirtualAttributeRule> virtualAttributes;
+
   // The set of backend initialization listeners registered with the Directory
   // Server.
   private CopyOnWriteArraySet<BackendInitializationListener>
@@ -511,6 +510,10 @@
   // The trust manager provider configuration manager for the Directory Server.
   private TrustManagerProviderConfigManager trustManagerProviderConfigManager;
 
+  // The virtual attribute provider configuration manager for the Directory
+  // Server.
+  private VirtualAttributeConfigManager virtualAttributeConfigManager;
+
   // The work queue that will be used to service client requests.
   private WorkQueue workQueue;
 
@@ -631,7 +634,7 @@
     directoryServer.supportedControls = new TreeSet<String>();
     directoryServer.supportedFeatures = new TreeSet<String>();
     directoryServer.virtualAttributes =
-         new ConcurrentHashMap<String,VirtualAttribute>();
+         new CopyOnWriteArrayList<VirtualAttributeRule>();
     directoryServer.connectionHandlers =
          new CopyOnWriteArrayList<ConnectionHandler>();
     directoryServer.identityMappers =
@@ -2218,6 +2221,8 @@
     supportedControls.add(OID_MATCHED_VALUES);
     supportedControls.add(OID_LDAP_SUBENTRIES);
     supportedControls.add(OID_PASSWORD_POLICY_CONTROL);
+    supportedControls.add(OID_REAL_ATTRS_ONLY);
+    supportedControls.add(OID_VIRTUAL_ATTRS_ONLY);
   }
 
 
@@ -2314,7 +2319,8 @@
   private void initializeVirtualAttributes()
           throws ConfigException, InitializationException
   {
-    // NYI
+    virtualAttributeConfigManager = new VirtualAttributeConfigManager();
+    virtualAttributeConfigManager.initializeVirtualAttributes();
   }
 
 
@@ -3926,6 +3932,113 @@
 
 
   /**
+   * Retrieves the set of virtual attribute rules registered with the Directory
+   * Server.
+   *
+   * @return  The set of virtual attribute rules registered with the Directory
+   *          Server.
+   */
+  public static List<VirtualAttributeRule> getVirtualAttributes()
+  {
+    return directoryServer.virtualAttributes;
+  }
+
+
+
+  /**
+   * Retrieves the set of virtual attribute rules registered with the Directory
+   * Server that are applicable to the provided entry.
+   *
+   * @param  entry  The entry for which to retrieve the applicable virtual
+   *                attribute rules.
+   *
+   * @return  The set of virtual attribute rules registered with the Directory
+   *          Server that apply to the given entry.  It may be an empty list if
+   *          there are no applicable virtual attribute rules.
+   */
+  public static List<VirtualAttributeRule> getVirtualAttributes(Entry entry)
+  {
+    LinkedList<VirtualAttributeRule> ruleList =
+         new LinkedList<VirtualAttributeRule>();
+
+    for (VirtualAttributeRule rule : directoryServer.virtualAttributes)
+    {
+      if (rule.appliesToEntry(entry))
+      {
+        ruleList.add(rule);
+      }
+    }
+
+    return ruleList;
+  }
+
+
+
+  /**
+   * Registers the provided virtual attribute rule with the Directory Server.
+   *
+   * @param  rule  The virtual attribute rule to be registered.
+   */
+  public static void registerVirtualAttribute(VirtualAttributeRule rule)
+  {
+    synchronized (directoryServer.virtualAttributes)
+    {
+      directoryServer.virtualAttributes.add(rule);
+    }
+  }
+
+
+
+  /**
+   * Deregisters the provided virtual attribute rule with the Directory Server.
+   *
+   * @param  rule  The virutal attribute rule to be deregistered.
+   */
+  public static void deregisterVirtualAttribute(VirtualAttributeRule rule)
+  {
+    synchronized (directoryServer.virtualAttributes)
+    {
+      directoryServer.virtualAttributes.remove(rule);
+    }
+  }
+
+
+
+  /**
+   * Replaces the specified virtual attribute rule in the set of virtual
+   * attributes registered with the Directory Server.  If the old rule cannot
+   * be found in the list, then the set of registered virtual attributes is not
+   * updated.
+   *
+   * @param  oldRule  The existing rule that should be replaced with the new
+   *                  rule.
+   * @param  newRule  The new rule that should be used in place of the existing
+   *                  rule.
+   *
+   * @return  {@code true} if the old rule was found and replaced with the new
+   *          version, or {@code false} if it was not.
+   */
+  public static boolean replaceVirtualAttribute(VirtualAttributeRule oldRule,
+                                                VirtualAttributeRule newRule)
+  {
+    synchronized (directoryServer.virtualAttributes)
+    {
+      int pos = directoryServer.virtualAttributes.indexOf(oldRule);
+      if (pos >= 0)
+      {
+        directoryServer.virtualAttributes.set(pos, newRule);
+        return true;
+      }
+      else
+      {
+        return false;
+      }
+    }
+  }
+
+
+
+  /**
    * Retrieves a reference to the JMX MBean server that is associated with the
    * Directory Server.
    *

--
Gitblit v1.10.0