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];