From 19fb5731ffbe883fe8375ee9b785984c8ccf1880 Mon Sep 17 00:00:00 2001
From: coulbeck <coulbeck@localhost>
Date: Fri, 20 Apr 2007 22:23:11 +0000
Subject: [PATCH] Migrate the BackendConfigManager to the new configuration framework.

---
 opends/src/server/org/opends/server/backends/jeb/BackendImpl.java |  317 +++++++++++-----------------------------------------
 1 files changed, 66 insertions(+), 251 deletions(-)

diff --git a/opends/src/server/org/opends/server/backends/jeb/BackendImpl.java b/opends/src/server/org/opends/server/backends/jeb/BackendImpl.java
index 93f8fc2..5534235 100644
--- a/opends/src/server/org/opends/server/backends/jeb/BackendImpl.java
+++ b/opends/src/server/org/opends/server/backends/jeb/BackendImpl.java
@@ -35,63 +35,47 @@
 import com.sleepycat.je.DatabaseException;
 
 import org.opends.server.api.Backend;
-import org.opends.server.api.ConfigurableComponent;
 import org.opends.server.api.MonitorProvider;
-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.config.ConfigEntry;
 import org.opends.server.core.AddOperation;
 import org.opends.server.core.DeleteOperation;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.ModifyOperation;
 import org.opends.server.core.ModifyDNOperation;
 import org.opends.server.core.SearchOperation;
-import org.opends.server.types.BackupConfig;
-import org.opends.server.types.BackupDirectory;
-import org.opends.server.types.CancelledOperationException;
-import org.opends.server.types.ConfigChangeResult;
-import org.opends.server.types.DN;
-import org.opends.server.types.DirectoryException;
-import org.opends.server.types.Entry;
-import org.opends.server.types.ErrorLogCategory;
-import org.opends.server.types.ErrorLogSeverity;
-import org.opends.server.types.InitializationException;
-import org.opends.server.types.LDIFImportConfig;
-import org.opends.server.types.LDIFExportConfig;
-import org.opends.server.types.RestoreConfig;
-import org.opends.server.types.ResultCode;
+import org.opends.server.core.BackendConfigManager;
 import org.opends.server.util.LDIFException;
+import org.opends.server.util.Validator;
 
 import static org.opends.server.messages.BackendMessages.*;
-import static org.opends.server.messages.MessageHandler.*;
+import static org.opends.server.messages.MessageHandler.getMessage;
 import static org.opends.server.messages.JebMessages.*;
 import static org.opends.server.loggers.Error.logError;
-import static org.opends.server.messages.ConfigMessages.*;
-import static org.opends.server.config.ConfigConstants.ATTR_BACKEND_BASE_DN;
 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 org.opends.server.types.*;
 import static org.opends.server.util.ServerConstants.OID_SUBTREE_DELETE_CONTROL;
 import static org.opends.server.util.ServerConstants.OID_PAGED_RESULTS_CONTROL;
 import static org.opends.server.util.ServerConstants.OID_MANAGE_DSAIT_CONTROL;
+import org.opends.server.admin.std.server.JEBackendCfg;
+import org.opends.server.admin.std.meta.JEBackendCfgDefn;
+import org.opends.server.admin.server.ConfigurationChangeListener;
 
 /**
  * This is an implementation of a Directory Server Backend which stores entries
  * locally in a Sleepycat JE database.
  */
