From 476ab6a2f8e1c5f60321626a27f7d82a008243af Mon Sep 17 00:00:00 2001
From: neil_a_wilson <neil_a_wilson@localhost>
Date: Fri, 17 Aug 2007 00:24:18 +0000
Subject: [PATCH] Provide a new EmbeddedUtils.initializeForClientUse() method that can be used to initialize the proper internal structures so that OpenDS code can be more easily used for client-side applications that could benefit from the code but don't want or need to be running in the same JVM as the server.
---
opends/src/server/org/opends/server/core/DirectoryServer.java | 181 ++++++++++++++++++++++++---------------------
opends/src/server/org/opends/server/util/EmbeddedUtils.java | 15 +++
opends/src/server/org/opends/server/tools/LDAPPasswordModify.java | 4
opends/src/server/org/opends/server/tools/LDAPModify.java | 4
opends/src/server/org/opends/server/tools/LDAPDelete.java | 4
opends/src/server/org/opends/server/tools/LDAPCompare.java | 4
opends/src/server/org/opends/server/tools/LDAPSearch.java | 4
opends/src/server/org/opends/server/tools/dsconfig/DSConfig.java | 5
8 files changed, 124 insertions(+), 97 deletions(-)
diff --git a/opends/src/server/org/opends/server/core/DirectoryServer.java b/opends/src/server/org/opends/server/core/DirectoryServer.java
index dd50131..f844056 100644
--- a/opends/src/server/org/opends/server/core/DirectoryServer.java
+++ b/opends/src/server/org/opends/server/core/DirectoryServer.java
@@ -347,6 +347,9 @@
// Indicates whether the server has been bootstrapped.
private boolean isBootstrapped;
+ // Indicates whether the server has been bootstrapped for client use.
+ private boolean isClientBootstrapped;
+
// Indicates whether the server is currently online.
private boolean isRunning;
@@ -723,6 +726,7 @@
{
environmentConfig = config;
isBootstrapped = false;
+ isClientBootstrapped = false;
isRunning = false;
shuttingDown = false;
lockdownMode = false;
@@ -825,94 +829,103 @@
*/
public static void bootstrapClient()
{
- // Set default values for variables that may be needed during schema
- // processing.
- directoryServer.syntaxEnforcementPolicy = AcceptRejectWarn.REJECT;
+ synchronized (directoryServer)
+ {
+ if (directoryServer.isClientBootstrapped)
+ {
+ return;
+ }
- // Create the server schema and initialize and register a minimal set of
- // matching rules and attribute syntaxes.
- directoryServer.schema = new Schema();
- directoryServer.bootstrapMatchingRules();
- directoryServer.bootstrapAttributeSyntaxes();
+ // Set default values for variables that may be needed during schema
+ // processing.
+ directoryServer.syntaxEnforcementPolicy = AcceptRejectWarn.REJECT;
- // Perform any additional initialization that might be necessary before
- // loading the configuration.
- directoryServer.alertHandlers = new CopyOnWriteArrayList<AlertHandler>();
- directoryServer.passwordStorageSchemes =
- new ConcurrentHashMap<String,PasswordStorageScheme>();
- directoryServer.passwordGenerators =
- new ConcurrentHashMap<DN,PasswordGenerator>();
- directoryServer.authPasswordStorageSchemes =
- new ConcurrentHashMap<String,PasswordStorageScheme>();
- directoryServer.passwordValidators =
- new ConcurrentHashMap<DN,
- PasswordValidator<? extends PasswordValidatorCfg>>();
- directoryServer.accountStatusNotificationHandlers =
- new ConcurrentHashMap<DN,AccountStatusNotificationHandler>();
- directoryServer.rootDNs = new CopyOnWriteArraySet<DN>();
- directoryServer.alternateRootBindDNs = new ConcurrentHashMap<DN,DN>();
- directoryServer.keyManagerProviders =
- new ConcurrentHashMap<DN,KeyManagerProvider>();
- directoryServer.trustManagerProviders =
- new ConcurrentHashMap<DN,TrustManagerProvider>();
- directoryServer.rotationPolicies =
- new ConcurrentHashMap<DN, RotationPolicy>();
- directoryServer.retentionPolicies =
- new ConcurrentHashMap<DN, RetentionPolicy>();
- directoryServer.certificateMappers =
- new ConcurrentHashMap<DN,CertificateMapper>();
- directoryServer.passwordPolicies =
- new ConcurrentHashMap<DN,PasswordPolicyConfig>();
- directoryServer.defaultPasswordPolicyDN = null;
- directoryServer.defaultPasswordPolicyConfig = null;
- directoryServer.monitorProviders =
- new ConcurrentHashMap<String,
- MonitorProvider<? extends MonitorProviderCfg>>();
- directoryServer.backends = new TreeMap<String,Backend>();
- directoryServer.offlineBackendsStateIDs =
- new ConcurrentHashMap<String,Long>();
- directoryServer.backendInitializationListeners =
- new CopyOnWriteArraySet<BackendInitializationListener>();
- directoryServer.baseDNs = new TreeMap<DN,Backend>();
- directoryServer.publicNamingContexts = new TreeMap<DN,Backend>();
- directoryServer.privateNamingContexts = new TreeMap<DN,Backend>();
- directoryServer.changeNotificationListeners =
- new CopyOnWriteArrayList<ChangeNotificationListener>();
- directoryServer.persistentSearches =
- new CopyOnWriteArrayList<PersistentSearch>();
- directoryServer.shutdownListeners =
- new CopyOnWriteArrayList<ServerShutdownListener>();
- directoryServer.synchronizationProviders =
- new CopyOnWriteArrayList<SynchronizationProvider
- <SynchronizationProviderCfg>>();
- directoryServer.supportedControls = new TreeSet<String>();
- directoryServer.supportedFeatures = new TreeSet<String>();
- directoryServer.virtualAttributes =
- new CopyOnWriteArrayList<VirtualAttributeRule>();
- directoryServer.connectionHandlers =
- new CopyOnWriteArrayList<ConnectionHandler>();
- directoryServer.identityMappers =
- new ConcurrentHashMap<DN,IdentityMapper>();
- directoryServer.extendedOperationHandlers =
- new ConcurrentHashMap<String,ExtendedOperationHandler>();
- directoryServer.saslMechanismHandlers =
- new ConcurrentHashMap<String,SASLMechanismHandler>();
- directoryServer.authenticatedUsers = new AuthenticatedUsers();
- directoryServer.offlineSchemaChanges = new LinkedList<Modification>();
- directoryServer.backupTaskListeners =
- new CopyOnWriteArrayList<BackupTaskListener>();
- directoryServer.restoreTaskListeners =
- new CopyOnWriteArrayList<RestoreTaskListener>();
- directoryServer.exportTaskListeners =
- new CopyOnWriteArrayList<ExportTaskListener>();
- directoryServer.importTaskListeners =
- new CopyOnWriteArrayList<ImportTaskListener>();
- directoryServer.allowedTasks = new LinkedHashSet<String>(0);
- directoryServer.disabledPrivileges = new LinkedHashSet<Privilege>(0);
- directoryServer.returnBindErrorMessages = false;
- directoryServer.idleTimeLimit = 0L;
+ // Create the server schema and initialize and register a minimal set of
+ // matching rules and attribute syntaxes.
+ directoryServer.schema = new Schema();
+ directoryServer.bootstrapMatchingRules();
+ directoryServer.bootstrapAttributeSyntaxes();
+
+
+ // Perform any additional initialization that might be necessary before
+ // loading the configuration.
+ directoryServer.alertHandlers = new CopyOnWriteArrayList<AlertHandler>();
+ directoryServer.passwordStorageSchemes =
+ new ConcurrentHashMap<String,PasswordStorageScheme>();
+ directoryServer.passwordGenerators =
+ new ConcurrentHashMap<DN,PasswordGenerator>();
+ directoryServer.authPasswordStorageSchemes =
+ new ConcurrentHashMap<String,PasswordStorageScheme>();
+ directoryServer.passwordValidators =
+ new ConcurrentHashMap<DN,
+ PasswordValidator<? extends PasswordValidatorCfg>>();
+ directoryServer.accountStatusNotificationHandlers =
+ new ConcurrentHashMap<DN,AccountStatusNotificationHandler>();
+ directoryServer.rootDNs = new CopyOnWriteArraySet<DN>();
+ directoryServer.alternateRootBindDNs = new ConcurrentHashMap<DN,DN>();
+ directoryServer.keyManagerProviders =
+ new ConcurrentHashMap<DN,KeyManagerProvider>();
+ directoryServer.trustManagerProviders =
+ new ConcurrentHashMap<DN,TrustManagerProvider>();
+ directoryServer.rotationPolicies =
+ new ConcurrentHashMap<DN, RotationPolicy>();
+ directoryServer.retentionPolicies =
+ new ConcurrentHashMap<DN, RetentionPolicy>();
+ directoryServer.certificateMappers =
+ new ConcurrentHashMap<DN,CertificateMapper>();
+ directoryServer.passwordPolicies =
+ new ConcurrentHashMap<DN,PasswordPolicyConfig>();
+ directoryServer.defaultPasswordPolicyDN = null;
+ directoryServer.defaultPasswordPolicyConfig = null;
+ directoryServer.monitorProviders =
+ new ConcurrentHashMap<String,
+ MonitorProvider<? extends MonitorProviderCfg>>();
+ directoryServer.backends = new TreeMap<String,Backend>();
+ directoryServer.offlineBackendsStateIDs =
+ new ConcurrentHashMap<String,Long>();
+ directoryServer.backendInitializationListeners =
+ new CopyOnWriteArraySet<BackendInitializationListener>();
+ directoryServer.baseDNs = new TreeMap<DN,Backend>();
+ directoryServer.publicNamingContexts = new TreeMap<DN,Backend>();
+ directoryServer.privateNamingContexts = new TreeMap<DN,Backend>();
+ directoryServer.changeNotificationListeners =
+ new CopyOnWriteArrayList<ChangeNotificationListener>();
+ directoryServer.persistentSearches =
+ new CopyOnWriteArrayList<PersistentSearch>();
+ directoryServer.shutdownListeners =
+ new CopyOnWriteArrayList<ServerShutdownListener>();
+ directoryServer.synchronizationProviders =
+ new CopyOnWriteArrayList<SynchronizationProvider
+ <SynchronizationProviderCfg>>();
+ directoryServer.supportedControls = new TreeSet<String>();
+ directoryServer.supportedFeatures = new TreeSet<String>();
+ directoryServer.virtualAttributes =
+ new CopyOnWriteArrayList<VirtualAttributeRule>();
+ directoryServer.connectionHandlers =
+ new CopyOnWriteArrayList<ConnectionHandler>();
+ directoryServer.identityMappers =
+ new ConcurrentHashMap<DN,IdentityMapper>();
+ directoryServer.extendedOperationHandlers =
+ new ConcurrentHashMap<String,ExtendedOperationHandler>();
+ directoryServer.saslMechanismHandlers =
+ new ConcurrentHashMap<String,SASLMechanismHandler>();
+ directoryServer.authenticatedUsers = new AuthenticatedUsers();
+ directoryServer.offlineSchemaChanges = new LinkedList<Modification>();
+ directoryServer.backupTaskListeners =
+ new CopyOnWriteArrayList<BackupTaskListener>();
+ directoryServer.restoreTaskListeners =
+ new CopyOnWriteArrayList<RestoreTaskListener>();
+ directoryServer.exportTaskListeners =
+ new CopyOnWriteArrayList<ExportTaskListener>();
+ directoryServer.importTaskListeners =
+ new CopyOnWriteArrayList<ImportTaskListener>();
+ directoryServer.allowedTasks = new LinkedHashSet<String>(0);
+ directoryServer.disabledPrivileges = new LinkedHashSet<Privilege>(0);
+ directoryServer.returnBindErrorMessages = false;
+ directoryServer.idleTimeLimit = 0L;
+ }
}
diff --git a/opends/src/server/org/opends/server/tools/LDAPCompare.java b/opends/src/server/org/opends/server/tools/LDAPCompare.java
index bdd2438..3940bd8 100644
--- a/opends/src/server/org/opends/server/tools/LDAPCompare.java
+++ b/opends/src/server/org/opends/server/tools/LDAPCompare.java
@@ -47,11 +47,11 @@
import org.opends.server.protocols.ldap.LDAPFilter;
import org.opends.server.protocols.ldap.LDAPMessage;
import org.opends.server.protocols.ldap.ProtocolOp;
-import org.opends.server.core.DirectoryServer;
import org.opends.server.types.NullOutputStream;
import org.opends.server.types.DebugLogLevel;
import org.opends.server.types.LDAPException;
import org.opends.server.util.Base64;
+import org.opends.server.util.EmbeddedUtils;
import org.opends.server.util.PasswordReader;
import org.opends.server.util.args.ArgumentException;
import org.opends.server.util.args.ArgumentParser;
@@ -852,7 +852,7 @@
if (initializeServer)
{
// Bootstrap and initialize directory data structures.
- DirectoryServer.bootstrapClient();
+ EmbeddedUtils.initializeForClientUse();
}
// Connect to the specified host with the supplied userDN and password.
diff --git a/opends/src/server/org/opends/server/tools/LDAPDelete.java b/opends/src/server/org/opends/server/tools/LDAPDelete.java
index 4f25869..1aa3908 100644
--- a/opends/src/server/org/opends/server/tools/LDAPDelete.java
+++ b/opends/src/server/org/opends/server/tools/LDAPDelete.java
@@ -38,7 +38,6 @@
import java.util.LinkedList;
import java.util.concurrent.atomic.AtomicInteger;
-import org.opends.server.core.DirectoryServer;
import org.opends.server.protocols.asn1.ASN1Exception;
import org.opends.server.protocols.asn1.ASN1OctetString;
import org.opends.server.protocols.ldap.DeleteRequestProtocolOp;
@@ -49,6 +48,7 @@
import org.opends.server.types.NullOutputStream;
import org.opends.server.types.DebugLogLevel;
import org.opends.server.types.LDAPException;
+import org.opends.server.util.EmbeddedUtils;
import org.opends.server.util.PasswordReader;
import org.opends.server.util.args.ArgumentException;
import org.opends.server.util.args.ArgumentParser;
@@ -730,7 +730,7 @@
if (initializeServer)
{
// Bootstrap and initialize directory data structures.
- DirectoryServer.bootstrapClient();
+ EmbeddedUtils.initializeForClientUse();
}
// Connect to the specified host with the supplied userDN and password.
diff --git a/opends/src/server/org/opends/server/tools/LDAPModify.java b/opends/src/server/org/opends/server/tools/LDAPModify.java
index 73beb12..afe54d3 100644
--- a/opends/src/server/org/opends/server/tools/LDAPModify.java
+++ b/opends/src/server/org/opends/server/tools/LDAPModify.java
@@ -38,7 +38,6 @@
import java.util.StringTokenizer;
import java.util.concurrent.atomic.AtomicInteger;
-import org.opends.server.core.DirectoryServer;
import org.opends.server.protocols.asn1.ASN1Element;
import org.opends.server.protocols.asn1.ASN1Exception;
import org.opends.server.protocols.asn1.ASN1OctetString;
@@ -67,6 +66,7 @@
import org.opends.server.types.RawModification;
import org.opends.server.util.AddChangeRecordEntry;
import org.opends.server.util.ChangeRecordEntry;
+import org.opends.server.util.EmbeddedUtils;
import org.opends.server.util.LDIFException;
import org.opends.server.util.LDIFReader;
import org.opends.server.util.ModifyChangeRecordEntry;
@@ -1128,7 +1128,7 @@
if (initializeServer)
{
// Bootstrap and initialize directory data structures.
- DirectoryServer.bootstrapClient();
+ EmbeddedUtils.initializeForClientUse();
}
// Connect to the specified host with the supplied userDN and password.
diff --git a/opends/src/server/org/opends/server/tools/LDAPPasswordModify.java b/opends/src/server/org/opends/server/tools/LDAPPasswordModify.java
index 32315cb..a9fcd18 100644
--- a/opends/src/server/org/opends/server/tools/LDAPPasswordModify.java
+++ b/opends/src/server/org/opends/server/tools/LDAPPasswordModify.java
@@ -37,7 +37,6 @@
import org.opends.server.controls.PasswordPolicyErrorType;
import org.opends.server.controls.PasswordPolicyResponseControl;
import org.opends.server.controls.PasswordPolicyWarningType;
-import org.opends.server.core.DirectoryServer;
import org.opends.server.protocols.asn1.ASN1Element;
import org.opends.server.protocols.asn1.ASN1OctetString;
import org.opends.server.protocols.asn1.ASN1Sequence;
@@ -49,6 +48,7 @@
import org.opends.server.protocols.ldap.UnbindRequestProtocolOp;
import org.opends.server.types.DN;
import org.opends.server.types.NullOutputStream;
+import org.opends.server.util.EmbeddedUtils;
import org.opends.server.util.args.ArgumentException;
import org.opends.server.util.args.ArgumentParser;
import org.opends.server.util.args.BooleanArgument;
@@ -535,7 +535,7 @@
// Perform a basic Directory Server bootstrap if appropriate.
if (initializeServer)
{
- DirectoryServer.bootstrapClient();
+ EmbeddedUtils.initializeForClientUse();
}
diff --git a/opends/src/server/org/opends/server/tools/LDAPSearch.java b/opends/src/server/org/opends/server/tools/LDAPSearch.java
index cc854d8..a506cc8 100644
--- a/opends/src/server/org/opends/server/tools/LDAPSearch.java
+++ b/opends/src/server/org/opends/server/tools/LDAPSearch.java
@@ -50,8 +50,8 @@
import org.opends.server.controls.ServerSideSortResponseControl;
import org.opends.server.controls.VLVRequestControl;
import org.opends.server.controls.VLVResponseControl;
-import org.opends.server.core.DirectoryServer;
import org.opends.server.util.Base64;
+import org.opends.server.util.EmbeddedUtils;
import org.opends.server.util.PasswordReader;
import org.opends.server.util.args.ArgumentException;
import org.opends.server.util.args.ArgumentParser;
@@ -1588,7 +1588,7 @@
if (initializeServer)
{
// Bootstrap and initialize directory data structures.
- DirectoryServer.bootstrapClient();
+ EmbeddedUtils.initializeForClientUse();
}
// Connect to the specified host with the supplied userDN and password.
diff --git a/opends/src/server/org/opends/server/tools/dsconfig/DSConfig.java b/opends/src/server/org/opends/server/tools/dsconfig/DSConfig.java
index f8ada12..a3a97eb 100644
--- a/opends/src/server/org/opends/server/tools/dsconfig/DSConfig.java
+++ b/opends/src/server/org/opends/server/tools/dsconfig/DSConfig.java
@@ -51,11 +51,11 @@
import org.opends.server.admin.Tag;
import org.opends.server.admin.client.ManagedObjectDecodingException;
import org.opends.server.admin.client.ManagementContext;
-import org.opends.server.core.DirectoryServer;
import org.opends.server.loggers.debug.DebugTracer;
import org.opends.server.tools.ClientException;
import org.opends.server.types.DebugLogLevel;
import org.opends.server.types.InitializationException;
+import org.opends.server.util.EmbeddedUtils;
import org.opends.server.util.StaticUtils;
import org.opends.server.util.args.ArgumentException;
import org.opends.server.util.args.BooleanArgument;
@@ -210,8 +210,7 @@
*/
public void initializeClientEnvironment() throws InitializationException {
if (environmentInitialized == false) {
- // TODO: do we need to do this?
- DirectoryServer.bootstrapClient();
+ EmbeddedUtils.initializeForClientUse();
// Bootstrap definition classes.
ClassLoaderProvider.getInstance().enable();
diff --git a/opends/src/server/org/opends/server/util/EmbeddedUtils.java b/opends/src/server/org/opends/server/util/EmbeddedUtils.java
index a7ad6e0..0a0ffa4 100644
--- a/opends/src/server/org/opends/server/util/EmbeddedUtils.java
+++ b/opends/src/server/org/opends/server/util/EmbeddedUtils.java
@@ -119,5 +119,20 @@
{
DirectoryServer.restart(className, reason, config);
}
+
+
+
+ /**
+ * Sets up a number of internal server data structures to ensure that they are
+ * properly initialized for use. This is necessary if server libraries are
+ * going to be used without the server running (e.g., to facilitate use in an
+ * LDAP client API, for DN processing, etc.). This will have no effect if the
+ * server has already been initialized for client use.
+ */
+ public static void initializeForClientUse()
+ {
+ DirectoryServer directoryServer = DirectoryServer.getInstance();
+ directoryServer.bootstrapClient();
+ }
}
--
Gitblit v1.10.0