mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Nicolas Capponi
03.58.2016 ccd66a6d38f7d3a55a4fddd2945d8ab8920b007e
OPENDJ-3417 Move management of backends and listeners from DirectoryServer to BackendConfigManager

In DirectoryServer class
- remove fields backends and backendInitializationListeners
- remove methods registerBaseDN() and deregisterBaseDN()
- instanciate BackendConfigManager earlier in the start() method
- behavior forwarded to BackendConfigManager instance
- registerBackendInitializationListener() and
deregisterBackendInitializationListener()
- getBackends()
- getBackend(String backendID)
- hasBackend(String backendID)
- getLocalBackend(DN entryDn)
- registerBackend(LocalBackend) and deregisterBackend(LocalBackend)
- shutdownBackends()

Rename BackendInitializationListener to LocalBackendInitializationListener
27 files modified
1 files renamed
607 ■■■■■ changed files
opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/task/Task.java 3 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/api/LocalBackendInitializationListener.java 4 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/authorization/dseecompat/AciListenerManager.java 4 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/backends/BackupBackend.java 8 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/backends/ChangelogBackend.java 5 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/backends/ConfigurationBackend.java 9 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/backends/LDIFBackend.java 9 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/backends/MemoryBackend.java 7 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/backends/MonitorBackend.java 7 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/backends/NullBackend.java 4 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/backends/RootDSEBackend.java 8 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/backends/SchemaBackend.java 8 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/backends/TrustStoreBackend.java 7 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/BackendImpl.java 8 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/backends/task/TaskBackend.java 4 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/core/BackendConfigManager.java 249 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/core/DirectoryServer.java 205 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/core/GroupManager.java 4 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/core/ServerContext.java 2 ●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/core/SubentryManager.java 4 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/crypto/CryptoManagerSync.java 4 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/extensions/DefaultEntryCache.java 4 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/replication/plugin/LDAPReplicationDomain.java 4 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/workflowelement/localbackend/LocalBackendWorkflowElement.java 2 ●●● patch | view | raw | blame | history
opendj-server-legacy/src/test/java/org/opends/server/TestCaseUtils.java 17 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/test/java/org/opends/server/backends/ChangelogBackendTestCase.java 1 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/test/java/org/opends/server/core/BackendConfigManagerTestCase.java 14 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/test/java/org/opends/server/types/TestDN.java 2 ●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/task/Task.java
@@ -240,7 +240,8 @@
    getInfo().stopPooling();
    if (getInfo().mustDeregisterConfig())
    {
      DirectoryServer.deregisterBaseDN(DN.valueOf("cn=config"));
      DirectoryServer.getInstance().getServerContext().getBackendConfigManager()
        .deregisterBaseDN(DN.valueOf("cn=config"));
    }
    DirectoryServer.getInstance().initializeConfiguration(ConfigReader.configFile);
    getInfo().setMustDeregisterConfig(true);
opendj-server-legacy/src/main/java/org/opends/server/api/LocalBackendInitializationListener.java
File was renamed from opendj-server-legacy/src/main/java/org/opends/server/api/BackendInitializationListener.java
@@ -21,14 +21,14 @@
/**
 * This interface defines a set of methods that may be used by server
 * components to perform any processing that they might find necessary
 * whenever a backend is initialized and/or finalized.
 * whenever a local backend is initialized and/or finalized.
 */
@org.opends.server.types.PublicAPI(
     stability=org.opends.server.types.StabilityLevel.VOLATILE,
     mayInstantiate=false,
     mayExtend=true,
     mayInvoke=false)