-public class BackendImpl extends Backend implements ConfigurableComponent
+public class BackendImpl
+     extends Backend
+     implements ConfigurationChangeListener<JEBackendCfg>
 {
 
   /**
-   * The DN of the configuration entry for this backend.
-   */
-  private DN configDN;
-
-  /**
    * The configuration of this JE backend.
    */
   private Config config;
+  private JEBackendCfg currentConfig;
 
   /**
    * The root JE container to use for this backend.
@@ -99,12 +83,6 @@
   private RootContainer rootContainer;
 
   /**
-   * A configurable component to handle changes to the configuration of
-   * the database environment.
-   */
-  private ConfigurableEnvironment configurableEnv = null;
-
-  /**
    * A count of the total operation threads currently in the backend.
    */
   private AtomicInteger threadTotalCount = new AtomicInteger(0);
@@ -125,17 +103,6 @@
    */
   private static HashSet<String> supportedControls;
 
-  /**
-   * The set of configuration attributes associated with the backend in its role
-   * as a configurable component.
-   */
-  private static ArrayList<ConfigAttribute> configAttrs;
-
-  /**
-   * The configuration attribute stub for the backendBaseDN attribute.
-   */
-  private static DNConfigAttribute baseDNStub;
-
 
 
   static
@@ -145,17 +112,6 @@
     supportedControls.add(OID_SUBTREE_DELETE_CONTROL);
     supportedControls.add(OID_PAGED_RESULTS_CONTROL);
     supportedControls.add(OID_MANAGE_DSAIT_CONTROL);
-
-    configAttrs = new ArrayList<ConfigAttribute>();
-
-    // ds-cfg-backendBaseDN configuration attribute.
-    int msgID = MSGID_CONFIG_BACKEND_ATTR_DESCRIPTION_BASE_DNS;
-    baseDNStub = new DNConfigAttribute(ATTR_BACKEND_BASE_DN,
-                                       getMessage(msgID),
-                                       true, true, true);
-
-    configAttrs.add(baseDNStub);
-
   }
 
 
@@ -256,29 +212,17 @@
 
 
   /**
-   * Initializes this backend based on the information in the provided
-   * configuration entry.
-   *
-   * @param  configEntry  The configuration entry that contains the information
-   *                      to use to initialize this backend.
-   * @param  baseDNs      The set of base DNs that have been configured for this
-   *                      backend.
-   *
-   * @throws  ConfigException  If an unrecoverable problem arises in the
-   *                           process of performing the initialization.
-   *
-   * @throws  InitializationException  If a problem occurs during initialization
-   *                                   that is not related to the server
-   *                                   configuration.
+   * {@inheritDoc}
    */
   public void initializeBackend(ConfigEntry configEntry, DN[] baseDNs)
        throws ConfigException, InitializationException
   {
-    configDN = configEntry.getDN();
+    Validator.ensureNotNull(configEntry);
+    JEBackendCfg backendCfg = getJEBackendCfg(configEntry);
 
     // Initialize a config object
     config = new Config();
-    config.initializeConfig(configEntry, baseDNs);
+    config.initializeConfig(backendCfg, baseDNs);
 
     for (DN dn : baseDNs)
     {
@@ -370,16 +314,11 @@
                                         message, databaseException);
     }
 
