From feb5d90ec016c99712f19c5485cf7633cd38f111 Mon Sep 17 00:00:00 2001
From: matthew_swift <matthew_swift@localhost>
Date: Fri, 23 Mar 2007 14:26:04 +0000
Subject: [PATCH] Merge admin framework from config-prototype-branch onto trunk.

---
 opends/src/server/org/opends/server/extensions/PlainSASLMechanismHandler.java |  352 +++++++++++++++-------------------------------------------
 1 files changed, 92 insertions(+), 260 deletions(-)

diff --git a/opends/src/server/org/opends/server/extensions/PlainSASLMechanismHandler.java b/opends/src/server/org/opends/server/extensions/PlainSASLMechanismHandler.java
index 9722118..51e2f27 100644
--- a/opends/src/server/org/opends/server/extensions/PlainSASLMechanismHandler.java
+++ b/opends/src/server/org/opends/server/extensions/PlainSASLMechanismHandler.java
@@ -29,17 +29,14 @@
 
 
 import java.util.ArrayList;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.concurrent.locks.Lock;
 
-import org.opends.server.api.ConfigurableComponent;
+import org.opends.server.admin.server.ConfigurationChangeListener;
+import org.opends.server.admin.std.server.PlainSASLMechanismHandlerCfg;
 import org.opends.server.api.IdentityMapper;
 import org.opends.server.api.SASLMechanismHandler;
-import org.opends.server.config.ConfigAttribute;
-import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.config.DNConfigAttribute;
 import org.opends.server.core.BindOperation;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.PasswordPolicyState;
@@ -56,7 +53,6 @@
 import org.opends.server.types.Privilege;
 import org.opends.server.types.ResultCode;
 
-import static org.opends.server.config.ConfigConstants.*;
 import static org.opends.server.loggers.debug.DebugLogger.debugCaught;
 import static org.opends.server.loggers.debug.DebugLogger.debugEnabled;
 import org.opends.server.types.DebugLogLevel;
@@ -79,21 +75,19 @@
  * connection security provider to prevent exposing the password.
  */
 public class PlainSASLMechanismHandler