public interface BackendInitializationListener
public interface LocalBackendInitializationListener
{
  /**
   * Performs any processing that may be required whenever a backend
opendj-server-legacy/src/main/java/org/opends/server/authorization/dseecompat/AciListenerManager.java
@@ -34,7 +34,7 @@
import org.forgerock.opendj.ldap.schema.AttributeType;
import org.opends.server.api.AlertGenerator;
import org.opends.server.api.LocalBackend;
import org.opends.server.api.BackendInitializationListener;
import org.opends.server.api.LocalBackendInitializationListener;
import org.opends.server.api.plugin.InternalDirectoryServerPlugin;
import org.opends.server.api.plugin.PluginResult;
import org.opends.server.api.plugin.PluginResult.PostOperation;
@@ -64,7 +64,7 @@
 * finalized.
 */
public class AciListenerManager implements
    BackendInitializationListener, AlertGenerator
    LocalBackendInitializationListener, AlertGenerator
{
  private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
opendj-server-legacy/src/main/java/org/opends/server/backends/BackupBackend.java
@@ -104,6 +104,9 @@
  /** A cache of BackupDirectories. */
  private HashMap<File,CachedBackupDirectory> backupDirectories;
  /** The server context. */
  private ServerContext serverContext;
  /**
   * To avoid parsing and reparsing the contents of backup.info files, we
   * cache the BackupDirectory for each directory using this class.
@@ -172,6 +175,7 @@
  @Override
  public void configureBackend(BackupBackendCfg config, ServerContext serverContext) throws ConfigException
  {
    this.serverContext = serverContext;
    // Make sure that a configuration entry was provided.  If not, then we will
    // not be able to complete initialization.
    if (config == null)
@@ -232,7 +236,7 @@
    // Register the backup base as a private suffix.
    try
    {
      DirectoryServer.registerBaseDN(backupBaseDN, this, true);
      serverContext.getBackendConfigManager().registerBaseDN(backupBaseDN, this, true);
    }
    catch (Exception e)
    {
@@ -251,7 +255,7 @@
    try
    {
      DirectoryServer.deregisterBaseDN(backupBaseDN);
      serverContext.getBackendConfigManager().deregisterBaseDN(backupBaseDN);
    }
    catch (Exception e)
    {
opendj-server-legacy/src/main/java/org/opends/server/backends/ChangelogBackend.java
@@ -257,7 +257,8 @@
    try
    {
      DirectoryServer.registerBaseDN(CHANGELOG_BASE_DN, this, true);
      DirectoryServer.getInstance().getServerContext().getBackendConfigManager()
        .registerBaseDN(CHANGELOG_BASE_DN, this, true);
    }
    catch (final DirectoryException e)
    {
@@ -271,7 +272,7 @@
  {
    try
    {
      DirectoryServer.deregisterBaseDN(CHANGELOG_BASE_DN);
      DirectoryServer.getInstance().getServerContext().getBackendConfigManager().deregisterBaseDN(CHANGELOG_BASE_DN);
    }
    catch (final DirectoryException e)
    {
opendj-server-legacy/src/main/java/org/opends/server/backends/ConfigurationBackend.java
@@ -50,7 +50,6 @@
import org.opends.server.config.ConfigurationHandler;
import org.opends.server.core.AddOperation;
import org.opends.server.core.DeleteOperation;
import org.opends.server.core.DirectoryServer;
import org.opends.server.core.ModifyDNOperation;
import org.opends.server.core.ModifyOperation;
import org.opends.server.core.SearchOperation;
@@ -192,6 +191,9 @@
   */
  private final Object configLock = new Object();
  /** The server context. */
  private final ServerContext serverContext;
  /**
   * Creates and initializes a new instance of this backend.
   *
@@ -205,6 +207,7 @@
  public ConfigurationBackend(ServerContext serverContext, ConfigurationHandler configurationHandler)
      throws InitializationException
  {
    this.serverContext = serverContext;
    this.configurationHandler = configurationHandler;
    this.configRootEntry = Converters.to(configurationHandler.getRootEntry());
    baseDNs = Collections.singleton(configRootEntry.getName());
@@ -227,7 +230,7 @@
  {
    try
    {
      DirectoryServer.deregisterBaseDN(configRootEntry.getName());
      serverContext.getBackendConfigManager().deregisterBaseDN(configRootEntry.getName());
    }
    catch (Exception e)
    {
@@ -247,7 +250,7 @@
    DN baseDN = configRootEntry.getName();
    try
    {
      DirectoryServer.registerBaseDN(baseDN, this, true);
      serverContext.getBackendConfigManager().registerBaseDN(baseDN, this, true);
    }
    catch (DirectoryException e)
    {
opendj-server-legacy/src/main/java/org/opends/server/backends/LDIFBackend.java
@@ -107,6 +107,9 @@
  /** The path to the LDIF file containing the data for this backend. */
  private String ldifFilePath;
  /** The server context. */
  private ServerContext serverContext;
  /**
   * Creates a new backend with the provided information.  All backend
   * implementations must implement a default constructor that use
@@ -132,8 +135,7 @@
    {
      try
      {
        DirectoryServer.registerBaseDN(dn, this,
                                       currentConfig.isIsPrivateBackend());
        serverContext.getBackendConfigManager().registerBaseDN(dn, this, currentConfig.isIsPrivateBackend());
      }
      catch (Exception e)
      {
@@ -337,7 +339,7 @@
      {
        try
        {
          DirectoryServer.deregisterBaseDN(dn);
          serverContext.getBackendConfigManager().deregisterBaseDN(dn);
        }
        catch (Exception e)
        {
@@ -1191,6 +1193,7 @@
  @Override
  public void configureBackend(LDIFBackendCfg config, ServerContext serverContext) throws ConfigException
  {
    this.serverContext = serverContext;
    if (config != null)
    {
      currentConfig = config;
opendj-server-legacy/src/main/java/org/opends/server/backends/MemoryBackend.java
@@ -105,6 +105,8 @@
  private Map<DN, HashSet<DN>> childDNs;
  /** The mapping between entry DNs and the corresponding entries. */
  private LinkedHashMap<DN,Entry> entryMap;
  /** The server context. */
  private ServerContext serverContext;
  /**
   * Creates a new backend with the provided information.  All backend
@@ -132,6 +134,7 @@
  @Override
  public void configureBackend(MemoryBackendCfg config, ServerContext serverContext) throws ConfigException
  {
    this.serverContext = serverContext;
    if (config != null)
    {
      this.baseDNs = config.getBaseDN();
@@ -157,7 +160,7 @@
    {
      try
      {
        DirectoryServer.registerBaseDN(dn, this, false);
        serverContext.getBackendConfigManager().registerBaseDN(dn, this, false);
      }
      catch (Exception e)
      {
@@ -186,7 +189,7 @@
    {
      try
      {
        DirectoryServer.deregisterBaseDN(dn);
        serverContext.getBackendConfigManager().deregisterBaseDN(dn);
      }
      catch (Exception e)
      {
opendj-server-legacy/src/main/java/org/opends/server/backends/MonitorBackend.java
@@ -102,6 +102,8 @@
  private DN baseMonitorDN;
  /** The set of base DNs for this backend. */
  private Set<DN> baseDNs;
  /** The server context. */
  private ServerContext serverContext;
  /**
   * Creates a new backend with the provided information. All backend
@@ -167,6 +169,7 @@
      throws ConfigException
  {
    Reject.ifNull(config);
    this.serverContext = serverContext;
    final MonitorBackendCfg cfg = config;
    final Entry configEntry = DirectoryServer.getConfigEntry(cfg.dn());
@@ -296,7 +299,7 @@
    currentConfig.removeMonitorChangeListener(this);
    try
    {
      DirectoryServer.deregisterBaseDN(baseMonitorDN);
      serverContext.getBackendConfigManager().deregisterBaseDN(baseMonitorDN);
    }
    catch (final Exception e)
    {
@@ -387,7 +390,7 @@
    // Register the monitor base as a private suffix.
    try
    {
      DirectoryServer.registerBaseDN(baseMonitorDN, this, true);
      serverContext.getBackendConfigManager().registerBaseDN(baseMonitorDN, this, true);
    }
    catch (final Exception e)
    {
opendj-server-legacy/src/main/java/org/opends/server/backends/NullBackend.java
@@ -136,7 +136,7 @@
    {
      try
      {
        DirectoryServer.registerBaseDN(dn, this, false);
        serverContext.getBackendConfigManager().registerBaseDN(dn, this, false);
      }
      catch (Exception e)
      {
@@ -177,7 +177,7 @@
    {
      try
      {
        DirectoryServer.deregisterBaseDN(dn);
        serverContext.getBackendConfigManager().deregisterBaseDN(dn);
      }
      catch (Exception e)
      {
opendj-server-legacy/src/main/java/org/opends/server/backends/RootDSEBackend.java
@@ -331,7 +331,7 @@
    // Add the "ds-private-naming-contexts" attribute.
    Attribute privateNamingContextAttr = createAttribute(
        ATTR_PRIVATE_NAMING_CONTEXTS, serverContext.getBackendManager().getPrivateNamingContexts().keySet());
        ATTR_PRIVATE_NAMING_CONTEXTS, serverContext.getBackendConfigManager().getPrivateNamingContexts().keySet());
    addAttribute(privateNamingContextAttr, dseUserAttrs, dseOperationalAttrs);
    // Add the "supportedControl" attribute.
@@ -419,7 +419,7 @@
    // TODO: this duplicates what is done in DirectoryServer (see DirectoryServer.getSupportedControls())
    // How should this be handled ?
    final Set<String> controls = new HashSet<>();
    for (Backend<?> backend : serverContext.getBackendManager().getAllBackends())
    for (Backend<?> backend : serverContext.getBackendConfigManager().getAllBackends())
    {
      controls.addAll(backend.getSupportedControls());
    }
@@ -429,7 +429,7 @@
  private Set<DN> getAllPublicNamingContexts()
  {
    Set<DN> namingContexts = new HashSet<>();
    for (Backend<?> backend : serverContext.getBackendManager().getAllBackends())
    for (Backend<?> backend : serverContext.getBackendConfigManager().getAllBackends())
    {
      namingContexts.addAll(backend.getBaseDNs());
    }
@@ -440,7 +440,7 @@
  {
    // TODO: this implementation is insufficient because it handles only the local backends
    // The non-local backends must be added for completeness
    return new HashSet<DN>(serverContext.getBackendManager().getPublicNamingContexts().keySet());
    return new HashSet<DN>(serverContext.getBackendConfigManager().getPublicNamingContexts().keySet());
  }
  private void addAll(Collection<Attribute> attributes,
opendj-server-legacy/src/main/java/org/opends/server/backends/SchemaBackend.java
@@ -214,7 +214,7 @@
    DirectoryServer.setSchemaDN(baseDNs.iterator().next());
    for (DN baseDN : baseDNs) {
      try {
        DirectoryServer.registerBaseDN(baseDN, this, true);
        serverContext.getBackendConfigManager().registerBaseDN(baseDN, this, true);
      } catch (Exception e) {
        logger.traceException(e);
@@ -237,7 +237,7 @@
    {
      try
      {
        DirectoryServer.deregisterBaseDN(baseDN);
        serverContext.getBackendConfigManager().deregisterBaseDN(baseDN);
      }
      catch (Exception e)
      {
@@ -1783,7 +1783,7 @@
      {
        try
        {
          DirectoryServer.deregisterBaseDN(dn);
          serverContext.getBackendConfigManager().deregisterBaseDN(dn);
          ccr.addMessage(INFO_SCHEMA_DEREGISTERED_BASE_DN.get(dn));
        }
        catch (Exception e)
@@ -1800,7 +1800,7 @@
      {
        try
        {
          DirectoryServer.registerBaseDN(dn, this, true);
          serverContext.getBackendConfigManager().registerBaseDN(dn, this, true);
          ccr.addMessage(INFO_SCHEMA_REGISTERED_BASE_DN.get(dn));
        }
        catch (Exception e)
opendj-server-legacy/src/main/java/org/opends/server/backends/TrustStoreBackend.java
@@ -117,6 +117,8 @@
  /** The certificate manager for the trust store. */
  private CertificateManager certificateManager;
  /** The server context. */
  private ServerContext serverContext;
  /**
   * Creates a new backend.  All backend
@@ -138,6 +140,7 @@
  @Override
  public void configureBackend(TrustStoreBackendCfg config, ServerContext serverContext) throws ConfigException
  {
    this.serverContext = serverContext;
    Reject.ifNull(config);
    configuration = config;
  }
@@ -204,7 +207,7 @@
    // Register the trust store base as a private suffix.
    try
    {
      DirectoryServer.registerBaseDN(getBaseDN(), this, true);
      serverContext.getBackendConfigManager().registerBaseDN(getBaseDN(), this, true);
    }
    catch (Exception e)
    {
@@ -302,7 +305,7 @@
    try
    {
      DirectoryServer.deregisterBaseDN(getBaseDN());
      serverContext.getBackendConfigManager().deregisterBaseDN(getBaseDN());
    }
    catch (Exception e)
    {
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/BackendImpl.java
@@ -198,7 +198,7 @@
    {
      try
      {
        DirectoryServer.registerBaseDN(dn, this, false);
        serverContext.getBackendConfigManager().registerBaseDN(dn, this, false);
      }
      catch (Exception e)
      {
@@ -224,7 +224,7 @@
    {
      try
      {
        DirectoryServer.deregisterBaseDN(dn);
        serverContext.getBackendConfigManager().deregisterBaseDN(dn);
      }
      catch (Exception e)
      {
@@ -862,7 +862,7 @@
      if (!newBaseDNs.contains(baseDN))
      {
        // The base DN was deleted.
        DirectoryServer.deregisterBaseDN(baseDN);
        serverContext.getBackendConfigManager().deregisterBaseDN(baseDN);
        EntryContainer ec = rootContainer.unregisterEntryContainer(baseDN);
        ec.close();
        ec.delete(txn);
@@ -881,7 +881,7 @@
          // The base DN was added.
          EntryContainer ec = rootContainer.openEntryContainer(baseDN, txn, AccessMode.READ_WRITE);
          rootContainer.registerEntryContainer(baseDN, ec);
          DirectoryServer.registerBaseDN(baseDN, this, false);
          serverContext.getBackendConfigManager().registerBaseDN(baseDN, this, false);
        }
        catch (Exception e)
        {
opendj-server-legacy/src/main/java/org/opends/server/backends/task/TaskBackend.java
@@ -227,7 +227,7 @@
    // Register the task base as a private suffix.
    try
    {
      DirectoryServer.registerBaseDN(taskRootDN, this, true);
      serverContext.getBackendConfigManager().registerBaseDN(taskRootDN, this, true);
    }
    catch (Exception e)
    {
@@ -267,7 +267,7 @@
    try
    {
      DirectoryServer.deregisterBaseDN(taskRootDN);
      serverContext.getBackendConfigManager().deregisterBaseDN(taskRootDN);
    }
    catch (Exception e)
    {
opendj-server-legacy/src/main/java/org/opends/server/core/BackendConfigManager.java
@@ -20,11 +20,9 @@
import static org.forgerock.util.Reject.ifNull;
import static org.opends.messages.ConfigMessages.*;
import static org.opends.messages.CoreMessages.*;
import static org.opends.server.api.LocalBackend.asLocalBackend;
import static org.opends.server.core.DirectoryServer.*;
import static org.opends.server.util.StaticUtils.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
@@ -35,6 +33,10 @@
import java.util.Set;
import java.util.TreeMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.i18n.slf4j.LocalizedLogger;
@@ -51,9 +53,10 @@
import org.forgerock.opendj.server.config.server.RootCfg;
import org.opends.server.api.LocalBackend;
import org.opends.server.api.Backend;
import org.opends.server.api.BackendInitializationListener;
import org.opends.server.api.LocalBackendInitializationListener;
import org.opends.server.backends.ConfigurationBackend;
import org.opends.server.config.ConfigConstants;
import org.opends.server.monitors.LocalBackendMonitor;
import org.opends.server.types.DirectoryException;
import org.opends.server.types.Entry;
import org.opends.server.types.InitializationException;
@@ -72,11 +75,23 @@
{
  private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
  /** The mapping beetwen backends IDs and local backend implementations. */
  private final Map<String, LocalBackend<?>> localBackends = new ConcurrentHashMap<>();
  /** The mapping between configuration entry DNs and their corresponding backend implementations. */
  private final ConcurrentHashMap<DN, Backend<? extends BackendCfg>> registeredBackends = new ConcurrentHashMap<>();
  private final Map<DN, Backend<? extends BackendCfg>> registeredBackends = new ConcurrentHashMap<>();
  /** The set of local backend initialization listeners. */
  private final Set<LocalBackendInitializationListener> initializationListeners = new CopyOnWriteArraySet<>();
  private final ServerContext serverContext;
  private final BaseDnRegistry localBackendsRegistry;
  /** Lock to protect reads of the backend maps. */
  private final ReadLock readLock;
  /** Lock to protect updates of the backends maps. */
  private final WriteLock writeLock;
  /**
   * Creates a new instance of this backend config manager.
   *
@@ -87,6 +102,9 @@
  {
    this.serverContext = serverContext;
    this.localBackendsRegistry = new BaseDnRegistry();
    ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
    readLock = lock.readLock();
    writeLock = lock.writeLock();
  }
  /**
@@ -165,7 +183,7 @@
      {
        continue;
      }
      if (DirectoryServer.hasBackend(backendID))
      if (hasLocalBackend(backendID))
      {
        // Skip this backend if it is already initialized and registered as available.
        continue;
@@ -236,9 +254,30 @@
  private void setLocalBackendWritabilityMode(Backend<?> backend, BackendCfg backendCfg)
  {
    LocalBackend<?> localBackend = asLocalBackend(backend);
    LocalBackendCfg localCfg = (LocalBackendCfg) backendCfg;
    localBackend.setWritabilityMode(toWritabilityMode(localCfg.getWritabilityMode()));
    if (backend instanceof LocalBackend)
    {
      LocalBackend<?> localBackend = (LocalBackend<?>) backend;
      LocalBackendCfg localCfg = (LocalBackendCfg) backendCfg;
      localBackend.setWritabilityMode(toWritabilityMode(localCfg.getWritabilityMode()));
    }
  }
  /**
   * Returns the provided backend instance as a LocalBackend.
   *
   * @param backend
   *            A backend
   * @return a local backend
   * @throws IllegalArgumentException
   *            If the provided backend is not a LocalBackend
   */
  public static LocalBackend<?> asLocalBackend(Backend<?> backend)
  {
    if (backend instanceof LocalBackend)
    {
      return (LocalBackend<?>) backend;
    }
    throw new IllegalArgumentException("Backend " + backend.getBackendID() + " is not a local backend");
  }
  /**
@@ -300,13 +339,23 @@
  }
  /**
   * Returns the collection of all backends.
   * Returns the set of all backends.
   *
   * @return all backends
   */
  public Collection<Backend<?>> getAllBackends()
  public Set<Backend<?>> getAllBackends()
  {
    return new ArrayList<Backend<?>>(registeredBackends.values());
    return new HashSet<Backend<?>>(registeredBackends.values());
  }
  /**
   * Returns the set of local backends.
   *
   * @return the local backends
   */
  public Set<LocalBackend<?>> getLocalBackends()
  {
    return new HashSet<LocalBackend<?>>(localBackends.values());
  }
  /**
@@ -338,7 +387,32 @@
  }
  /**
   * Retrieves the set of subordinate backends that of the backend that corresponds to provided base DN.
   * Retrieves a local backend provided its identifier.
   *
   * @param backendId
   *          Identifier of the backend
   * @return the local backend, or {@code null} if there is no local backend registered with the
   *            specified id.
   */
  public LocalBackend<?> getLocalBackend(String backendId)
  {
    return localBackends.get(backendId);
  }
  /**
   * Indicates whether the local backend with the provided id exists.
   *
   * @param backendID
   *          The backend ID for which to make the determination.
   * @return {@code true} if a backend with the specified backend ID exists, {@code false} otherwise
   */
  public boolean hasLocalBackend(String backendID)
  {
    return localBackends.containsKey(backendID);
  }
  /**
   * Retrieves the set of subordinate backends of the backend that corresponds to provided base DN.
   *
   * @param baseDN
   *          The base DN for which to retrieve the subordinates backends.
@@ -435,6 +509,61 @@
  }
  /**
   * Registers a local backend.
   *
   * @param backend
   *          The backend to register with the server.
   *          Neither the backend nor its backend ID may be null.
   * @throws DirectoryException
   *           If the backend ID for the provided backend conflicts with the backend ID of an
   *           existing backend.
   */
  public void registerLocalBackend(LocalBackend<?> backend) throws DirectoryException
  {
    ifNull(backend);
    String backendID = backend.getBackendID();
    ifNull(backendID);
    writeLock.lock();
    try
    {
      if (localBackends.containsKey(backendID))
      {
        LocalizableMessage message = ERR_REGISTER_BACKEND_ALREADY_EXISTS.get(backendID);
        throw new DirectoryException(ResultCode.UNWILLING_TO_PERFORM, message);
      }
      localBackends.put(backendID, backend);
      for (String oid : backend.getSupportedControls())
      {
        registerSupportedControl(oid);
      }
      for (String oid : backend.getSupportedFeatures())
      {
        registerSupportedFeature(oid);
      }
      LocalBackendMonitor monitor = new LocalBackendMonitor(backend);
      monitor.initializeMonitorProvider(null);
      backend.setBackendMonitor(monitor);
      registerMonitorProvider(monitor);
    }
    finally {
      writeLock.unlock();
    }
  }
  /**
   * Registers a local backend initialization listener.
   *
   * @param  listener  The listener to register.
   */
  public void registerBackendInitializationListener(LocalBackendInitializationListener listener)
  {
    initializationListeners.add(listener);
  }
  /**
   * Deregisters the provided base DN.
   *
   * @param baseDN
@@ -451,6 +580,42 @@
    }
  }
  /**
   * Deregisters a local backend initialization listener.
   *
   * @param  listener  The listener to deregister.
   */
  public void deregisterBackendInitializationListener(LocalBackendInitializationListener listener)
  {
    initializationListeners.remove(listener);
  }
  /**
   * Deregisters a local backend.
   *
   * @param backend
   *          The backend to deregister with the server. It must not be {@code null}.
   */
  public void deregisterLocalBackend(LocalBackend<?> backend)
  {
    ifNull(backend);
    writeLock.lock();
    try
    {
      localBackends.remove(backend.getBackendID());
      LocalBackendMonitor monitor = backend.getBackendMonitor();
      if (monitor != null)
      {
        deregisterMonitorProvider(monitor);
        monitor.finalizeMonitorProvider();
        backend.setBackendMonitor(null);
      }
    }
    finally {
      writeLock.unlock();
    }
  }
  @Override
  public boolean isConfigurationChangeAcceptable(
       BackendCfg configEntry,
@@ -672,14 +837,14 @@
    if (backend instanceof LocalBackend<?>)
    {
      LocalBackend<?> localBackend = (LocalBackend<?>) backend;
      for (BackendInitializationListener listener : getBackendInitializationListeners())
      for (LocalBackendInitializationListener listener : initializationListeners)
      {
        listener.performBackendPreInitializationProcessing(localBackend);
      }
      try
      {
        DirectoryServer.registerBackend(localBackend);
        registerLocalBackend(localBackend);
      }
      catch (Exception e)
      {
@@ -695,7 +860,7 @@
        return false;
      }
      for (BackendInitializationListener listener : getBackendInitializationListeners())
      for (LocalBackendInitializationListener listener : initializationListeners)
      {
        listener.performBackendPostInitializationProcessing(localBackend);
      }
@@ -718,7 +883,7 @@
    // See if the entry contains an attribute that specifies the backend ID.  If
    // it does not, then skip it.
    String backendID = configEntry.getBackendId();
    if (DirectoryServer.hasBackend(backendID))
    if (hasLocalBackend(backendID))
    {
      unacceptableReason.add(WARN_CONFIG_BACKEND_DUPLICATE_BACKEND_ID.get(backendDN, backendID));
      return false;
@@ -809,7 +974,7 @@
    // See if the entry contains an attribute that specifies the backend ID.  If
    // it does not, then skip it.
    String backendID = cfg.getBackendId();
    if (DirectoryServer.hasBackend(backendID))
    if (hasLocalBackend(backendID))
    {
      LocalizableMessage message = WARN_CONFIG_BACKEND_DUPLICATE_BACKEND_ID.get(backendDN, backendID);
      logger.warn(message);
@@ -976,7 +1141,7 @@
    if (backend instanceof LocalBackend<?>)
    {
      LocalBackend<?> localBackend = (LocalBackend<?>) backend;
      for (BackendInitializationListener listener : getBackendInitializationListeners())
      for (LocalBackendInitializationListener listener : initializationListeners)
      {
        listener.performBackendPreFinalizationProcessing(localBackend);
      }
@@ -984,7 +1149,7 @@
      registeredBackends.remove(backendDN);
      DirectoryServer.deregisterBackend(localBackend);
      for (BackendInitializationListener listener : getBackendInitializationListeners())
      for (LocalBackendInitializationListener listener : initializationListeners)
      {
        listener.performBackendPostFinalizationProcessing(localBackend);
      }
@@ -994,6 +1159,52 @@
    }
  }
  /** Shutdown all local backends. */
  public void shutdownLocalBackends()
  {
    for (LocalBackend<?> backend : localBackends.values())
    {
      try
      {
        for (LocalBackendInitializationListener listener : initializationListeners)
        {
          listener.performBackendPreFinalizationProcessing(backend);
        }
        backend.finalizeBackend();
        for (LocalBackendInitializationListener listener : initializationListeners)
        {
          listener.performBackendPostFinalizationProcessing(backend);
        }
        // Remove the shared lock for this backend.
        try
        {
          String lockFile = LockFileManager.getBackendLockFileName(backend);
          StringBuilder failureReason = new StringBuilder();
          if (!LockFileManager.releaseLock(lockFile, failureReason))
          {
            logger.warn(WARN_SHUTDOWN_CANNOT_RELEASE_SHARED_BACKEND_LOCK, backend.getBackendID(), failureReason);
            // FIXME -- Do we need to send an admin alert?
          }
        }
        catch (Exception e2)
        {
          logger.traceException(e2);
          logger.warn(WARN_SHUTDOWN_CANNOT_RELEASE_SHARED_BACKEND_LOCK, backend.getBackendID(),
              stackTraceToSingleLineString(e2));
          // FIXME -- Do we need to send an admin alert?
        }
      }
      catch (Exception e)
      {
        logger.traceException(e);
      }
    }
  }
  /**
   * Registry for maintaining the set of registered base DN's, associated local backends
   * and naming context information.
opendj-server-legacy/src/main/java/org/opends/server/core/DirectoryServer.java
@@ -17,7 +17,6 @@
package org.opends.server.core;
import static com.forgerock.opendj.cli.CommonArguments.*;
import static org.forgerock.util.Reject.*;
import static org.opends.messages.CoreMessages.*;
import static org.opends.messages.ToolMessages.*;
@@ -36,7 +35,6 @@
import java.lang.management.ManagementFactory;
import java.net.InetAddress;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
@@ -49,7 +47,6 @@
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
@@ -87,7 +84,6 @@
import org.opends.server.api.AlertHandler;
import org.opends.server.api.AuthenticationPolicy;
import org.opends.server.api.LocalBackend;
import org.opends.server.api.BackendInitializationListener;
import org.opends.server.api.BackupTaskListener;
import org.opends.server.api.CertificateMapper;
import org.opends.server.api.ClientConnection;
@@ -121,6 +117,7 @@
import org.opends.server.config.JMXMBean;
import org.opends.server.controls.PasswordPolicyErrorType;
import org.opends.server.controls.PasswordPolicyResponseControl;
import org.opends.server.core.BackendConfigManager.BackendAndName;
import org.opends.server.crypto.CryptoManagerImpl;
import org.opends.server.crypto.CryptoManagerSync;
import org.opends.server.extensions.DiskSpaceMonitor;
@@ -135,7 +132,6 @@
import org.opends.server.loggers.RotationPolicy;
import org.opends.server.loggers.TextErrorLogPublisher;
import org.opends.server.loggers.TextWriter;
import org.opends.server.monitors.BackendMonitor;
import org.opends.server.monitors.ConnectionHandlerMonitor;
import org.opends.server.protocols.internal.InternalClientConnection;
import org.opends.server.protocols.internal.InternalConnectionHandler;
@@ -417,8 +413,6 @@
  private List<ServerShutdownListener> shutdownListeners;
  /** The set of synchronization providers that have been registered with the Directory Server. */
  private List<SynchronizationProvider<SynchronizationProviderCfg>> synchronizationProviders;
  /** The set of backend initialization listeners registered with the Directory Server. */
  private Set<BackendInitializationListener> backendInitializationListeners;
  /** The set of root DNs registered with the Directory Server. */
  private Set<DN> rootDNs;
@@ -580,9 +574,6 @@
  /** The synchronization provider configuration manager for the Directory Server. */
  private SynchronizationProviderConfigManager synchronizationProviderConfigManager;
  /** The set of backends registered with the server. */
  private TreeMap<String, LocalBackend<?>> backends;
  /** The set of supported controls registered with the Directory Server. */
  private final TreeSet<String> supportedControls = newTreeSet(
      OID_LDAP_ASSERTION,
@@ -1061,7 +1052,7 @@
    }
    @Override
    public BackendConfigManager getBackendManager()
    public BackendConfigManager getBackendConfigManager()
    {
      return directoryServer.backendConfigManager;
    }
@@ -1215,8 +1206,6 @@
      directoryServer.defaultPasswordPolicyDN = null;
      directoryServer.defaultPasswordPolicy = null;
      directoryServer.monitorProviders = new ConcurrentHashMap<>();
      directoryServer.backends = new TreeMap<>();
      directoryServer.backendInitializationListeners = new CopyOnWriteArraySet<>();
      directoryServer.initializationCompletedListeners = new CopyOnWriteArrayList<>();
      directoryServer.shutdownListeners = new CopyOnWriteArrayList<>();
      directoryServer.synchronizationProviders = new CopyOnWriteArrayList<>();
@@ -1497,6 +1486,8 @@
      new AlertHandlerConfigManager(serverContext).initializeAlertHandlers();
      backendConfigManager = new BackendConfigManager(serverContext);
      // Initialize the default entry cache. We have to have one before
      // <CODE>initializeRootAndAdminDataBackends()</CODE> method kicks in further down.
      entryCacheConfigManager = new EntryCacheConfigManager(serverContext);
@@ -1745,48 +1736,33 @@
  }
  /**
   * Retrieves the set of backend initialization listeners that have been
   * registered with the Directory Server.  The contents of the returned set
   * must not be altered.
   *
   * @return  The set of backend initialization listeners that have been
   *          registered with the Directory Server.
   */
  public static Set<BackendInitializationListener>
                     getBackendInitializationListeners()
  {
    return directoryServer.backendInitializationListeners;
  }
  /**
   * Registers the provided backend initialization listener with the Directory
   * Registers the provided local backend initialization listener with the Directory
   * Server.
   *
   * @param  listener  The backend initialization listener to register with the
   * @param  listener  The local backend initialization listener to register with the
   *                   Directory Server.
   */
  public static void registerBackendInitializationListener(
                          BackendInitializationListener listener)
                          LocalBackendInitializationListener listener)
  {
    directoryServer.backendInitializationListeners.add(listener);
    directoryServer.backendConfigManager.registerBackendInitializationListener(listener);
  }
  /**
   * Deregisters the provided backend initialization listener with the Directory
   * Deregisters the provided local backend initialization listener with the Directory
   * Server.
   *
   * @param  listener  The backend initialization listener to deregister with
   *                   the Directory Server.
   */
  public static void deregisterBackendInitializationListener(
                          BackendInitializationListener listener)
                          LocalBackendInitializationListener listener)
  {
    directoryServer.backendInitializationListeners.remove(listener);
    directoryServer.backendConfigManager.deregisterBackendInitializationListener(listener);
  }
  private void initializeRootAndAdminDataBackends() throws ConfigException, InitializationException
  {
    backendConfigManager = new BackendConfigManager(serverContext);
    backendConfigManager.initializeBackendConfig(Arrays.asList("adminRoot", "ads-truststore"));
    RootDSEBackendCfg rootDSECfg;
@@ -3391,15 +3367,15 @@
  }
  /**
   * Retrieves the set of backends that have been registered with the Directory
   * Server, as a mapping between the backend ID and the corresponding backend.
   * Retrieves the set of local backends that have been registered with the Directory
   * Server.
   *
   * @return  The set of backends that have been registered with the Directory
   * @return  The set of local backends that have been registered with the Directory
   *          Server.
   */
  public static Collection<LocalBackend<?>> getBackends()
  {
    return new ArrayList<>(directoryServer.backends.values());
    return directoryServer.backendConfigManager.getLocalBackends();
  }
  /**
@@ -3412,7 +3388,7 @@
   */
  public static LocalBackend<?> getBackend(String backendID)
  {
    return directoryServer.backends.get(backendID);
    return directoryServer.backendConfigManager.getLocalBackend(backendID);
  }
  /**
@@ -3426,7 +3402,7 @@
   */
  public static boolean hasBackend(String backendID)
  {
    return directoryServer.backends.containsKey(backendID);
    return directoryServer.backendConfigManager.hasLocalBackend(backendID);
  }
  /**
@@ -3443,38 +3419,7 @@
   */
  public static void registerBackend(LocalBackend<?> backend) throws DirectoryException
  {
    ifNull(backend);
    String backendID = backend.getBackendID();
    ifNull(backendID);
    synchronized (directoryServer)
    {
      TreeMap<String, LocalBackend<?>> newBackends = new TreeMap<>(directoryServer.backends);
      if (newBackends.containsKey(backendID))
      {
        LocalizableMessage message = ERR_REGISTER_BACKEND_ALREADY_EXISTS.get(backendID);
        throw new DirectoryException(ResultCode.UNWILLING_TO_PERFORM, message);
      }
      newBackends.put(backendID, backend);
      directoryServer.backends = newBackends;
      for (String oid : backend.getSupportedControls())
      {
        registerSupportedControl(oid);
      }
      for (String oid : backend.getSupportedFeatures())
      {
        registerSupportedFeature(oid);
      }
      BackendMonitor monitor = new BackendMonitor(backend);
      monitor.initializeMonitorProvider(null);
      backend.setBackendMonitor(monitor);
      registerMonitorProvider(monitor);
    }
    directoryServer.backendConfigManager.registerLocalBackend(backend);
  }
  /**
@@ -3487,23 +3432,7 @@
   */
  public static void deregisterBackend(LocalBackend<?> backend)
  {
    ifNull(backend);
    synchronized (directoryServer)
    {
      TreeMap<String, LocalBackend<?>> newBackends = new TreeMap<>(directoryServer.backends);
      newBackends.remove(backend.getBackendID());
      directoryServer.backends = newBackends;
      BackendMonitor monitor = backend.getBackendMonitor();
      if (monitor != null)
      {
        deregisterMonitorProvider(monitor);
        monitor.finalizeMonitorProvider();
        backend.setBackendMonitor(null);
      }
    }
    directoryServer.backendConfigManager.deregisterLocalBackend(backend);
  }
  /**
@@ -3537,50 +3466,8 @@
    {
      return directoryServer.rootDSEBackend;
    }
    return directoryServer.backendConfigManager.getLocalBackend(entryDN).getBackend();
  }
  /**
   * Registers the provided base DN with the server.
   *
   * @param  baseDN     The base DN to register with the server.  It must not be
   *                    {@code null}.
   * @param  backend    The backend responsible for the provided base DN.  It
   *                    must not be {@code null}.
   * @param  isPrivate  Indicates whether the base DN should be considered a
   *                    private base DN.  If the provided base DN is a naming
   *                    context, then this controls whether it is public or
   *                    private.
   *
   * @throws  DirectoryException  If a problem occurs while attempting to
   *                              register the provided base DN.
   */
  public static void registerBaseDN(DN baseDN, LocalBackend<?> backend, boolean isPrivate)
         throws DirectoryException
  {
    ifNull(baseDN, backend);
    synchronized (directoryServer)
    {
      directoryServer.backendConfigManager.registerBaseDN(baseDN, backend, isPrivate);
    }
  }
  /**
   * Deregisters the provided base DN with the server.
   *
   * @param  baseDN     The base DN to deregister with the server.  It must not
   *                    be {@code null}.
   *
   * @throws  DirectoryException  If a problem occurs while attempting to
   *                              deregister the provided base DN.
   */
  public static void deregisterBaseDN(DN baseDN)
         throws DirectoryException
  {
    ifNull(baseDN);
    synchronized(directoryServer) {
      directoryServer.backendConfigManager.deregisterBaseDN(baseDN);
    }
    BackendAndName backend = directoryServer.backendConfigManager.getLocalBackend(entryDN);
    return backend != null ? backend.getBackend() : null;
  }
  /**
@@ -5020,7 +4907,7 @@
      }
    }
    shutdownBackends();
    directoryServer.backendConfigManager.shutdownLocalBackends();
    if (directoryServer.configurationHandler != null) {
      directoryServer.configurationHandler.finalize();
@@ -5075,47 +4962,7 @@
  /** Shutdown directory server backends. */
  public static void shutdownBackends()
  {
    for (LocalBackend<?> backend : directoryServer.backends.values())
    {
      try
      {
        for (BackendInitializationListener listener : getBackendInitializationListeners())
        {
          listener.performBackendPreFinalizationProcessing(backend);
        }
        for (BackendInitializationListener listener : directoryServer.backendInitializationListeners)
        {
          listener.performBackendPostFinalizationProcessing(backend);
        }
        backend.finalizeBackend();
        // Remove the shared lock for this backend.
        try
        {
          String lockFile = LockFileManager.getBackendLockFileName(backend);
          StringBuilder failureReason = new StringBuilder();
          if (! LockFileManager.releaseLock(lockFile, failureReason))
          {
            logger.warn(WARN_SHUTDOWN_CANNOT_RELEASE_SHARED_BACKEND_LOCK, backend.getBackendID(), failureReason);
            // FIXME -- Do we need to send an admin alert?
          }
        }
        catch (Exception e2)
        {
          logger.traceException(e2);
          logger.warn(WARN_SHUTDOWN_CANNOT_RELEASE_SHARED_BACKEND_LOCK,
              backend.getBackendID(), stackTraceToSingleLineString(e2));
          // FIXME -- Do we need to send an admin alert?
        }
      }
      catch (Exception e)
      {
        logger.traceException(e);
      }
    }
    directoryServer.backendConfigManager.shutdownLocalBackends();
  }
  /**
@@ -5143,12 +4990,6 @@
    shutdownHook             = null;
    workQueue                = null;
    if (backends != null)
    {
      backends.clear();
      backends = null;
    }
    if (schemaHandler != null)
    {
      schemaHandler.destroy();
opendj-server-legacy/src/main/java/org/opends/server/core/GroupManager.java
@@ -50,7 +50,7 @@
import org.forgerock.opendj.server.config.server.GroupImplementationCfg;
import org.forgerock.opendj.server.config.server.RootCfg;
import org.opends.server.api.LocalBackend;
import org.opends.server.api.BackendInitializationListener;
import org.opends.server.api.LocalBackendInitializationListener;
import org.opends.server.api.DITCacheMap;
import org.opends.server.api.Group;
import org.opends.server.api.plugin.InternalDirectoryServerPlugin;
@@ -95,7 +95,7 @@
       implements ConfigurationChangeListener<GroupImplementationCfg>,
                  ConfigurationAddListener<GroupImplementationCfg>,
                  ConfigurationDeleteListener<GroupImplementationCfg>,
                  BackendInitializationListener
                  LocalBackendInitializationListener
{
  private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
opendj-server-legacy/src/main/java/org/opends/server/core/ServerContext.java
@@ -141,5 +141,5 @@
   *
   * @return backend manager
   */
  BackendConfigManager getBackendManager();
  BackendConfigManager getBackendConfigManager();
}
opendj-server-legacy/src/main/java/org/opends/server/core/SubentryManager.java
@@ -34,7 +34,7 @@
import org.forgerock.opendj.ldap.ResultCode;
import org.forgerock.opendj.ldap.SearchScope;
import org.opends.server.api.LocalBackend;
import org.opends.server.api.BackendInitializationListener;
import org.opends.server.api.LocalBackendInitializationListener;
import org.opends.server.api.ClientConnection;
import org.opends.server.api.DITCacheMap;
import org.opends.server.api.SubentryChangeListener;
@@ -86,7 +86,7 @@
 * in all cases, then we will need an alternate strategy.
 */
public class SubentryManager extends InternalDirectoryServerPlugin
        implements BackendInitializationListener
        implements LocalBackendInitializationListener
{
  private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
opendj-server-legacy/src/main/java/org/opends/server/crypto/CryptoManagerSync.java
@@ -43,7 +43,7 @@
import org.forgerock.opendj.ldap.schema.ObjectClass;
import org.opends.admin.ads.ADSContext;
import org.opends.server.api.LocalBackend;
import org.opends.server.api.BackendInitializationListener;
import org.opends.server.api.LocalBackendInitializationListener;
import org.opends.server.api.plugin.InternalDirectoryServerPlugin;
import org.opends.server.api.plugin.PluginResult.PostResponse;
import org.opends.server.config.ConfigConstants;
@@ -73,7 +73,7 @@
 * from the admin data branch to the crypto manager secret-key cache.
 */
public class CryptoManagerSync extends InternalDirectoryServerPlugin
     implements BackendInitializationListener
     implements LocalBackendInitializationListener
{
  /** The debug log tracer for this object. */
  private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
opendj-server-legacy/src/main/java/org/opends/server/extensions/DefaultEntryCache.java
@@ -26,7 +26,7 @@
import org.forgerock.opendj.config.server.ConfigurationChangeListener;
import org.forgerock.opendj.server.config.server.EntryCacheCfg;
import org.opends.server.api.LocalBackend;
import org.opends.server.api.BackendInitializationListener;
import org.opends.server.api.LocalBackendInitializationListener;
import org.opends.server.api.EntryCache;
import org.opends.server.api.MonitorData;
import org.opends.server.core.DirectoryServer;
@@ -45,7 +45,7 @@
public class DefaultEntryCache
       extends EntryCache<EntryCacheCfg>
       implements ConfigurationChangeListener<EntryCacheCfg>,
       BackendInitializationListener
       LocalBackendInitializationListener
{
  private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
opendj-server-legacy/src/main/java/org/opends/server/replication/plugin/LDAPReplicationDomain.java
@@ -80,7 +80,7 @@
import org.opends.server.api.AlertGenerator;
import org.opends.server.api.LocalBackend;
import org.opends.server.api.LocalBackend.BackendOperation;
import org.opends.server.api.BackendInitializationListener;
import org.opends.server.api.LocalBackendInitializationListener;
import org.opends.server.api.DirectoryThread;
import org.opends.server.api.MonitorData;
import org.opends.server.api.ServerShutdownListener;
@@ -174,7 +174,7 @@
 */
public final class LDAPReplicationDomain extends ReplicationDomain
       implements ConfigurationChangeListener<ReplicationDomainCfg>,
                  AlertGenerator, BackendInitializationListener, ServerShutdownListener
                  AlertGenerator, LocalBackendInitializationListener, ServerShutdownListener
{
  /**
   * Set of attributes that will return all the user attributes and the
opendj-server-legacy/src/main/java/org/opends/server/workflowelement/localbackend/LocalBackendWorkflowElement.java
@@ -762,7 +762,7 @@
  private static BackendConfigManager getBackendManager()
  {
    return DirectoryServer.getInstance().getServerContext().getBackendManager();
    return DirectoryServer.getInstance().getServerContext().getBackendConfigManager();
  }
  /**
opendj-server-legacy/src/test/java/org/opends/server/TestCaseUtils.java
@@ -90,6 +90,7 @@
import org.opends.server.core.AddOperation;
import org.opends.server.core.DeleteOperation;
import org.opends.server.core.DirectoryServer;
import org.opends.server.core.ServerContext;
import org.opends.server.loggers.AccessLogPublisher;
import org.opends.server.loggers.AccessLogger;
import org.opends.server.loggers.DebugLogger;
@@ -812,6 +813,17 @@
    DirectoryServer.getInstance().getServerContext().getSchemaHandler().updateSchema(schemaBeforeStartingFakeServer);
  }
  /** Returns the server context. */
  public static ServerContext getServerContext()
  {
    ServerContext serverContext = DirectoryServer.getInstance().getServerContext();
    if (serverContext == null)
    {
      throw new RuntimeException("Server context is null");
    }
    return serverContext;
  }
  /**
   * Shut down the server. This should only be called at the end of the test
   * suite and not by any unit tests.
@@ -877,14 +889,15 @@
    // is re-enabled, a new backend object is in fact created and old reference
    // to memory backend must be invalidated. So to prevent this problem, we
    // retrieve the memory backend reference each time before cleaning it.
    MemoryBackend memoryBackend =
        (MemoryBackend)DirectoryServer.getBackend(backendID);
    MemoryBackend memoryBackend = (MemoryBackend) getServerContext().getBackendConfigManager()
        .getLocalBackend(backendID);
    if (memoryBackend == null)
    {
      memoryBackend = new MemoryBackend();
      memoryBackend.setBackendID(backendID);
      memoryBackend.setBaseDNs(baseDN);
      memoryBackend.configureBackend(null, getServerContext());
      memoryBackend.openBackend();
      DirectoryServer.registerBackend(memoryBackend);
    }
opendj-server-legacy/src/test/java/org/opends/server/backends/ChangelogBackendTestCase.java
@@ -1534,6 +1534,7 @@
      memoryBackend = new MemoryBackend();
      memoryBackend.setBackendID(backendId);
      memoryBackend.setBaseDNs(baseDN);
      memoryBackend.configureBackend(null, getServerContext());
      memoryBackend.openBackend();
      DirectoryServer.registerBackend(memoryBackend);
    }
opendj-server-legacy/src/test/java/org/opends/server/core/BackendConfigManagerTestCase.java
@@ -88,7 +88,8 @@
  @Test(expectedExceptions = { DirectoryException.class })
  public void testDeregisterNonExistentBaseDN() throws Exception
  {
    DirectoryServer.deregisterBaseDN(DN.valueOf("o=unregistered"));
    DirectoryServer.getInstance().getServerContext().getBackendConfigManager()
      .deregisterBaseDN(DN.valueOf("o=unregistered"));
  }
@@ -179,19 +180,19 @@
    Entry backendEntry = createBackendEntry(backendID, false, baseDN);
    processAdd(backendEntry);
    assertNull(DirectoryServer.getBackend(backendID));
    assertNull(getLocalBackend(backendID));
    assertFalse(DirectoryServer.isNamingContext(baseDN));
    // Modify the backend to enable it.
    enableBackend(backendEntry, true);
    LocalBackend<?> backend = DirectoryServer.getBackend(backendID);
    LocalBackend<?> backend = getLocalBackend(backendID);
    assertBackend(baseDN, backend);
    createEntry(baseDN, backend);
    // Modify the backend to disable it.
    enableBackend(backendEntry, false);
    assertNull(DirectoryServer.getBackend(backendID));
    assertNull(getLocalBackend(backendID));
    assertFalse(DirectoryServer.entryExists(baseDN));
    assertFalse(DirectoryServer.isNamingContext(baseDN));
@@ -201,6 +202,11 @@
    assertEquals(deleteOperation.getResultCode(), ResultCode.SUCCESS);
  }
  private LocalBackend<?> getLocalBackend(String backendID)
  {
    return getServerContext().getBackendConfigManager().getLocalBackend(backendID);
  }
  /**
opendj-server-legacy/src/test/java/org/opends/server/types/TestDN.java
@@ -40,7 +40,7 @@
  public Object[][] getNamingContexts() {
    ArrayList<DN> contextList = new ArrayList<>();
    contextList.addAll(DirectoryServer.getPublicNamingContexts().keySet());
    contextList.addAll(DirectoryServer.getInstance().getServerContext().getBackendManager().
    contextList.addAll(DirectoryServer.getInstance().getServerContext().getBackendConfigManager().
        getPrivateNamingContexts().keySet());
    Object[][] contextArray = new Object[contextList.size()][1];