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/CRAMMD5SASLMechanismHandler.java |  350 +++++++++++++++-------------------------------------------
 1 files changed, 90 insertions(+), 260 deletions(-)

diff --git a/opends/src/server/org/opends/server/extensions/CRAMMD5SASLMechanismHandler.java b/opends/src/server/org/opends/server/extensions/CRAMMD5SASLMechanismHandler.java
index a81d685..27fc571 100644
--- a/opends/src/server/org/opends/server/extensions/CRAMMD5SASLMechanismHandler.java
+++ b/opends/src/server/org/opends/server/extensions/CRAMMD5SASLMechanismHandler.java
@@ -33,19 +33,16 @@
 import java.text.ParseException;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
 
+import org.opends.server.admin.server.ConfigurationChangeListener;
+import org.opends.server.admin.std.server.CramMD5SASLMechanismHandlerCfg;
 import org.opends.server.api.ClientConnection;
-import org.opends.server.api.ConfigurableComponent;
 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;
@@ -60,7 +57,6 @@
 import org.opends.server.types.LockManager;
 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;
@@ -85,24 +81,22 @@
  * draft-ietf-sasl-crammd5-05.
  */
 public class CRAMMD5SASLMechanismHandler
-       extends SASLMechanismHandler
-       implements ConfigurableComponent
+       extends SASLMechanismHandler<CramMD5SASLMechanismHandlerCfg>
+       implements ConfigurationChangeListener<
+                       CramMD5SASLMechanismHandlerCfg>
 {
-
-
-
   // An array filled with the inner pad byte.
   private byte[] iPad;
 
   // An array filled with the outer pad byte.
   private byte[] oPad;
 
+  // The current configuration for this SASL mechanism handler.
+  private CramMD5SASLMechanismHandlerCfg currentConfig;
+
   // 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;
 
@@ -127,7 +121,6 @@
   public CRAMMD5SASLMechanismHandler()
   {
     super();
-
   }
 
 
@@ -136,10 +129,14 @@
    * {@inheritDoc}
    */
   @Override()
-  public void initializeSASLMechanismHandler(ConfigEntry configEntry)
+  public void initializeSASLMechanismHandler(
+                   CramMD5SASLMechanismHandlerCfg configuration)
          throws ConfigException, InitializationException
   {
-    this.configEntryDN = configEntry.getDN();
+    configuration.addCramMD5ChangeListener(this);
+
+    currentConfig = configuration;
+    configEntryDN = configuration.dn();
 
 
     // Initialize the variables needed for the MD5 digest creation.
@@ -171,53 +168,18 @@
 
 
     // Get the identity mapper that should be used to find users.
-    int msgID = MSGID_SASLCRAMMD5_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_SASLCRAMMD5_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_SASLCRAMMD5_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_SASLCRAMMD5_CANNOT_GET_IDENTITY_MAPPER;
-      String message = getMessage(msgID, String.valueOf(configEntryDN),
-                                  stackTraceToSingleLineString(e));
-      throw new InitializationException(msgID, message, e);
+      int    msgID   = MSGID_SASLCRAMMD5_NO_SUCH_IDENTITY_MAPPER;
+      String message = getMessage(msgID, String.valueOf(identityMapperDN),
+                                  String.valueOf(configEntryDN));
+      throw new ConfigException(msgID, message);
     }
 
 
     DirectoryServer.registerSASLMechanismHandler(SASL_MECHANISM_CRAM_MD5, this);
-    DirectoryServer.registerConfigurableComponent(this);
   }
 
 
@@ -228,7 +190,7 @@
   @Override()
   public void finalizeSASLMechanismHandler()
   {
-    DirectoryServer.deregisterConfigurableComponent(this);
+    currentConfig.removeCramMD5ChangeListener(this);
     DirectoryServer.deregisterSASLMechanismHandler(SASL_MECHANISM_CRAM_MD5);
   }
 
@@ -624,206 +586,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_SASLCRAMMD5_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_SASLCRAMMD5_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_SASLCRAMMD5_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_SASLCRAMMD5_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_SASLCRAMMD5_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_SASLCRAMMD5_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_SASLCRAMMD5_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_SASLCRAMMD5_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_SASLCRAMMD5_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_SASLCRAMMD5_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()
@@ -844,5 +606,73 @@
     // This may be considered a secure mechanism.
     return true;
   }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  public boolean isConfigurationChangeAcceptable(
+                      CramMD5SASLMechanismHandlerCfg 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_SASLCRAMMD5_NO_SUCH_IDENTITY_MAPPER;
+      unacceptableReasons.add(getMessage(msgID,
+                                         String.valueOf(identityMapperDN),
+                                         String.valueOf(configEntryDN)));
+      configAcceptable = false;
+    }
+
+
+    return configAcceptable;
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  public ConfigChangeResult applyConfigurationChange(
+              CramMD5SASLMechanismHandlerCfg 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_SASLCRAMMD5_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