From bff247202b2e096249150884a93601b19e836c9a Mon Sep 17 00:00:00 2001
From: jdemendi <jdemendi@localhost>
Date: Wed, 02 May 2007 08:29:33 +0000
Subject: [PATCH] Issue #1560 - Migrate some objects to the new admin framework: - Entry Cache - Account Status Notification Handler - Password Storage Scheme

---
 opends/src/server/org/opends/server/extensions/ErrorLogAccountStatusNotificationHandler.java |  414 +++++++++++++++++++++++++---------------------------------
 1 files changed, 181 insertions(+), 233 deletions(-)

diff --git a/opends/src/server/org/opends/server/extensions/ErrorLogAccountStatusNotificationHandler.java b/opends/src/server/org/opends/server/extensions/ErrorLogAccountStatusNotificationHandler.java
index 6f4be0a..8ebc86d 100644
--- a/opends/src/server/org/opends/server/extensions/ErrorLogAccountStatusNotificationHandler.java
+++ b/opends/src/server/org/opends/server/extensions/ErrorLogAccountStatusNotificationHandler.java
@@ -28,18 +28,25 @@
 
 
 
+import static org.opends.server.config.ConfigConstants.*;
+import static org.opends.server.loggers.Error.logError;
+import static org.opends.server.messages.ExtensionsMessages.*;
+import static org.opends.server.messages.MessageHandler.getMessage;
+
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
 
+import org.opends.server.admin.server.ConfigurationChangeListener;
+import org.opends.server.admin.std.meta.
+       ErrorLogAccountStatusNotificationHandlerCfgDefn;
+import org.opends.server.admin.std.server.
+       ErrorLogAccountStatusNotificationHandlerCfg;
 import org.opends.server.api.AccountStatusNotificationHandler;
-import org.opends.server.api.ConfigurableComponent;
 import org.opends.server.config.ConfigAttribute;
-import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
 import org.opends.server.config.MultiChoiceConfigAttribute;
-import org.opends.server.core.DirectoryServer;
 import org.opends.server.types.AccountStatusNotificationType;
 import org.opends.server.types.ConfigChangeResult;
 import org.opends.server.types.DN;
@@ -48,15 +55,6 @@
 import org.opends.server.types.InitializationException;
 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;
-import static org.opends.server.loggers.Error.*;
-import static org.opends.server.messages.ExtensionsMessages.*;
-import static org.opends.server.messages.MessageHandler.*;
-import static org.opends.server.util.StaticUtils.*;
-
 
 
 /**
@@ -65,12 +63,13 @@
  * logging facility.
  */
 public class ErrorLogAccountStatusNotificationHandler