-    // Register this backend as a configurable component.
-    DirectoryServer.registerConfigurableComponent(this);
-
-    // Register the database environment as a configurable component.
-    ConfigurableEnvironment configurableEnv =
-        rootContainer.getConfigurableEnvironment();
-    if (configurableEnv != null)
-    {
-      DirectoryServer.registerConfigurableComponent(configurableEnv);
-    }
+    // Register this backend as a change listener.
+    currentConfig = backendCfg;
+    backendCfg.addJEChangeListener(this);
+    backendCfg.addJEChangeListener(config);
+    backendCfg.addJEChangeListener(rootContainer);
   }
 
   /**
@@ -393,17 +332,12 @@
    */
   public void finalizeBackend()
   {
-    // Deregister our configurable components.
-    // TODO: configurableEnv is always null and will not be deregistered.
-    if (configurableEnv != null)
-    {
-      DirectoryServer.deregisterConfigurableComponent(configurableEnv);
-      configurableEnv = null;
-    }
-    DirectoryServer.deregisterConfigurableComponent(this);
+    // Deregister as a change listener.
+    currentConfig.removeJEChangeListener(rootContainer);
+    currentConfig.removeJEChangeListener(config);
+    currentConfig.removeJEChangeListener(this);
 
-    // Deregister our suffixes.
-    // FIXME: Currently assuming every base DN is also a suffix.
+    // Deregister our base DNs.
     for (DN dn : rootContainer.getBaseDNs())
     {
       try
@@ -943,16 +877,7 @@
 
 
   /**
-   * Exports the contents of this backend to LDIF.  This method should only be
-   * called if <CODE>supportsLDIFExport</CODE> returns <CODE>true</CODE>.  Note
-   * that the server will not explicitly initialize this backend before calling
-   * this method.
-   *
-   * @param configEntry  The configuration entry for this backend.
-   * @param baseDNs      The set of base DNs configured for this backend.
-   * @param exportConfig The configuration to use when performing the export.
-   * @throws org.opends.server.types.DirectoryException
-   *          If a problem occurs while performing the LDIF export.
+   * {@inheritDoc}
    */
   public void exportLDIF(ConfigEntry configEntry, DN[] baseDNs,
                          LDIFExportConfig exportConfig)
@@ -1062,16 +987,7 @@
 
 
   /**
-   * Imports information from an LDIF file into this backend.  This method
-   * should only be called if <CODE>supportsLDIFImport</CODE> returns
-   * <CODE>true</CODE>.  Note that the server will not explicitly initialize
-   * this backend before calling this method.
-   *
-   * @param configEntry  The configuration entry for this backend.
-   * @param baseDNs      The set of base DNs configured for this backend.
-   * @param importConfig The configuration to use when performing the import.
-   * @throws DirectoryException If a problem occurs while performing the LDIF
-   *                            import.
+   * {@inheritDoc}
    */
   public void importLDIF(ConfigEntry configEntry, DN[] baseDNs,
                          LDIFImportConfig importConfig)
@@ -1239,11 +1155,14 @@
                              ConfigEntry configEntry, DN[] baseDNs)
        throws InitializationException, ConfigException, DirectoryException
   {
+    JEBackendCfg backendCfg = getJEBackendCfg(configEntry);
+
     // If the backend already has the root container open, we must use the same
     // underlying root container
     boolean openRootContainer = rootContainer == null;
 
-    // If the rootContainer is open, the backend is initizlied by something else
+    // If the rootContainer is open, the backend is initialized by something
+    // else.
     // We can't do any rebuild of system indexes while others are using this
     // backend. Throw error. TODO: Need to make baseDNs disablable.
     if(!openRootContainer && rebuildConfig.includesSystemIndex())
@@ -1259,7 +1178,7 @@
       {
         // Initialize a config object.
         config = new Config();
-        config.initializeConfig(configEntry, baseDNs);
+        config.initializeConfig(backendCfg, baseDNs);
 
         // Open the database environment
         rootContainer = new RootContainer(config, this);
@@ -1316,16 +1235,7 @@
 
 
   /**
-   * Creates a backup of the contents of this backend in a form that may be
-   * restored at a later date if necessary.  This method should only be called
-   * if <CODE>supportsBackup</CODE> returns <CODE>true</CODE>.  Note that the
-   * server will not explicitly initialize this backend before calling this
-   * method.
-   *
-   * @param configEntry  The configuration entry for this backend.
-   * @param backupConfig The configuration to use when performing the backup.
-   * @throws DirectoryException If a problem occurs while performing the
-   *                            backup.
+   * {@inheritDoc}
    */
   public void createBackup(ConfigEntry configEntry, BackupConfig backupConfig)
        throws DirectoryException
@@ -1338,15 +1248,7 @@
 
 
   /**
-   * Removes the specified backup if it is possible to do so.
-   *
-   * @param backupDirectory The backup directory structure with which the
-   *                        specified backup is associated.
-   * @param backupID        The backup ID for the backup to be removed.
-   * @throws DirectoryException If it is not possible to remove the specified
-   *                            backup for some reason (e.g., no such backup
-   *                            exists or there are other backups that are
-   *                            dependent upon it).
+   * {@inheritDoc}
    */
   public void removeBackup(BackupDirectory backupDirectory, String backupID)
        throws DirectoryException
@@ -1359,15 +1261,7 @@
 
 
   /**
-   * Restores a backup of the contents of this backend.  This method should only
-   * be called if <CODE>supportsRestore</CODE> returns <CODE>true</CODE>.  Note
-   * that the server will not explicitly initialize this backend before calling
-   * this method.
-   *
-   * @param configEntry   The configuration entry for this backend.
-   * @param restoreConfig The configuration to use when performing the restore.
-   * @throws DirectoryException If a problem occurs while performing the
-   *                            restore.
+   * {@inheritDoc}
    */
   public void restoreBackup(ConfigEntry configEntry,
                             RestoreConfig restoreConfig)
@@ -1381,107 +1275,23 @@
 
 
   /**
-   * 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.
+   * {@inheritDoc}
    */
-  public DN getConfigurableComponentEntryDN()
+  public boolean isConfigurationChangeAcceptable(
+       JEBackendCfg cfg,
+       List<String> unacceptableReasons)
   {
-    return configDN;
+    // This listener handles only the changes to the base DNs.
+    // The base DNs are checked by the backend config manager.
+    return true;
   }
 
 
 
   /**
-   * 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.
+   * {@inheritDoc}
    */
-  public List<ConfigAttribute> getConfigurationAttributes()
-  {
-    return configAttrs;
-  }
-
-
-
-  /**
-   * 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)
-  {
-    DN[] baseDNs = null;
-    boolean acceptable = true;
-
-    try
-    {
-      DNConfigAttribute baseDNAttr =
-           (DNConfigAttribute) configEntry.getConfigAttribute(baseDNStub);
-      if (baseDNAttr == null)
-      {
-        int msgID = MSGID_CONFIG_BACKEND_NO_BASE_DNS;
-        String message = getMessage(msgID, String.valueOf(configEntry.getDN()));
-        unacceptableReasons.add(message);
-      }
-      else
-      {
-        baseDNs = baseDNAttr.activeValues().toArray(new DN[0]);
-      }
-    }
-    catch (ConfigException e)
-    {
-      unacceptableReasons.add(e.getMessage());
-      acceptable = false;
-    }
-
-    Config newConfig = new Config();
-    try
-    {
-      newConfig.initializeConfig(configEntry, baseDNs);
-    }
-    catch (ConfigException e)
-    {
-      unacceptableReasons.add(e.getMessage());
-      acceptable = false;
-    }
-
-    return acceptable;
-  }
-
-
-
-  /**
-   * 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)
+  public ConfigChangeResult applyConfigurationChange(JEBackendCfg cfg)
   {
     ConfigChangeResult ccr;
     ResultCode resultCode = ResultCode.SUCCESS;
@@ -1489,22 +1299,14 @@
 
     try
     {
-      DN[] baseDNs = null;
-
-      DNConfigAttribute baseDNAttr =
-           (DNConfigAttribute) configEntry.getConfigAttribute(baseDNStub);
-
-      baseDNs = baseDNAttr.activeValues().toArray(new DN[0]);
-
-      // Create a new Config object.
-      Config newConfig = new Config();
-      newConfig.initializeConfig(configEntry, baseDNs);
+      DN[] baseDNs = new DN[cfg.getBackendBaseDN().size()];
+      baseDNs = cfg.getBackendBaseDN().toArray(baseDNs);
 
       // Check for changes to the base DNs.
       for (DN baseDN : config.getBaseDNs())
       {
         boolean found = false;
-        for (DN dn : newConfig.getBaseDNs())
+        for (DN dn : baseDNs)
         {
           if (dn.equals(baseDN))
           {
@@ -1523,7 +1325,7 @@
         }
       }
 
-      for (DN baseDN : newConfig.getBaseDNs())
+      for (DN baseDN : baseDNs)
       {
         if (!rootContainer.getBaseDNs().contains(baseDN))
         {
@@ -1551,11 +1353,8 @@
         }
       }
 
-      // Apply new JE configuration
-      rootContainer.applyNewConfig(config);
-
       // Put the new configuration in place.
-      config = newConfig;
+      currentConfig = cfg;
     }
     catch (Exception e)
     {
@@ -1601,4 +1400,20 @@
     config.initializeConfig(configEntry, baseDNs);
     EnvManager.removeFiles(config.getBackendDirectory().getPath());
   }
+
+  /**
+   * Gets the JE backend configuration corresponding to a JE
+   * backend config entry.
+   *
+   * @param configEntry A JE backend config entry.
+   * @return Returns the JE backend configuration.
+   * @throws ConfigException If the config entry could not be decoded.
+   */
+  static JEBackendCfg getJEBackendCfg(ConfigEntry configEntry)
+      throws ConfigException {
+    return BackendConfigManager.getConfiguration(
+         JEBackendCfgDefn.getInstance(), configEntry);
+  }
+
+
 }

--
Gitblit v1.10.0