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