-       extends SASLMechanismHandler
-       implements ConfigurableComponent
+       extends SASLMechanismHandler<PlainSASLMechanismHandlerCfg>
+       implements ConfigurationChangeListener<
+                       PlainSASLMechanismHandlerCfg>
 {
-
-
-
   // The DN of the configuration entry for this SASL mechanism handler.
   private DN configEntryDN;
 
-  // The DN of the identity mapper configuration entry.
-  private DN identityMapperDN;
-
   // The identity mapper that will be used to map ID strings to user entries.
   private IdentityMapper identityMapper;
 
+  // The current configuration for this SASL mechanism handler.
+  private PlainSASLMechanismHandlerCfg currentConfig;
+
 
 
   /**
@@ -104,7 +98,6 @@
   public PlainSASLMechanismHandler()
   {
     super();
-
   }
 
 
@@ -113,60 +106,29 @@
    * {@inheritDoc}
    */
   @Override()
-  public void initializeSASLMechanismHandler(ConfigEntry configEntry)
+  public void initializeSASLMechanismHandler(
+                   PlainSASLMechanismHandlerCfg configuration)
          throws ConfigException, InitializationException
   {
-    this.configEntryDN = configEntry.getDN();
+    configuration.addPlainChangeListener(this);
+
+    currentConfig = configuration;
+    configEntryDN = configuration.dn();
 
 
     // Get the identity mapper that should be used to find users.
-    int msgID = MSGID_SASLPLAIN_DESCRIPTION_IDENTITY_MAPPER_DN;
-    DNConfigAttribute mapperStub =
-         new DNConfigAttribute(ATTR_IDMAPPER_DN, getMessage(msgID), true, false,
-                               false);
-    try
+    DN identityMapperDN = configuration.getIdentityMapperDN();
+    identityMapper = DirectoryServer.getIdentityMapper(identityMapperDN);
+    if (identityMapper == null)
     {
-      DNConfigAttribute mapperAttr =
-           (DNConfigAttribute) configEntry.getConfigAttribute(mapperStub);
-      if (mapperAttr == null)
-      {
-        msgID = MSGID_SASLPLAIN_NO_IDENTITY_MAPPER_ATTR;
-        String message = getMessage(msgID, String.valueOf(configEntryDN));
-        throw new ConfigException(msgID, message);
-      }
-      else
-      {
-        identityMapperDN = mapperAttr.activeValue();
-        identityMapper = DirectoryServer.getIdentityMapper(identityMapperDN);
-        if (identityMapper == null)
-        {
-          msgID = MSGID_SASLPLAIN_NO_SUCH_IDENTITY_MAPPER;
-          String message = getMessage(msgID, String.valueOf(identityMapperDN),
-                                      String.valueOf(configEntryDN));
-          throw new ConfigException(msgID, message);
-        }
-      }
-    }
-    catch (ConfigException ce)
-    {
-      throw ce;
-    }
-    catch (Exception e)
-    {
-      if (debugEnabled())
-      {
-        debugCaught(DebugLogLevel.ERROR, e);
-      }
-
-      msgID = MSGID_SASLPLAIN_CANNOT_GET_IDENTITY_MAPPER;
-      String message = getMessage(msgID, String.valueOf(configEntryDN),
-                                  stackTraceToSingleLineString(e));
-      throw new InitializationException(msgID, message, e);
+      int    msgID   = MSGID_SASLPLAIN_NO_SUCH_IDENTITY_MAPPER;
+      String message = getMessage(msgID, String.valueOf(identityMapperDN),
+                                  String.valueOf(configEntryDN));
+      throw new ConfigException(msgID, message);
     }
 
 
     DirectoryServer.registerSASLMechanismHandler(SASL_MECHANISM_PLAIN, this);
-    DirectoryServer.registerConfigurableComponent(this);
   }
 
 
@@ -177,7 +139,7 @@
   @Override()
   public void finalizeSASLMechanismHandler()
   {
-    DirectoryServer.deregisterConfigurableComponent(this);
+    currentConfig.removePlainChangeListener(this);
     DirectoryServer.deregisterSASLMechanismHandler(SASL_MECHANISM_PLAIN);
   }
 
@@ -190,6 +152,8 @@
   @Override()
   public void processSASLBind(BindOperation bindOperation)
   {
+    IdentityMapper identityMapper = this.identityMapper;
+
     // Get the SASL credentials provided by the user and decode them.
     String authzID  = null;
     String authcID  = null;
@@ -601,206 +565,6 @@
 
 
   /**
-   * Retrieves the DN of the configuration entry with which this component is
-   * associated.
-   *
-   * @return  The DN of the configuration entry with which this component is
-   *          associated.
-   */
-  public DN getConfigurableComponentEntryDN()
-  {
-    return configEntryDN;
-  }
-
-
-
-
-  /**
-   * Retrieves the set of configuration attributes that are associated with this
-   * configurable component.
-   *
-   * @return  The set of configuration attributes that are associated with this
-   *          configurable component.
-   */
-  public List<ConfigAttribute> getConfigurationAttributes()
-  {
-    LinkedList<ConfigAttribute> attrList = new LinkedList<ConfigAttribute>();
-
-    int msgID = MSGID_SASLPLAIN_DESCRIPTION_IDENTITY_MAPPER_DN;
-    attrList.add(new DNConfigAttribute(ATTR_IDMAPPER_DN, getMessage(msgID),
-                                       true, false, false, identityMapperDN));
-
-    return attrList;
-  }
-
-
-
-  /**
-   * Indicates whether the provided configuration entry has an acceptable
-   * configuration for this component.  If it does not, then detailed
-   * information about the problem(s) should be added to the provided list.
-   *
-   * @param  configEntry          The configuration entry for which to make the
-   *                              determination.
-   * @param  unacceptableReasons  A list that can be used to hold messages about
-   *                              why the provided entry does not have an
-   *                              acceptable configuration.
-   *
-   * @return  <CODE>true</CODE> if the provided entry has an acceptable
-   *          configuration for this component, or <CODE>false</CODE> if not.
-   */
-  public boolean hasAcceptableConfiguration(ConfigEntry configEntry,
-                                            List<String> unacceptableReasons)
-  {
-    // Look at the identity mapper configuration.
-    int msgID = MSGID_SASLPLAIN_DESCRIPTION_IDENTITY_MAPPER_DN;
-    DNConfigAttribute mapperStub =
-         new DNConfigAttribute(ATTR_IDMAPPER_DN, getMessage(msgID), true, false,
-                               false);
-    try
-    {
-      DNConfigAttribute mapperAttr =
-           (DNConfigAttribute) configEntry.getConfigAttribute(mapperStub);
-      if (mapperAttr == null)
-      {
-        msgID = MSGID_SASLPLAIN_NO_IDENTITY_MAPPER_ATTR;
-        unacceptableReasons.add(getMessage(msgID,
-                                           String.valueOf(configEntryDN)));
-        return false;
-      }
-
-      DN mapperDN = mapperAttr.pendingValue();
-      if (! mapperDN.equals(identityMapperDN))
-      {
-        IdentityMapper mapper = DirectoryServer.getIdentityMapper(mapperDN);
-        if (mapper == null)
-        {
-          msgID = MSGID_SASLPLAIN_NO_SUCH_IDENTITY_MAPPER;
-          unacceptableReasons.add(getMessage(msgID, String.valueOf(mapperDN),
-                                             String.valueOf(configEntryDN)));
-          return false;
-        }
-      }
-    }
-    catch (Exception e)
-    {
-      if (debugEnabled())
-      {
-        debugCaught(DebugLogLevel.ERROR, e);
-      }
-
-      msgID = MSGID_SASLPLAIN_CANNOT_GET_IDENTITY_MAPPER;
-      unacceptableReasons.add(getMessage(msgID, String.valueOf(configEntryDN),
-                                         stackTraceToSingleLineString(e)));
-      return false;
-    }
-
-
-    // If we've gotten to this point, then everything must be OK.
-    return true;
-  }
-
-
-
-  /**
-   * Makes a best-effort attempt to apply the configuration contained in the
-   * provided entry.  Information about the result of this processing should be
-   * added to the provided message list.  Information should always be added to
-   * this list if a configuration change could not be applied.  If detailed
-   * results are requested, then information about the changes applied
-   * successfully (and optionally about parameters that were not changed) should
-   * also be included.
-   *
-   * @param  configEntry      The entry containing the new configuration to
-   *                          apply for this component.
-   * @param  detailedResults  Indicates whether detailed information about the
-   *                          processing should be added to the list.
-   *
-   * @return  Information about the result of the configuration update.
-   */
-  public ConfigChangeResult applyNewConfiguration(ConfigEntry configEntry,
-                                                  boolean detailedResults)
-  {
-    ResultCode        resultCode          = ResultCode.SUCCESS;
-    boolean           adminActionRequired = false;
-    ArrayList<String> messages            = new ArrayList<String>();
-
-
-    // Look at the identity mapper configuration.
-    DN newIdentityMapperDN = null;
-    IdentityMapper newIdentityMapper = null;
-    int msgID = MSGID_SASLPLAIN_DESCRIPTION_IDENTITY_MAPPER_DN;
-    DNConfigAttribute mapperStub =
-         new DNConfigAttribute(ATTR_IDMAPPER_DN, getMessage(msgID), true, false,
-                               false);
-    try
-    {
-      DNConfigAttribute mapperAttr =
-           (DNConfigAttribute) configEntry.getConfigAttribute(mapperStub);
-      if (mapperAttr == null)
-      {
-        msgID = MSGID_SASLPLAIN_NO_IDENTITY_MAPPER_ATTR;
-        messages.add(getMessage(msgID, String.valueOf(configEntryDN)));
-
-        resultCode = ResultCode.CONSTRAINT_VIOLATION;
-      }
-      else
-      {
-        newIdentityMapperDN = mapperAttr.pendingValue();
-        if (! newIdentityMapperDN.equals(identityMapperDN))
-        {
-          newIdentityMapper =
-               DirectoryServer.getIdentityMapper(newIdentityMapperDN);
-          if (newIdentityMapper == null)
-          {
-            msgID = MSGID_SASLPLAIN_NO_SUCH_IDENTITY_MAPPER;
-            messages.add(getMessage(msgID, String.valueOf(newIdentityMapperDN),
-                                    String.valueOf(configEntryDN)));
-
-            resultCode = ResultCode.CONSTRAINT_VIOLATION;
-          }
-        }
-      }
-    }
-    catch (Exception e)
-    {
-      if (debugEnabled())
-      {
-        debugCaught(DebugLogLevel.ERROR, e);
-      }
-
-      msgID = MSGID_SASLPLAIN_CANNOT_GET_IDENTITY_MAPPER;
-      messages.add(getMessage(msgID, String.valueOf(configEntryDN),
-                              stackTraceToSingleLineString(e)));
-      resultCode = DirectoryServer.getServerErrorResultCode();
-    }
-
-
-    // If everything has been successful, then apply any changes that were made.
-    if (resultCode == ResultCode.SUCCESS)
-    {
-      if ((newIdentityMapperDN != null) && (identityMapper != null))
-      {
-        identityMapperDN = newIdentityMapperDN;
-        identityMapper   = newIdentityMapper;
-
-        if (detailedResults)
-        {
-          msgID = MSGID_SASLPLAIN_UPDATED_IDENTITY_MAPPER;
-          messages.add(getMessage(msgID, String.valueOf(configEntryDN),
-                                  String.valueOf(identityMapperDN)));
-        }
-      }
-    }
-
-
-    // Return the result to the caller.
-    return new ConfigChangeResult(resultCode, adminActionRequired, messages);
-  }
-
-
-
-  /**
    * {@inheritDoc}
    */
   @Override()
@@ -821,5 +585,73 @@
     // This is not a secure mechanism.
     return false;
   }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  public boolean isConfigurationChangeAcceptable(
+                      PlainSASLMechanismHandlerCfg configuration,
+                      List<String> unacceptableReasons)
+  {
+    boolean configAcceptable = true;
+
+    // Get the identity mapper that should be used to find users.
+    DN identityMapperDN = configuration.getIdentityMapperDN();
+    IdentityMapper newIdentityMapper =
+         DirectoryServer.getIdentityMapper(identityMapperDN);
+    if (newIdentityMapper == null)
+    {
+      int msgID = MSGID_SASLPLAIN_NO_SUCH_IDENTITY_MAPPER;
+      unacceptableReasons.add(getMessage(msgID,
+                                         String.valueOf(identityMapperDN),
+                                         String.valueOf(configEntryDN)));
+      configAcceptable = false;
+    }
+
+
+    return configAcceptable;
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  public ConfigChangeResult applyConfigurationChange(
+              PlainSASLMechanismHandlerCfg configuration)
+  {
+    ResultCode        resultCode          = ResultCode.SUCCESS;
+    boolean           adminActionRequired = false;
+    ArrayList<String> messages            = new ArrayList<String>();
+
+
+    // Get the identity mapper that should be used to find users.
+    DN identityMapperDN = configuration.getIdentityMapperDN();
+    IdentityMapper newIdentityMapper =
+         DirectoryServer.getIdentityMapper(identityMapperDN);
+    if (newIdentityMapper == null)
+    {
+      if (resultCode == ResultCode.SUCCESS)
+      {
+        resultCode = ResultCode.CONSTRAINT_VIOLATION;
+      }
+
+      int msgID = MSGID_SASLPLAIN_NO_SUCH_IDENTITY_MAPPER;
+      messages.add(getMessage(msgID, String.valueOf(identityMapperDN),
+                              String.valueOf(configEntryDN)));
+    }
+
+
+    if (resultCode == ResultCode.SUCCESS)
+    {
+      identityMapper = newIdentityMapper;
+      currentConfig  = configuration;
+    }
+
+
+   return new ConfigChangeResult(resultCode, adminActionRequired, messages);
+  }
 }
 

--
Gitblit v1.10.0