-       extends AccountStatusNotificationHandler
-       implements ConfigurableComponent
+       extends
+          AccountStatusNotificationHandler
+          <ErrorLogAccountStatusNotificationHandlerCfg>
+       implements
+          ConfigurationChangeListener
+          <ErrorLogAccountStatusNotificationHandlerCfg>
 {
-
-
-
   /**
    * The set of names for the account status notification types that may be
    * logged by this notification handler.
@@ -78,17 +77,6 @@
   private static final HashSet<String> NOTIFICATION_TYPE_NAMES =
        new HashSet<String>();
 
-
-
-  // The DN of the configuration entry for this notification handler.
-  private DN configEntryDN;
-
-  // The set of notification types that should generate log messages.
-  private HashSet<AccountStatusNotificationType> notificationTypes;
-
-
-
-
   static
   {
     for (AccountStatusNotificationType t :
@@ -99,88 +87,34 @@
   }
 
 
+  // The DN of the configuration entry for this notification handler.
+  private DN configEntryDN;
+
+  // The set of notification types that should generate log messages.
+  private HashSet<AccountStatusNotificationType> notificationTypes;
+
+
 
   /**
-   * Initializes this account status notification handler based on the
-   * information in the provided configuration entry.
-   *
-   * @param  configEntry  The configuration entry that contains the information
-   *                      to use to initialize this account status notification
-   *                      handler.
-   *
-   * @throws  ConfigException  If the provided entry does not contain a valid
-   *                           configuration for this account status
-   *                           notification handler.
-   *
-   * @throws  InitializationException  If a problem occurs during initialization
-   *                                   that is not related to the server
-   *                                   configuration.
+   * {@inheritDoc}
    */
-  public void initializeStatusNotificationHandler(ConfigEntry configEntry)
-       throws ConfigException, InitializationException
+  public void initializeStatusNotificationHandler(
+      ErrorLogAccountStatusNotificationHandlerCfg configuration
+      )
+      throws ConfigException, InitializationException
   {
-    configEntryDN = configEntry.getDN();
+    configuration.addErrorLogChangeListener (this);
+    configEntryDN = configuration.dn();
 
-
-    // Initialize the set of notification types that should generate log
-    // messages.
-    int msgID = MSGID_ERRORLOG_ACCTNOTHANDLER_DESCRIPTION_NOTIFICATION_TYPES;
-    MultiChoiceConfigAttribute typesStub =
-         new MultiChoiceConfigAttribute(ATTR_ACCT_NOTIFICATION_TYPE,
-                                        getMessage(msgID), true, true, false,
-                                        NOTIFICATION_TYPE_NAMES);
-    try
-    {
-      MultiChoiceConfigAttribute typesAttr =
-           (MultiChoiceConfigAttribute)
-           configEntry.getConfigAttribute(typesStub);
-      notificationTypes = new HashSet<AccountStatusNotificationType>();
-      for (String s : typesAttr.activeValues())
-      {
-        AccountStatusNotificationType t =
-             AccountStatusNotificationType.typeForName(s);
-        if (t == null)
-        {
-          msgID = MSGID_ERRORLOG_ACCTNOTHANDLER_INVALID_TYPE;
-          String message = getMessage(msgID, String.valueOf(configEntryDN), s);
-          throw new ConfigException(msgID, message);
-        }
-        else
-        {
-          notificationTypes.add(t);
-        }
-      }
-    }
-    catch (Exception e)
-    {
-      if (debugEnabled())
-      {
-        debugCaught(DebugLogLevel.ERROR, e);
-      }
-
-      msgID = MSGID_ERRORLOG_ACCTNOTHANDLER_CANNOT_GET_NOTIFICATION_TYPES;
-      String message = getMessage(msgID, String.valueOf(configEntryDN),
-                                  getExceptionMessage(e));
-      throw new InitializationException(msgID, message, e);
-    }
-
-
-    DirectoryServer.registerConfigurableComponent(this);
-    DirectoryServer.registerAccountStatusNotificationHandler(configEntryDN,
-                                                             this);
+    // Read configuration and apply changes.
+    boolean applyChanges = true;
+    processNotificationHandlerConfig (configuration, applyChanges);
   }
 
 
 
   /**
-   * Performs any processing that may be necessary in conjunction with the
-   * provided account status notification type.
-   *
-   * @param  notificationType  The type for this account status notification.
-   * @param  userDN            The DN of the user entry to which this
-   *                           notification applies.
-   * @param  messageID         The unique ID for this notification.
-   * @param  message           The human-readable message for this notification.
+   * {@inheritDoc}
    */
   public void handleStatusNotification(AccountStatusNotificationType
                                             notificationType,
@@ -240,158 +174,172 @@
 
 
   /**
-   * 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.
+   * {@inheritDoc}
    */
-  public boolean hasAcceptableConfiguration(ConfigEntry configEntry,
-                      List<String> unacceptableReasons)
+  public boolean isConfigurationChangeAcceptable(
+      ErrorLogAccountStatusNotificationHandlerCfg configuration,
+      List<String> unacceptableReasons
+      )
   {
-    // Initialize the set of notification types that should generate log
-    // messages.
-    int msgID = MSGID_ERRORLOG_ACCTNOTHANDLER_DESCRIPTION_NOTIFICATION_TYPES;
-    MultiChoiceConfigAttribute typesStub =
-         new MultiChoiceConfigAttribute(ATTR_ACCT_NOTIFICATION_TYPE,
-                                        getMessage(msgID), true, true, false,
-                                        NOTIFICATION_TYPE_NAMES);
-    try
-    {
-      MultiChoiceConfigAttribute typesAttr =
-           (MultiChoiceConfigAttribute)
-           configEntry.getConfigAttribute(typesStub);
-      HashSet<AccountStatusNotificationType> types =
-           new HashSet<AccountStatusNotificationType>();
-      for (String s : typesAttr.activeValues())
-      {
-        AccountStatusNotificationType t =
-             AccountStatusNotificationType.typeForName(s);
-        if (t == null)
-        {
-          msgID = MSGID_ERRORLOG_ACCTNOTHANDLER_INVALID_TYPE;
-          String message = getMessage(msgID, String.valueOf(configEntryDN), s);
-          unacceptableReasons.add(message);
-          return false;
-        }
-        else
-        {
-          types.add(t);
-        }
-      }
-    }
-    catch (Exception e)
-    {
-      if (debugEnabled())
-      {
-        debugCaught(DebugLogLevel.ERROR, e);
-      }
+    // Make sure that we can process the defined notification handler.
+    // If so, then we'll accept the new configuration.
+    boolean applyChanges = false;
+    boolean isAcceptable = processNotificationHandlerConfig (
+        configuration, applyChanges
+        );
 
-      msgID = MSGID_ERRORLOG_ACCTNOTHANDLER_CANNOT_GET_NOTIFICATION_TYPES;
-      String message = getMessage(msgID, String.valueOf(configEntryDN),
-                                  getExceptionMessage(e));
-      unacceptableReasons.add(message);
-      return false;
-    }
-
-
-    // If we've gotten here, then everything is OK.
-    return true;
+    return isAcceptable;
   }
 
 
 
   /**
-   * 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.
+   * 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.
+   * @param  configuration    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.
+   * @return  Information about the result of the configuration update.
    */
-  public ConfigChangeResult applyNewConfiguration(ConfigEntry configEntry,
-                                                  boolean detailedResults)
+  public ConfigChangeResult applyConfigurationChange (
+      ErrorLogAccountStatusNotificationHandlerCfg configuration,
+      boolean detailedResults
+      )
+  {
+    ConfigChangeResult changeResult = applyConfigurationChange (configuration);
+    return changeResult;
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  public ConfigChangeResult applyConfigurationChange (
+      ErrorLogAccountStatusNotificationHandlerCfg configuration
+      )
   {
     ResultCode resultCode = ResultCode.SUCCESS;
     boolean adminActionRequired = false;
     ArrayList<String> messages = new ArrayList<String>();
-
+    ConfigChangeResult changeResult = new ConfigChangeResult(
+        resultCode, adminActionRequired, messages
+        );
 
     // Initialize the set of notification types that should generate log
     // messages.
-    HashSet<AccountStatusNotificationType> types =
-         new HashSet<AccountStatusNotificationType>();
-    int msgID = MSGID_ERRORLOG_ACCTNOTHANDLER_DESCRIPTION_NOTIFICATION_TYPES;
-    MultiChoiceConfigAttribute typesStub =
-         new MultiChoiceConfigAttribute(ATTR_ACCT_NOTIFICATION_TYPE,
-                                        getMessage(msgID), true, true, false,
-                                        NOTIFICATION_TYPE_NAMES);
-    try
-    {
-      MultiChoiceConfigAttribute typesAttr =
-           (MultiChoiceConfigAttribute)
-           configEntry.getConfigAttribute(typesStub);
-      for (String s : typesAttr.activeValues())
-      {
-        AccountStatusNotificationType t =
-             AccountStatusNotificationType.typeForName(s);
-        if (t == null)
-        {
-          resultCode = ResultCode.UNWILLING_TO_PERFORM;
+    boolean applyChanges = false;
+    processNotificationHandlerConfig (
+        configuration, applyChanges
+        );
 
-          msgID = MSGID_ERRORLOG_ACCTNOTHANDLER_INVALID_TYPE;
-          messages.add(getMessage(msgID, String.valueOf(configEntryDN), s));
-        }
-        else
-        {
-          types.add(t);
-        }
-      }
-    }
-    catch (Exception e)
-    {
-      if (debugEnabled())
-      {
-        debugCaught(DebugLogLevel.ERROR, e);
-      }
-
-      resultCode = DirectoryServer.getServerErrorResultCode();
-
-      msgID = MSGID_ERRORLOG_ACCTNOTHANDLER_CANNOT_GET_NOTIFICATION_TYPES;
-      messages.add(getMessage(msgID, String.valueOf(configEntryDN),
-                              getExceptionMessage(e)));
-    }
-
-
-    if (resultCode == ResultCode.SUCCESS)
-    {
-      this.notificationTypes = types;
-    }
-
-
-    return new ConfigChangeResult(resultCode, adminActionRequired, messages);
+    return changeResult;
   }
+
+
+  /**
+   * Parses the provided configuration and configure the notification handler.
+   *
+   * @param configuration  The new configuration containing the changes.
+   * @param applyChanges   If true then take into account the new configuration.
+   *
+   * @return  The mapping between strings of character set values and the
+   *          minimum number of characters required from those sets.
+   */
+  public boolean processNotificationHandlerConfig(
+      ErrorLogAccountStatusNotificationHandlerCfg configuration,
+      boolean                                     applyChanges
+      )
+  {
+    // false if the configuration is not acceptable
+    boolean isAcceptable = true;
+
+    // The set of notification types that should generate log messages.
+    HashSet<AccountStatusNotificationType> newNotificationTypes =
+        new HashSet<AccountStatusNotificationType>();
+
+    // Initialize the set of notification types that should generate log
+    // messages.
+    for (ErrorLogAccountStatusNotificationHandlerCfgDefn.
+         AccountStatusNotificationType configNotificationType:
+         configuration.getAccountStatusNotificationType())
+    {
+      newNotificationTypes.add (getNotificationType (configNotificationType));
+    }
+
+    if (applyChanges && isAcceptable)
+    {
+      notificationTypes = newNotificationTypes;
+    }
+
+    return isAcceptable;
+  }
+
+
+  /**
+   * Gets the OpenDS notification type object that corresponds to the
+   * configuration counterpart.
+   *
+   * @param  notificationType  The configuration notification type for which
+   *                           to retrieve the OpenDS notification type.
+   */
+  private AccountStatusNotificationType getNotificationType(
+      ErrorLogAccountStatusNotificationHandlerCfgDefn.
+         AccountStatusNotificationType configNotificationType
+      )
+  {
+    AccountStatusNotificationType nt = null;
+
+    switch (configNotificationType)
+    {
+    case ACCOUNT_TEMPORARILY_LOCKED:
+         nt = AccountStatusNotificationType.ACCOUNT_TEMPORARILY_LOCKED;
+         break;
+    case ACCOUNT_PERMANENTLY_LOCKED:
+         nt = AccountStatusNotificationType.ACCOUNT_PERMANENTLY_LOCKED;
+         break;
+    case ACCOUNT_UNLOCKED:
+         nt = AccountStatusNotificationType.ACCOUNT_UNLOCKED;
+         break;
+    case ACCOUNT_IDLE_LOCKED:
+         nt = AccountStatusNotificationType.ACCOUNT_IDLE_LOCKED;
+         break;
+    case ACCOUNT_RESET_LOCKED:
+         nt = AccountStatusNotificationType.ACCOUNT_RESET_LOCKED;
+         break;
+    case ACCOUNT_DISABLED:
+         nt = AccountStatusNotificationType.ACCOUNT_DISABLED;
+         break;
+    case ACCOUNT_ENABLED:
+         nt = AccountStatusNotificationType.ACCOUNT_ENABLED;
+         break;
+    case ACCOUNT_EXPIRED:
+         nt = AccountStatusNotificationType.ACCOUNT_EXPIRED;
+         break;
+    case PASSWORD_EXPIRED:
+         nt = AccountStatusNotificationType.PASSWORD_EXPIRED;
+         break;
+    case PASSWORD_EXPIRING:
+         nt = AccountStatusNotificationType.PASSWORD_EXPIRING;
+         break;
+    case PASSWORD_RESET:
+         nt = AccountStatusNotificationType.PASSWORD_RESET;
+         break;
+    case PASSWORD_CHANGED:
+         nt = AccountStatusNotificationType.PASSWORD_CHANGED;
+         break;
+    }
+
+    return nt;
+  }
+
 }
 

--
Gitblit v1.10.0