From c30a14be35ba387e61b960740f6afc1b9774bb3d Mon Sep 17 00:00:00 2001
From: Jean-Noël Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Mon, 04 Apr 2016 13:38:34 +0000
Subject: [PATCH] Add ConnectionWrapper to replace all uses of InitialLdapContext

---
 opendj-server-legacy/src/main/java/org/opends/server/tools/dsreplication/ReplicationCliMain.java |  491 ++++++++++++++++++++++++++++++++----------------------
 1 files changed, 289 insertions(+), 202 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/dsreplication/ReplicationCliMain.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/dsreplication/ReplicationCliMain.java
index c4d39dd..be6f87a 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/dsreplication/ReplicationCliMain.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/dsreplication/ReplicationCliMain.java
@@ -65,11 +65,16 @@
 import org.forgerock.i18n.LocalizableMessageDescriptor.Arg1;
 import org.forgerock.i18n.LocalizableMessageDescriptor.Arg2;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
+import org.forgerock.opendj.config.ConfigurationFramework;
+import org.forgerock.opendj.config.ManagedObjectNotFoundException;
+import org.forgerock.opendj.config.PropertyException;
+import org.forgerock.opendj.config.server.ConfigException;
 import org.opends.admin.ads.*;
 import org.opends.admin.ads.ADSContext.ADSPropertySyntax;
 import org.opends.admin.ads.ADSContext.AdministratorProperty;
 import org.opends.admin.ads.ADSContext.ServerProperty;
 import org.opends.admin.ads.util.ApplicationTrustManager;
+import org.opends.admin.ads.util.ConnectionWrapper;
 import org.opends.admin.ads.util.OpendsCertificateException;
 import org.opends.admin.ads.util.PreferredConnection;
 import org.opends.admin.ads.util.ServerLoader;
@@ -86,10 +91,6 @@
 import org.opends.quicksetup.installer.PeerNotFoundException;
 import org.opends.quicksetup.installer.offline.OfflineInstaller;
 import org.opends.quicksetup.util.PlainTextProgressMessageFormatter;
-import org.opends.server.admin.*;
-import org.forgerock.opendj.config.client.ManagementContext;
-import org.opends.server.admin.client.ldap.JNDIDirContextAdaptor;
-import org.forgerock.opendj.config.client.ldap.LDAPManagementContext;
 import org.forgerock.opendj.server.config.client.*;
 import org.forgerock.opendj.server.config.meta.ReplicationDomainCfgDefn;
 import org.forgerock.opendj.server.config.meta.ReplicationServerCfgDefn;
@@ -136,7 +137,6 @@
 import static com.forgerock.opendj.cli.Utils.*;
 import static com.forgerock.opendj.util.OperatingSystem.*;
 import static com.forgerock.opendj.cli.CommonArguments.*;
-
 import static java.util.Collections.*;
 import static org.forgerock.util.Utils.*;
 import static org.opends.admin.ads.util.ConnectionUtils.*;
@@ -431,17 +431,14 @@
       // Bootstrap definition classes.
       try
       {
-        if (!ClassLoaderProvider.getInstance().isEnabled())
+        ConfigurationFramework configFramework = ConfigurationFramework.getInstance();
+        if (!configFramework.isInitialized())
         {
-          ClassLoaderProvider.getInstance().enable();
+          configFramework.initialize();
         }
-        // Switch off class name validation in client.
-        ClassPropertyDefinition.setAllowClassValidation(false);
-
-        // Switch off attribute type name validation in client.
-        AttributeTypePropertyDefinition.setCheckSchema(false);
+        configFramework.setIsClient(true);
       }
-      catch (InitializationException ie)
+      catch (ConfigException ie)
       {
         errPrintln(ie.getMessageObject());
         return ERROR_INITIALIZING_ADMINISTRATION_FRAMEWORK;
@@ -1111,6 +1108,12 @@
     return createInitialLdapContextInteracting(ci, isInteractive() && ci.isTrustStoreInMemory());
   }
 
+  private ConnectionWrapper createConnectionInteracting(LDAPConnectionConsoleInteraction ci)
+      throws ClientException
+  {
+    return createConnectionInteracting(ci, isInteractive() && ci.isTrustStoreInMemory());
+  }
+
   private OpendsCertificateException getCertificateRootException(Throwable t)
   {
     while (t != null)
@@ -1124,6 +1127,22 @@
     return null;
   }
 
+  private ConnectionWrapper createConnectionInteracting(LDAPConnectionConsoleInteraction ci,
+      boolean promptForCertificate) throws ClientException
+  {
+    try
+    {
+      InitialLdapContext ctx= createInitialLdapContextInteracting(ci, promptForCertificate);
+      return new ConnectionWrapper(ctx, CliConstants.DEFAULT_LDAP_CONNECT_TIMEOUT, ci.getTrustManager());
+    }
+    catch (NamingException e)
+    {
+      String hostName = getHostNameForLdapUrl(ci.getHostName());
+      Integer portNumber = ci.getPortNumber();
+      throw new ClientException(ReturnCode.CLIENT_SIDE_CONNECT_ERROR, ERR_FAILED_TO_CONNECT.get(hostName, portNumber));
+    }
+  }
+
   /**
    * Creates an Initial LDAP Context interacting with the user if the
    * application is interactive.
@@ -1561,6 +1580,27 @@
     return createAdministrativeContext(uData, bindDn);
   }
 
+  private ConnectionWrapper createAdministrativeConnection(MonoServerReplicationUserData uData)
+  {
+    final String bindDn = getAdministratorDN(uData.getAdminUid());
+    return createAdministrativeConnection(uData, bindDn);
+  }
+
+  private ConnectionWrapper createAdministrativeConnection(MonoServerReplicationUserData uData, final String bindDn)
+  {
+    try
+    {
+      return new ConnectionWrapper(createAdministrativeContext(uData, bindDn),
+          getConnectTimeout(), getTrustManager(sourceServerCI));
+    }
+    catch (NamingException e)
+    {
+      String hostPort = getServerRepresentation(uData.getHostName(), uData.getPort());
+      logger.error(LocalizableMessage.raw("Error when creating connection for:" + hostPort));
+      return null;
+    }
+  }
+
   private InitialLdapContext createAdministrativeContext(MonoServerReplicationUserData uData, final String bindDn)
   {
     try
@@ -1965,11 +2005,11 @@
    */
   private boolean promptIfRequired(PurgeHistoricalUserData uData)
   {
-    InitialLdapContext ctx = null;
+    ConnectionWrapper connWrapper = null;
     try
     {
-      ctx = getInitialLdapContext(uData);
-      if (ctx == null)
+      connWrapper = getConnection(uData);
+      if (connWrapper == null)
       {
         return false;
       }
@@ -1987,7 +2027,7 @@
       List<String> suffixes = argParser.getBaseDNs();
       if (uData.isOnline())
       {
-        checkSuffixesForPurgeHistorical(suffixes, ctx, true);
+        checkSuffixesForPurgeHistorical(suffixes, connWrapper.getLdapContext(), true);
       }
       else
       {
@@ -2001,7 +2041,7 @@
 
       if (uData.isOnline())
       {
-        List<? extends TaskEntry> taskEntries = getAvailableTaskEntries(ctx);
+        List<? extends TaskEntry> taskEntries = getAvailableTaskEntries(connWrapper.getLdapContext());
 
         TaskScheduleInteraction interaction =
             new TaskScheduleInteraction(uData.getTaskSchedule(), argParser.taskArgs, this,
@@ -2022,7 +2062,21 @@
     }
     finally
     {
-      close(ctx);
+      close(connWrapper);
+    }
+  }
+
+  private ConnectionWrapper getConnection(PurgeHistoricalUserData uData)
+  {
+    try
+    {
+      InitialLdapContext ctx = getInitialLdapContext(uData);
+      return new ConnectionWrapper(ctx, sourceServerCI.getConnectTimeout(), sourceServerCI.getTrustManager());
+    }
+    catch (NamingException ce)
+    {
+      logger.warn(LocalizableMessage.raw("An error occured " + ce));
+      return null;
     }
   }
 
@@ -2099,10 +2153,10 @@
       InitialLdapContext ctx)
   {
     List<TaskEntry> taskEntries = new ArrayList<>();
-    List<OpenDsException> exceptions = new ArrayList<>();
+    List<Exception> exceptions = new ArrayList<>();
     ConfigFromDirContext cfg = new ConfigFromDirContext();
     cfg.updateTaskInformation(ctx, exceptions, taskEntries);
-    for (OpenDsException ode : exceptions)
+    for (Exception ode : exceptions)
     {
       logger.warn(LocalizableMessage.raw("Error retrieving task entries: "+ode, ode));
     }
@@ -2163,7 +2217,7 @@
      */
     sourceServerCI.initializeGlobalArguments(host1, port1, adminUid, bindDn1, pwd,
         pwdFile == null ? null : new LinkedHashMap<String, String>(pwdFile));
-    InitialLdapContext ctx1 = null;
+    ConnectionWrapper ctx1 = null;
 
     while (ctx1 == null && !cancelled)
     {
@@ -2187,7 +2241,7 @@
         bindDn1 = sourceServerCI.getBindDN();
         pwd1 = sourceServerCI.getBindPassword();
 
-        ctx1 = createInitialLdapContextInteracting(sourceServerCI);
+        ctx1 = createConnectionInteracting(sourceServerCI);
         if (ctx1 == null)
         {
           cancelled = true;
@@ -2227,7 +2281,7 @@
       if (replicationServer1Configured && !configureReplicationServer1)
       {
         final LocalizableMessage msg =
-            INFO_REPLICATION_SERVER_CONFIGURED_WARNING_PROMPT.get(getHostPort(ctx1), repPort1);
+            INFO_REPLICATION_SERVER_CONFIGURED_WARNING_PROMPT.get(getHostPort(ctx1.getLdapContext()), repPort1);
         if (!askConfirmation(msg, false))
         {
           cancelled = true;
@@ -2335,7 +2389,7 @@
       // eventually admin authentication data.
       if (!cancelled)
       {
-        AtomicReference<InitialLdapContext> aux = new AtomicReference<>(ctx1);
+        AtomicReference<ConnectionWrapper> aux = new AtomicReference<>(ctx1);
         cancelled = !loadADSAndAcceptCertificates(sourceServerCI, aux, uData, true);
         ctx1 = aux.get();
       }
@@ -2405,7 +2459,7 @@
           pwdFile == null ? null : new LinkedHashMap<String, String>(pwdFile));
       destinationServerCI.setUseAdminOrBindDn(true);
     }
-    InitialLdapContext ctx2 = null;
+    ConnectionWrapper ctx2 = null;
 
     while (ctx2 == null && !cancelled)
     {
@@ -2441,7 +2495,7 @@
 
         if (!error)
         {
-          ctx2 = createInitialLdapContextInteracting(destinationServerCI, true);
+          ctx2 = createConnectionInteracting(destinationServerCI, true);
           if (ctx2 == null)
           {
             cancelled = true;
@@ -2496,7 +2550,7 @@
       if (replicationServer2Configured && !configureReplicationServer2)
       {
         final LocalizableMessage prompt =
-            INFO_REPLICATION_SERVER_CONFIGURED_WARNING_PROMPT.get(getHostPort(ctx2), repPort2);
+            INFO_REPLICATION_SERVER_CONFIGURED_WARNING_PROMPT.get(getHostPort(ctx2.getLdapContext()), repPort2);
         if (!askConfirmation(prompt, false))
         {
           cancelled = true;
@@ -2613,7 +2667,7 @@
       // to load the ADS to ask the user to accept the certificates.
       if (!cancelled)
       {
-        AtomicReference<InitialLdapContext> aux = new AtomicReference<>(ctx2);
+        AtomicReference<ConnectionWrapper> aux = new AtomicReference<>(ctx2);
         cancelled = !loadADSAndAcceptCertificates(destinationServerCI, aux, uData, false);
         ctx2 = aux.get();
       }
@@ -2744,7 +2798,7 @@
     int port = argParser.getPortToDisable();
 
     /* Try to connect to the server. */
-    InitialLdapContext ctx = null;
+    ConnectionWrapper ctx = null;
 
     while (ctx == null && !cancelled)
     {
@@ -2758,7 +2812,7 @@
         adminUid = sourceServerCI.getProvidedAdminUID();
         adminPwd = sourceServerCI.getBindPassword();
 
-        ctx = createInitialLdapContextInteracting(sourceServerCI);
+        ctx = createConnectionInteracting(sourceServerCI);
         if (ctx == null)
         {
           cancelled = true;
@@ -2795,7 +2849,7 @@
       // disableReplication(DisableReplicationUserData) method.  Here we have
       // to load the ADS to ask the user to accept the certificates and
       // eventually admin authentication data.
-      AtomicReference<InitialLdapContext> aux = new AtomicReference<>(ctx);
+      AtomicReference<ConnectionWrapper> aux = new AtomicReference<>(ctx);
       cancelled = !loadADSAndAcceptCertificates(sourceServerCI, aux, uData, false);
       ctx = aux.get();
     }
@@ -2840,7 +2894,8 @@
     if (disableReplicationServer && repPort < 0)
     {
       disableReplicationServer = false;
-      final LocalizableMessage msg = INFO_REPLICATION_PROMPT_NO_REPLICATION_SERVER_TO_DISABLE.get(getHostPort(ctx));
+      final LocalizableMessage msg = INFO_REPLICATION_PROMPT_NO_REPLICATION_SERVER_TO_DISABLE.get(
+          getHostPort(ctx.getLdapContext()));
       try
       {
         cancelled = askConfirmation(msg, false, logger);
@@ -2860,18 +2915,19 @@
     if (!cancelled && !disableAll)
     {
       List<String> suffixes = argParser.getBaseDNs();
-      checkSuffixesForDisableReplication(suffixes, ctx, true, !disableReplicationServer);
+      checkSuffixesForDisableReplication(suffixes, ctx.getLdapContext(), true, !disableReplicationServer);
       cancelled = suffixes.isEmpty() && !disableReplicationServer;
 
       uData.setBaseDNs(suffixes);
 
       if (!uData.disableReplicationServer() && repPort > 0 &&
-          disableAllBaseDns(ctx, uData) && !argParser.advancedArg.isPresent())
+          disableAllBaseDns(ctx.getLdapContext(), uData) && !argParser.advancedArg.isPresent())
       {
         try
         {
           uData.setDisableReplicationServer(askConfirmation(
-              INFO_REPLICATION_DISABLE_ALL_SUFFIXES_DISABLE_REPLICATION_SERVER.get(getHostPort(ctx), repPort), true,
+              INFO_REPLICATION_DISABLE_ALL_SUFFIXES_DISABLE_REPLICATION_SERVER.get(
+                  getHostPort(ctx.getLdapContext()), repPort), true,
               logger));
         }
         catch (ClientException ce)
@@ -3005,16 +3061,16 @@
    */
   private boolean promptIfRequiredForPreOrPost(MonoServerReplicationUserData uData)
   {
-    InitialLdapContext ctx = null;
+    ConnectionWrapper ctx = null;
     try
     {
-      ctx = getInitialLdapContext(uData);
+      ctx = getConnection(uData);
       if (ctx == null)
       {
         return false;
       }
       List<String> suffixes = argParser.getBaseDNs();
-      checkSuffixesForInitializeReplication(suffixes, ctx, true);
+      checkSuffixesForInitializeReplication(suffixes, ctx.getLdapContext(), true);
       uData.setBaseDNs(suffixes);
       return !suffixes.isEmpty();
     }
@@ -3024,6 +3080,20 @@
     }
   }
 
+  private ConnectionWrapper getConnection(MonoServerReplicationUserData uData)
+  {
+    try
+    {
+      InitialLdapContext ctx = getInitialLdapContext(uData);
+      return new ConnectionWrapper(ctx, sourceServerCI.getConnectTimeout(), getTrustManager(sourceServerCI));
+    }
+    catch (NamingException ce)
+    {
+      logger.warn(LocalizableMessage.raw("An error occured " + ce));
+      return null;
+    }
+  }
+
   private InitialLdapContext getInitialLdapContext(MonoServerReplicationUserData uData)
   {
     // Try to connect to the server.
@@ -3082,10 +3152,10 @@
   private boolean promptIfRequired(StatusReplicationUserData uData)
   throws ReplicationCliException
   {
-    InitialLdapContext ctx = null;
+    ConnectionWrapper ctx = null;
     try
     {
-      ctx = getInitialLdapContext(uData);
+      ctx = getConnection(uData);
       if (ctx == null)
       {
         return false;
@@ -3096,7 +3166,7 @@
       // statusReplication(StatusReplicationUserData) method. Here we have
       // to load the ADS to ask the user to accept the certificates and
       // eventually admin authentication data.
-      AtomicReference<InitialLdapContext> aux = new AtomicReference<>(ctx);
+      AtomicReference<ConnectionWrapper> aux = new AtomicReference<>(ctx);
       boolean cancelled = !loadADSAndAcceptCertificates(sourceServerCI, aux, uData, false);
       ctx = aux.get();
       if (cancelled)
@@ -3150,7 +3220,7 @@
     sourceServerCI.initializeGlobalArguments(hostSource, portSource, adminUid, null, adminPwd,
         pwdFile == null ? null : new LinkedHashMap<String, String>(pwdFile));
     /* Try to connect to the source server. */
-    InitialLdapContext ctxSource = null;
+    ConnectionWrapper ctxSource = null;
 
     while (ctxSource == null && !cancelled)
     {
@@ -3163,7 +3233,7 @@
         adminUid = sourceServerCI.getAdministratorUID();
         adminPwd = sourceServerCI.getBindPassword();
 
-        ctxSource = createInitialLdapContextInteracting(sourceServerCI);
+        ctxSource = createConnectionInteracting(sourceServerCI);
 
         if (ctxSource == null)
         {
@@ -3212,7 +3282,7 @@
     destinationServerCI.initializeGlobalArguments(hostDestination, portDestination, adminUid, null, adminPwd,
         pwdFile == null ? null : new LinkedHashMap<String, String>(pwdFile));
     /* Try to connect to the destination server. */
-    InitialLdapContext ctxDestination = null;
+    ConnectionWrapper ctxDestination = null;
 
     destinationServerCI.resetHeadingDisplayed();
     while (ctxDestination == null && !cancelled)
@@ -3237,7 +3307,7 @@
 
         if (!error)
         {
-          ctxDestination = createInitialLdapContextInteracting(destinationServerCI, true);
+          ctxDestination = createConnectionInteracting(destinationServerCI, true);
 
           if (ctxDestination == null)
           {
@@ -3269,14 +3339,16 @@
     if (!cancelled)
     {
       List<String> suffixes = argParser.getBaseDNs();
-      cancelled = serversOperations.continueAfterUserInput(suffixes, ctxSource, ctxDestination, true);
+      cancelled = serversOperations.continueAfterUserInput(
+          suffixes, ctxSource.getLdapContext(), ctxDestination.getLdapContext(), true);
       uData.setBaseDNs(suffixes);
     }
 
     if (!cancelled)
     {
       println();
-      cancelled = serversOperations.confirmOperation(uData, ctxSource, ctxDestination, true);
+      cancelled = serversOperations.confirmOperation(
+          uData, ctxSource.getLdapContext(), ctxDestination.getLdapContext(), true);
       println();
     }
 
@@ -3463,30 +3535,28 @@
   /**
    * Tells whether the server to which the LdapContext is connected has a
    * replication port or not.
-   * @param ctx the InitialLdapContext to be used.
+   * @param connWrapper the InitialLdapContext to be used.
    * @return <CODE>true</CODE> if the replication port for the server could
    * be found and <CODE>false</CODE> otherwise.
    */
-  private boolean hasReplicationPort(InitialLdapContext ctx)
+  private boolean hasReplicationPort(ConnectionWrapper connWrapper)
   {
-    return getReplicationPort(ctx) != -1;
+    return getReplicationPort(connWrapper) != -1;
   }
 
   /**
    * Returns the replication port of server to which the LdapContext is
    * connected and -1 if the replication port could not be found.
-   * @param ctx the InitialLdapContext to be used.
+   * @param connWrapper the InitialLdapContext to be used.
    * @return the replication port of server to which the LdapContext is
    * connected and -1 if the replication port could not be found.
    */
-  private int getReplicationPort(InitialLdapContext ctx)
+  private int getReplicationPort(ConnectionWrapper connWrapper)
   {
     int replicationPort = -1;
     try
     {
-      ManagementContext mCtx = LDAPManagementContext.createFromContext(
-          JNDIDirContextAdaptor.adapt(ctx));
-      RootCfgClient root = mCtx.getRootConfiguration();
+      RootCfgClient root = connWrapper.getRootConfiguration();
 
       ReplicationSynchronizationProviderCfgClient sync =
           (ReplicationSynchronizationProviderCfgClient)
@@ -3514,7 +3584,7 @@
    * accordingly.
    *
    * @param ci the LDAP connection to the server
-   * @param ctx the Ldap context to be used in an array: note the context
+   * @param connWrapper the Ldap context to be used in an array: note the context
    * may be modified with the new credentials provided by the user.
    * @param uData the ReplicationUserData to be updated.
    * @param isFirstOrSourceServer whether this is the first server in the
@@ -3527,12 +3597,13 @@
    * messages.
    */
   private boolean loadADSAndAcceptCertificates(LDAPConnectionConsoleInteraction ci,
-      AtomicReference<InitialLdapContext> ctx, ReplicationUserData uData, boolean isFirstOrSourceServer)
+      AtomicReference<ConnectionWrapper> connWrapper, ReplicationUserData uData, boolean isFirstOrSourceServer)
   throws ReplicationCliException
   {
     boolean cancelled = false;
     boolean triedWithUserProvidedAdmin = false;
-    final InitialLdapContext ctx1 = ctx.get();
+    final ConnectionWrapper connWrapper1 = connWrapper.get();
+    final InitialLdapContext ctx1 = connWrapper1.getLdapContext();
     String host = getHostName(ctx1);
     int port = getPort(ctx1);
     boolean isSSL = isSSL(ctx1);
@@ -3546,7 +3617,7 @@
     }
     try
     {
-      ADSContext adsContext = new ADSContext(ctx1);
+      ADSContext adsContext = new ADSContext(connWrapper1);
       if (adsContext.hasAdminData())
       {
         boolean reloadTopology = true;
@@ -3629,8 +3700,10 @@
                     final InitialLdapContext ctx2 = createAdministrativeContext(host, port, isSSL,
                         isStartTLS, getAdministratorDN(adminUid),
                         adminPwd, getConnectTimeout(), getTrustManager(ci));
-                    ctx.set(ctx2);
-                    adsContext = new ADSContext(ctx2);
+                    final ConnectionWrapper connWrapper2 =
+                        new ConnectionWrapper(ctx2, getConnectTimeout(), getTrustManager(ci));
+                    connWrapper.set(connWrapper2);
+                    adsContext = new ADSContext(connWrapper2);
                     cache = new TopologyCache(adsContext, getTrustManager(ci),
                         getConnectTimeout());
                     cache.getFilter().setSearchMonitoringInformation(false);
@@ -3716,15 +3789,15 @@
   /**
    * Tells whether there is a Global Administrator defined in the server
    * to which the InitialLdapContext is connected.
-   * @param ctx the InitialLdapContext.
+   * @param connWrapper the InitialLdapContext.
    * @return <CODE>true</CODE> if we could find an administrator and
    * <CODE>false</CODE> otherwise.
    */
-  private boolean hasAdministrator(InitialLdapContext ctx)
+  private boolean hasAdministrator(ConnectionWrapper connWrapper)
   {
     try
     {
-      ADSContext adsContext = new ADSContext(ctx);
+      ADSContext adsContext = new ADSContext(connWrapper);
       if (adsContext.hasAdminData())
       {
         Set<?> administrators = adsContext.readAdministratorRegistry();
@@ -3743,18 +3816,18 @@
    * Tells whether there is a Global Administrator corresponding to the provided
    * ReplicationUserData defined in the server to which the InitialLdapContext
    * is connected.
-   * @param ctx the InitialLdapContext.
+   * @param connWrapper the InitialLdapContext.
    * @param uData the user data
    * @return <CODE>true</CODE> if we could find an administrator and
    * <CODE>false</CODE> otherwise.
    */
-  private boolean hasAdministrator(InitialLdapContext ctx,
+  private boolean hasAdministrator(ConnectionWrapper connWrapper,
       ReplicationUserData uData)
   {
     String adminUid = uData.getAdminUid();
     try
     {
-      ADSContext adsContext = new ADSContext(ctx);
+      ADSContext adsContext = new ADSContext(connWrapper);
       Set<Map<AdministratorProperty, Object>> administrators =
         adsContext.readAdministratorRegistry();
       for (Map<AdministratorProperty, Object> admin : administrators)
@@ -3943,16 +4016,16 @@
    */
   private ReplicationCliReturnCode enableReplication(EnableReplicationUserData uData)
   {
-    InitialLdapContext ctx1 = null;
-    InitialLdapContext ctx2 = null;
+    ConnectionWrapper ctx1 = null;
+    ConnectionWrapper ctx2 = null;
     try
     {
       println();
       print(formatter.getFormattedWithPoints(INFO_REPLICATION_CONNECTING.get()));
 
       LinkedList<LocalizableMessage> errorMessages = new LinkedList<>();
-      ctx1 = createAdministrativeContext(uData, true, errorMessages);
-      ctx2 = createAdministrativeContext(uData, false, errorMessages);
+      ctx1 = createAdministrativeConnection(uData, true, errorMessages);
+      ctx2 = createAdministrativeConnection(uData, false, errorMessages);
 
       if (!errorMessages.isEmpty())
       {
@@ -3998,7 +4071,7 @@
       try
       {
         updateConfiguration(ctx1, ctx2, uData);
-        printSuccessfullyEnabled(ctx1, ctx2);
+        printSuccessfullyEnabled(ctx1.getLdapContext(), ctx2.getLdapContext());
         return SUCCESSFUL;
       }
       catch (ReplicationCliException rce)
@@ -4015,26 +4088,27 @@
     }
   }
 
-  private void checkReplicationServerAlreadyConfigured(InitialLdapContext ctx, EnableReplicationServerData server)
+  private void checkReplicationServerAlreadyConfigured(
+      ConnectionWrapper connWrapper, EnableReplicationServerData server)
   {
-    int repPort = getReplicationPort(ctx);
+    int repPort = getReplicationPort(connWrapper);
     if (!server.configureReplicationServer() && repPort > 0)
     {
-      println(INFO_REPLICATION_SERVER_CONFIGURED_WARNING.get(getHostPort(ctx), repPort));
+      println(INFO_REPLICATION_SERVER_CONFIGURED_WARNING.get(getHostPort(connWrapper.getLdapContext()), repPort));
       println();
     }
   }
 
   private void checksForNonInteractiveMode(EnableReplicationUserData uData,
-      InitialLdapContext ctx1, InitialLdapContext ctx2, LinkedList<LocalizableMessage> errorMessages)
+      ConnectionWrapper connWrapper1, ConnectionWrapper connWrapper2, LinkedList<LocalizableMessage> errorMessages)
   {
     EnableReplicationServerData server1 = uData.getServer1();
     EnableReplicationServerData server2 = uData.getServer2();
     String host1 = server1.getHostName();
     String host2 = server2.getHostName();
 
-    int replPort1 = checkReplicationPort(ctx1, server1, errorMessages);
-    int replPort2 = checkReplicationPort(ctx2, server2, errorMessages);
+    int replPort1 = checkReplicationPort(connWrapper1, server1, errorMessages);
+    int replPort2 = checkReplicationPort(connWrapper2, server2, errorMessages);
     if (replPort1 > 0 && replPort1 == replPort2 && host1.equalsIgnoreCase(host2))
     {
       errorMessages.add(ERR_REPLICATION_SAME_REPLICATION_PORT.get(replPort1, host1));
@@ -4050,9 +4124,9 @@
   }
 
   private int checkReplicationPort(
-      InitialLdapContext ctx, EnableReplicationServerData server, LinkedList<LocalizableMessage> errorMessages)
+      ConnectionWrapper connWrapper, EnableReplicationServerData server, LinkedList<LocalizableMessage> errorMessages)
   {
-    int replPort = getReplicationPort(ctx);
+    int replPort = getReplicationPort(connWrapper);
     boolean hasReplicationPort = replPort > 0;
     if (replPort < 0 && server.configureReplicationServer())
     {
@@ -4105,6 +4179,23 @@
     }
   }
 
+  private ConnectionWrapper createAdministrativeConnection(EnableReplicationUserData uData, boolean isFirstSetOfValues,
+      LinkedList<LocalizableMessage> errorMessages)
+  {
+    EnableReplicationServerData server = isFirstSetOfValues ? uData.getServer1() : uData.getServer2();
+    try
+    {
+      return new ConnectionWrapper(createAdministrativeContext(uData, isFirstSetOfValues, errorMessages),
+          getConnectTimeout(), getTrustManager(sourceServerCI));
+    }
+    catch (NamingException e)
+    {
+      String hostPort = getServerRepresentation(server.getHostName(), server.getPort());
+      logger.error(LocalizableMessage.raw("Error when creating connection for:" + hostPort));
+      return null;
+    }
+  }
+
   private InitialLdapContext createAdministrativeContext(EnableReplicationUserData uData, boolean isFirstSetOfValues,
       LinkedList<LocalizableMessage> errorMessages)
   {
@@ -4139,8 +4230,8 @@
         ? getAdministratorDN(uData.getAdminUid())
         : uData.getBindDn();
 
-    InitialLdapContext ctx = createAdministrativeContext(uData, bindDn);
-    if (ctx == null)
+    ConnectionWrapper connWrapper = createAdministrativeConnection(uData, bindDn);
+    if (connWrapper == null)
     {
       return ERROR_CONNECTING;
     }
@@ -4152,7 +4243,8 @@
       println();
 
       List<String> suffixes = uData.getBaseDNs();
-      checkSuffixesForDisableReplication(suffixes, ctx, false, !uData.disableReplicationServer());
+      checkSuffixesForDisableReplication(
+          suffixes, connWrapper.getLdapContext(), false, !uData.disableReplicationServer());
       if (suffixes.isEmpty() && !uData.disableReplicationServer() && !uData.disableAll())
       {
         return REPLICATION_CANNOT_BE_DISABLED_ON_BASEDN;
@@ -4161,7 +4253,7 @@
 
       if (!isInteractive())
       {
-        boolean hasReplicationPort = hasReplicationPort(ctx);
+        boolean hasReplicationPort = hasReplicationPort(connWrapper);
         if (uData.disableAll() && hasReplicationPort)
         {
           uData.setDisableReplicationServer(true);
@@ -4169,7 +4261,8 @@
         else if (uData.disableReplicationServer() && !hasReplicationPort && !uData.disableAll())
         {
           uData.setDisableReplicationServer(false);
-          println(INFO_REPLICATION_WARNING_NO_REPLICATION_SERVER_TO_DISABLE.get(getHostPort(ctx)));
+          println(
+              INFO_REPLICATION_WARNING_NO_REPLICATION_SERVER_TO_DISABLE.get(getHostPort(connWrapper.getLdapContext())));
           println();
         }
       }
@@ -4179,17 +4272,19 @@
         printNewCommandBuilder(DISABLE_REPLICATION_SUBCMD_NAME, uData);
       }
 
-      if (!isInteractive() && !uData.disableReplicationServer() && !uData.disableAll() && disableAllBaseDns(ctx, uData)
-          && hasReplicationPort(ctx))
+      if (!isInteractive() && !uData.disableReplicationServer() && !uData.disableAll()
+          && disableAllBaseDns(connWrapper.getLdapContext(), uData) && hasReplicationPort(connWrapper))
       {
         // Inform the user that the replication server will not be disabled.
         // Inform also of the user of the disableReplicationServerArg
-        println(INFO_REPLICATION_DISABLE_ALL_SUFFIXES_KEEP_REPLICATION_SERVER.get(getHostPort(ctx),
-            argParser.disableReplicationServerArg.getLongIdentifier(), argParser.disableAllArg.getLongIdentifier()));
+        println(INFO_REPLICATION_DISABLE_ALL_SUFFIXES_KEEP_REPLICATION_SERVER.get(
+            getHostPort(connWrapper.getLdapContext()),
+            argParser.disableReplicationServerArg.getLongIdentifier(),
+            argParser.disableAllArg.getLongIdentifier()));
       }
       try
       {
-        updateConfiguration(ctx, uData);
+        updateConfiguration(connWrapper, uData);
         return SUCCESSFUL;
       }
       catch (ReplicationCliException rce)
@@ -4202,7 +4297,7 @@
     }
     finally
     {
-      close(ctx);
+      close(connWrapper);
     }
   }
 
@@ -4217,7 +4312,7 @@
   private ReplicationCliReturnCode statusReplication(
       StatusReplicationUserData uData)
   {
-    final InitialLdapContext ctx = createAdministrativeContext(uData);
+    final ConnectionWrapper ctx = createAdministrativeConnection(uData);
     if (ctx == null)
     {
       return ERROR_CONNECTING;
@@ -4521,7 +4616,7 @@
    * replication domains must be configured or not.
    */
   private void checkSuffixesForEnableReplication(Collection<String> suffixes,
-      InitialLdapContext ctx1, InitialLdapContext ctx2,
+      ConnectionWrapper ctx1, ConnectionWrapper ctx2,
       boolean interactive, EnableReplicationUserData uData)
   {
     EnableReplicationServerData server1 = uData.getServer1();
@@ -4531,9 +4626,9 @@
     if (server1.configureReplicationDomain() &&
         server2.configureReplicationDomain())
     {
-      availableSuffixes.addAll(getCommonSuffixes(ctx1, ctx2,
+      availableSuffixes.addAll(getCommonSuffixes(ctx1.getLdapContext(), ctx2.getLdapContext(),
             SuffixRelationType.NOT_FULLY_REPLICATED));
-      alreadyReplicatedSuffixes.addAll(getCommonSuffixes(ctx1, ctx2,
+      alreadyReplicatedSuffixes.addAll(getCommonSuffixes(ctx1.getLdapContext(), ctx2.getLdapContext(),
             SuffixRelationType.FULLY_REPLICATED));
     }
     else if (server1.configureReplicationDomain())
@@ -5018,8 +5113,8 @@
    * parameters to update the configuration.
    * @throws ReplicationCliException if there is an error.
    */
-  private void updateConfiguration(InitialLdapContext ctx1,
-      InitialLdapContext ctx2, EnableReplicationUserData uData)
+  private void updateConfiguration(ConnectionWrapper ctx1,
+      ConnectionWrapper ctx2, EnableReplicationUserData uData)
   throws ReplicationCliException
   {
     final Set<String> twoReplServers = new LinkedHashSet<>();
@@ -5033,8 +5128,8 @@
     filter.addBaseDNToSearch(ADSContext.getAdministrationSuffixDN());
     filter.addBaseDNToSearch(Constants.SCHEMA_DN);
     addBaseDNs(filter, uData.getBaseDNs());
-    ServerDescriptor serverDesc1 = createStandalone(ctx1, filter);
-    ServerDescriptor serverDesc2 = createStandalone(ctx2, filter);
+    ServerDescriptor serverDesc1 = createStandalone(ctx1.getLdapContext(), filter);
+    ServerDescriptor serverDesc2 = createStandalone(ctx2.getLdapContext(), filter);
 
     ADSContext adsCtx1 = new ADSContext(ctx1);
     ADSContext adsCtx2 = new ADSContext(ctx2);
@@ -5047,8 +5142,8 @@
       try
       {
         final Set<PreferredConnection> cnx = new LinkedHashSet<>();
-        cnx.addAll(getPreferredConnections(ctx1));
-        cnx.addAll(getPreferredConnections(ctx2));
+        cnx.addAll(getPreferredConnections(ctx1.getLdapContext()));
+        cnx.addAll(getPreferredConnections(ctx2.getLdapContext()));
         TopologyCache cache1 = createTopologyCache(adsCtx1, cnx, uData);
         if (cache1 != null)
         {
@@ -5121,8 +5216,8 @@
 
     // These are used to identify which server we use to initialize
     // the contents of the other server (if any).
-    InitialLdapContext ctxSource = null;
-    InitialLdapContext ctxDestination = null;
+    ConnectionWrapper ctxSource = null;
+    ConnectionWrapper ctxDestination = null;
     ADSContext adsCtxSource = null;
 
     boolean adsAlreadyReplicated = false;
@@ -5138,7 +5233,7 @@
         Set<Map<ServerProperty, Object>> registry2 = adsCtx2.readServerRegistry();
         if (registry2.size() <= 1)
         {
-          if (!hasAdministrator(adsCtx1.getDirContext(), uData))
+          if (!hasAdministrator(adsCtx1.getConnection(), uData))
           {
             adsCtx1.createAdministrator(getAdministratorProperties(uData));
           }
@@ -5156,7 +5251,7 @@
         }
         else if (registry1.size() <= 1)
         {
-          if (!hasAdministrator(adsCtx2.getDirContext(), uData))
+          if (!hasAdministrator(adsCtx2.getConnection(), uData))
           {
             adsCtx2.createAdministrator(getAdministratorProperties(uData));
           }
@@ -5207,7 +5302,7 @@
             {
               // The case where only the first ADS is replicated or none
               // is replicated.
-              if (!hasAdministrator(adsCtx1.getDirContext(), uData))
+              if (!hasAdministrator(adsCtx1.getConnection(), uData))
               {
                 adsCtx1.createAdministrator(getAdministratorProperties(uData));
               }
@@ -5225,7 +5320,7 @@
             }
             else if (isADS2Replicated)
             {
-              if (!hasAdministrator(adsCtx2.getDirContext(), uData))
+              if (!hasAdministrator(adsCtx2.getConnection(), uData))
               {
                 adsCtx2.createAdministrator(getAdministratorProperties(uData));
               }
@@ -5246,7 +5341,7 @@
       }
       else if (!adsCtx1.hasAdminData() && adsCtx2.hasAdminData())
       {
-        if (!hasAdministrator(adsCtx2.getDirContext(), uData))
+        if (!hasAdministrator(adsCtx2.getConnection(), uData))
         {
           adsCtx2.createAdministrator(getAdministratorProperties(uData));
         }
@@ -5265,7 +5360,7 @@
       }
       else if (adsCtx1.hasAdminData() && !adsCtx2.hasAdminData())
       {
-        if (!hasAdministrator(adsCtx1.getDirContext(), uData))
+        if (!hasAdministrator(adsCtx1.getConnection(), uData))
         {
           adsCtx1.createAdministrator(getAdministratorProperties(uData));
         }
@@ -5311,14 +5406,13 @@
     {
       try
       {
-        ServerDescriptor.seedAdsTrustStore(ctxDestination,
-            adsCtxSource.getTrustedCertificates());
+        ServerDescriptor.seedAdsTrustStore(ctxDestination.getLdapContext(), adsCtxSource.getTrustedCertificates());
       }
       catch (Throwable t)
       {
         logger.error(LocalizableMessage.raw("Error seeding truststores: "+t, t));
         throw new ReplicationCliException(
-            ERR_REPLICATION_ENABLE_SEEDING_TRUSTSTORE.get(getHostPort(ctxDestination),
+            ERR_REPLICATION_ENABLE_SEEDING_TRUSTSTORE.get(getHostPort(ctxDestination.getLdapContext()),
             getHostPort(adsCtxSource.getDirContext()), toString(t)),
             ERROR_SEEDING_TRUSTORE, t);
       }
@@ -5348,8 +5442,8 @@
     try
     {
       Set<PreferredConnection> cnx = new LinkedHashSet<>();
-      cnx.addAll(getPreferredConnections(ctx1));
-      cnx.addAll(getPreferredConnections(ctx2));
+      cnx.addAll(getPreferredConnections(ctx1.getLdapContext()));
+      cnx.addAll(getPreferredConnections(ctx2.getLdapContext()));
       cache1 = createTopologyCache(adsCtx1, cnx, uData);
       if (cache1 != null)
       {
@@ -5374,8 +5468,8 @@
           ERROR_READING_TOPOLOGY_CACHE, tce);
     }
 
-    addToSets(serverDesc1, uData.getServer1(), ctx1, twoReplServers, usedReplicationServerIds);
-    addToSets(serverDesc2, uData.getServer2(), ctx2, twoReplServers, usedReplicationServerIds);
+    addToSets(serverDesc1, uData.getServer1(), ctx1.getLdapContext(), twoReplServers, usedReplicationServerIds);
+    addToSets(serverDesc2, uData.getServer2(), ctx2.getLdapContext(), twoReplServers, usedReplicationServerIds);
 
     for (String baseDN : uData.getBaseDNs())
     {
@@ -5436,11 +5530,11 @@
     if (adsMergeDone)
     {
       PointAdder pointAdder = new PointAdder(this);
-      print(INFO_ENABLE_REPLICATION_INITIALIZING_ADS_ALL.get(getHostPort(ctxSource)));
+      print(INFO_ENABLE_REPLICATION_INITIALIZING_ADS_ALL.get(getHostPort(ctxSource.getLdapContext())));
       pointAdder.start();
       try
       {
-        initializeAllSuffix(ADSContext.getAdministrationSuffixDN(), ctxSource, false);
+        initializeAllSuffix(ADSContext.getAdministrationSuffixDN(), ctxSource.getLdapContext(), false);
       }
       finally
       {
@@ -5454,9 +5548,10 @@
     {
       print(formatter.getFormattedWithPoints(
           INFO_ENABLE_REPLICATION_INITIALIZING_ADS.get(
-              getHostPort(ctxDestination), getHostPort(ctxSource))));
+              getHostPort(ctxDestination.getLdapContext()), getHostPort(ctxSource.getLdapContext()))));
 
-      initializeSuffix(ADSContext.getAdministrationSuffixDN(), ctxSource, ctxDestination, false);
+      initializeSuffix(
+          ADSContext.getAdministrationSuffixDN(), ctxSource.getLdapContext(), ctxDestination.getLdapContext(), false);
       print(formatter.getFormattedDone());
       println();
     }
@@ -5478,11 +5573,11 @@
       {
         PointAdder pointAdder = new PointAdder(this);
         println(INFO_ENABLE_REPLICATION_INITIALIZING_SCHEMA.get(
-            getHostPort(ctxDestination), getHostPort(ctxSource)));
+            getHostPort(ctxDestination.getLdapContext()), getHostPort(ctxSource.getLdapContext())));
         pointAdder.start();
         try
         {
-          initializeAllSuffix(Constants.SCHEMA_DN, ctxSource, false);
+          initializeAllSuffix(Constants.SCHEMA_DN, ctxSource.getLdapContext(), false);
         }
         finally
         {
@@ -5493,8 +5588,8 @@
       else
       {
         print(formatter.getFormattedWithPoints(INFO_ENABLE_REPLICATION_INITIALIZING_SCHEMA.get(
-            getHostPort(ctxDestination), getHostPort(ctxSource))));
-        initializeSuffix(Constants.SCHEMA_DN, ctxSource, ctxDestination, false);
+            getHostPort(ctxDestination.getLdapContext()), getHostPort(ctxSource.getLdapContext()))));
+        initializeSuffix(Constants.SCHEMA_DN, ctxSource.getLdapContext(), ctxDestination.getLdapContext(), false);
       }
       print(formatter.getFormattedDone());
       println();
@@ -5515,7 +5610,7 @@
     }
   }
 
-  private void configureToReplicateBaseDN(EnableReplicationServerData server, InitialLdapContext ctx,
+  private void configureToReplicateBaseDN(EnableReplicationServerData server, ConnectionWrapper ctx,
       ServerDescriptor serverDesc, TopologyCache cache, String baseDN, Set<Integer> usedIds,
       Set<String> alreadyConfiguredServers, Set<String> repServers, final Set<String> allRepServers,
       Set<String> alreadyConfiguredReplicationServers) throws ReplicationCliException
@@ -5527,9 +5622,9 @@
       {
         configureToReplicateBaseDN(ctx, baseDN, repServers, usedIds);
       }
-      catch (OpenDsException ode)
+      catch (Exception ode)
       {
-        LocalizableMessage msg = getMessageForEnableException(getHostPort(ctx), baseDN);
+        LocalizableMessage msg = getMessageForEnableException(getHostPort(ctx.getLdapContext()), baseDN);
         throw new ReplicationCliException(msg, ERROR_ENABLING_REPLICATION_ON_BASEDN, ode);
       }
     }
@@ -5542,7 +5637,7 @@
     }
   }
 
-  private void configureServer(InitialLdapContext ctx, ServerDescriptor serverDesc,
+  private void configureServer(ConnectionWrapper ctx, ServerDescriptor serverDesc,
       EnableReplicationServerData enableServer, IntegerArgument replicationPortArg,
       Set<Integer> usedReplicationServerIds, Set<String> allRepServers,
       Set<String> alreadyConfiguredReplicationServers, Arg2<Number, Number> replicationServerAlreadyConfiguredMsg)
@@ -5555,9 +5650,9 @@
         configureAsReplicationServer(ctx, enableServer.getReplicationPort(), enableServer.isSecureReplication(),
             allRepServers, usedReplicationServerIds);
       }
-      catch (OpenDsException ode)
+      catch (Exception ode)
       {
-        throw errorConfiguringReplicationServer(ctx, ode);
+        throw errorConfiguringReplicationServer(ctx.getLdapContext(), ode);
       }
     }
     else if (serverDesc.isReplicationServer())
@@ -5566,9 +5661,9 @@
       {
         updateReplicationServer(ctx, allRepServers);
       }
-      catch (OpenDsException ode)
+      catch (Exception ode)
       {
-        throw errorConfiguringReplicationServer(ctx, ode);
+        throw errorConfiguringReplicationServer(ctx.getLdapContext(), ode);
       }
       if (replicationPortArg.isPresent() && enableServer.getReplicationPort() != serverDesc.getReplicationServerPort())
       {
@@ -5581,7 +5676,7 @@
     alreadyConfiguredReplicationServers.add(serverDesc.getId());
   }
 
-  private ReplicationCliException errorConfiguringReplicationServer(InitialLdapContext ctx, OpenDsException ode)
+  private ReplicationCliException errorConfiguringReplicationServer(InitialLdapContext ctx, Exception ode)
   {
     return new ReplicationCliException(
         ERR_REPLICATION_CONFIGURING_REPLICATIONSERVER.get(getHostPort(ctx)),
@@ -5626,7 +5721,7 @@
    * parameters to update the configuration.
    * @throws ReplicationCliException if there is an error.
    */
-  private void updateConfiguration(InitialLdapContext ctx,
+  private void updateConfiguration(ConnectionWrapper ctx,
       DisableReplicationUserData uData) throws ReplicationCliException
   {
     TopologyCacheFilter filter = new TopologyCacheFilter();
@@ -5636,7 +5731,7 @@
       filter.addBaseDNToSearch(ADSContext.getAdministrationSuffixDN());
       addBaseDNs(filter, uData.getBaseDNs());
     }
-    ServerDescriptor server = createStandalone(ctx, filter);
+    ServerDescriptor server = createStandalone(ctx.getLdapContext(), filter);
 
     ADSContext adsCtx = new ADSContext(ctx);
 
@@ -5649,7 +5744,7 @@
       if (adsCtx.hasAdminData() && tryToUpdateRemote)
       {
         cache = new TopologyCache(adsCtx, getTrustManager(sourceServerCI), getConnectTimeout());
-        cache.setPreferredConnections(getPreferredConnections(ctx));
+        cache.setPreferredConnections(getPreferredConnections(ctx.getLdapContext()));
         cache.getFilter().setSearchMonitoringInformation(false);
         if (!uData.disableAll())
         {
@@ -5820,9 +5915,9 @@
     boolean forceDisableADS = false;
     boolean schemaReplicated = false;
     boolean adsReplicated = false;
-    boolean disableAllBaseDns = disableAllBaseDns(ctx, uData);
+    boolean disableAllBaseDns = disableAllBaseDns(ctx.getLdapContext(), uData);
 
-    Collection<ReplicaDescriptor> replicas = getReplicas(ctx);
+    Collection<ReplicaDescriptor> replicas = getReplicas(ctx.getLdapContext());
     for (ReplicaDescriptor rep : replicas)
     {
       String dn = rep.getSuffix().getDN();
@@ -5920,7 +6015,7 @@
       }
       catch (OpenDsException ode)
       {
-        LocalizableMessage msg = getMessageForDisableException(getHostPort(ctx), baseDN);
+        LocalizableMessage msg = getMessageForDisableException(getHostPort(ctx.getLdapContext()), baseDN);
         throw new ReplicationCliException(msg,
             ERROR_DISABLING_REPLICATION_ON_BASEDN, ode);
       }
@@ -5957,13 +6052,13 @@
           }
         }
       }
-      String bindDn = getBindDN(ctx);
-      String pwd = getBindPassword(ctx);
+      String bindDn = getBindDN(ctx.getLdapContext());
+      String pwd = getBindPassword(ctx.getLdapContext());
       for (ServerDescriptor s : serversToUpdate)
       {
         removeReferencesInServer(s, replicationServerHostPort, bindDn, pwd,
             baseDNsToUpdate, disableReplicationServer,
-            getPreferredConnections(ctx));
+            getPreferredConnections(ctx.getLdapContext()));
       }
 
       if (disableReplicationServer)
@@ -6041,7 +6136,7 @@
    * parameters to update the configuration.
    * @throws ReplicationCliException if there is an error.
    */
-  private void displayStatus(InitialLdapContext ctx,
+  private void displayStatus(ConnectionWrapper ctx,
       StatusReplicationUserData uData) throws ReplicationCliException
   {
     ADSContext adsCtx = new ADSContext(ctx);
@@ -6051,7 +6146,7 @@
     try
     {
       cache = new TopologyCache(adsCtx, getTrustManager(sourceServerCI), getConnectTimeout());
-      cache.setPreferredConnections(getPreferredConnections(ctx));
+      cache.setPreferredConnections(getPreferredConnections(ctx.getLdapContext()));
       addBaseDNs(cache.getFilter(), uData.getBaseDNs());
       cache.reloadTopology();
     }
@@ -6132,7 +6227,7 @@
       }
       if (!rServers.isEmpty())
       {
-        displayStatus(rServers, uData.isScriptFriendly(), getPreferredConnections(ctx));
+        displayStatus(rServers, uData.isScriptFriendly(), getPreferredConnections(ctx.getLdapContext()));
         somethingDisplayed = true;
       }
     }
@@ -6162,7 +6257,7 @@
       Set<ReplicaDescriptor> replicasWithNoReplicationServer = new HashSet<>();
       Set<ServerDescriptor> serversWithNoReplica = new HashSet<>();
       displayStatus(orderedReplicaLists, uData.isScriptFriendly(),
-            getPreferredConnections(ctx),
+            getPreferredConnections(ctx.getLdapContext()),
             cache.getServers(),
             replicasWithNoReplicationServer, serversWithNoReplica);
       somethingDisplayed = true;
@@ -6721,17 +6816,15 @@
    * that will be used by the newly configured replication server.
    * @throws OpenDsException if there is an error updating the configuration.
    */
-  private void configureAsReplicationServer(InitialLdapContext ctx,
+  private void configureAsReplicationServer(ConnectionWrapper ctx,
       int replicationPort, boolean useSecureReplication,
       Set<String> replicationServers,
-      Set<Integer> usedReplicationServerIds) throws OpenDsException
+      Set<Integer> usedReplicationServerIds) throws Exception
   {
     print(formatter.getFormattedWithPoints(
-        INFO_REPLICATION_ENABLE_CONFIGURING_REPLICATION_SERVER.get(getHostPort(ctx))));
+        INFO_REPLICATION_ENABLE_CONFIGURING_REPLICATION_SERVER.get(getHostPort(ctx.getLdapContext()))));
 
-    ManagementContext mCtx = LDAPManagementContext.createFromContext(
-        JNDIDirContextAdaptor.adapt(ctx));
-    RootCfgClient root = mCtx.getRootConfiguration();
+    RootCfgClient root = ctx.getRootConfiguration();
 
     /* Configure Synchronization plugin. */
     ReplicationSynchronizationProviderCfgClient sync = null;
@@ -6742,7 +6835,8 @@
     }
     catch (ManagedObjectNotFoundException monfe)
     {
-      logger.info(LocalizableMessage.raw("Synchronization server does not exist in " + getHostPort(ctx)));
+      logger.info(LocalizableMessage.raw(
+          "Synchronization server does not exist in " + getHostPort(ctx.getLdapContext())));
     }
     if (sync == null)
     {
@@ -6820,15 +6914,13 @@
    * replication server will communicate with.
    * @throws OpenDsException if there is an error updating the configuration.
    */
-  private void updateReplicationServer(InitialLdapContext ctx,
-      Set<String> replicationServers) throws OpenDsException
+  private void updateReplicationServer(ConnectionWrapper ctx,
+      Set<String> replicationServers) throws Exception
   {
     print(formatter.getFormattedWithPoints(
-        INFO_REPLICATION_ENABLE_UPDATING_REPLICATION_SERVER.get(getHostPort(ctx))));
+        INFO_REPLICATION_ENABLE_UPDATING_REPLICATION_SERVER.get(getHostPort(ctx.getLdapContext()))));
 
-    ManagementContext mCtx = LDAPManagementContext.createFromContext(
-        JNDIDirContextAdaptor.adapt(ctx));
-    RootCfgClient root = mCtx.getRootConfiguration();
+    RootCfgClient root = ctx.getRootConfiguration();
 
     ReplicationSynchronizationProviderCfgClient sync =
       (ReplicationSynchronizationProviderCfgClient)
@@ -6889,10 +6981,10 @@
    * that will be used by the newly configured replication server.
    * @throws OpenDsException if there is an error updating the configuration.
    */
-  private void configureToReplicateBaseDN(InitialLdapContext ctx,
+  private void configureToReplicateBaseDN(ConnectionWrapper ctx,
       String baseDN,
       Set<String> replicationServers,
-      Set<Integer> usedReplicationDomainIds) throws OpenDsException
+      Set<Integer> usedReplicationDomainIds) throws Exception
   {
     boolean userSpecifiedAdminBaseDN = false;
     List<String> l = argParser.getBaseDNs();
@@ -6904,16 +6996,14 @@
         && areDnsEqual(baseDN, ADSContext.getAdministrationSuffixDN()))
     {
       print(formatter.getFormattedWithPoints(
-          INFO_REPLICATION_ENABLE_CONFIGURING_ADS.get(getHostPort(ctx))));
+          INFO_REPLICATION_ENABLE_CONFIGURING_ADS.get(getHostPort(ctx.getLdapContext()))));
     }
     else
     {
       print(formatter.getFormattedWithPoints(
-          INFO_REPLICATION_ENABLE_CONFIGURING_BASEDN.get(baseDN, getHostPort(ctx))));
+          INFO_REPLICATION_ENABLE_CONFIGURING_BASEDN.get(baseDN, getHostPort(ctx.getLdapContext()))));
     }
-    ManagementContext mCtx = LDAPManagementContext.createFromContext(
-        JNDIDirContextAdaptor.adapt(ctx));
-    RootCfgClient root = mCtx.getRootConfiguration();
+    RootCfgClient root = ctx.getRootConfiguration();
 
     ReplicationSynchronizationProviderCfgClient sync =
       (ReplicationSynchronizationProviderCfgClient)
@@ -7039,16 +7129,18 @@
     {
       logger.info(LocalizableMessage.raw("Configuring server "+server.getHostPort(true)));
       InitialLdapContext ctx = null;
+      ConnectionWrapper conn = null;
       try
       {
         ctx = getDirContextForServer(cache, s);
+        conn = new ConnectionWrapper(ctx, getConnectTimeout(), getTrustManager(sourceServerCI));
         if (serversToConfigureDomain.contains(s))
         {
-          configureToReplicateBaseDN(ctx, baseDN, repServers, usedIds);
+          configureToReplicateBaseDN(conn, baseDN, repServers, usedIds);
         }
         if (replicationServersToConfigure.contains(s))
         {
-          updateReplicationServer(ctx, allRepServers);
+          updateReplicationServer(conn, allRepServers);
         }
       }
       catch (NamingException ne)
@@ -7057,7 +7149,7 @@
         LocalizableMessage msg = getMessageForException(ne, hostPort);
         throw new ReplicationCliException(msg, ERROR_CONNECTING, ne);
       }
-      catch (OpenDsException ode)
+      catch (Exception ode)
       {
         String hostPort = getHostPort2(s, cache.getPreferredConnections());
         LocalizableMessage msg = getMessageForEnableException(hostPort, baseDN);
@@ -7067,6 +7159,7 @@
       finally
       {
         close(ctx);
+        close(conn);
       }
       alreadyConfiguredServers.add(s.getId());
       alreadyConfiguredReplicationServers.add(s.getId());
@@ -7659,17 +7752,15 @@
     filter.setSearchBaseDNInformation(false);
     ServerLoader loader = new ServerLoader(server.getAdsProperties(), bindDn,
         pwd, getTrustManager(sourceServerCI), getConnectTimeout(), cnx, filter);
-    InitialLdapContext ctx = null;
+    ConnectionWrapper ctx = null;
     String lastBaseDN = null;
     String hostPort = null;
 
     try
     {
-      ctx = loader.createContext();
-      hostPort = getHostPort(ctx);
-      ManagementContext mCtx = LDAPManagementContext.createFromContext(
-          JNDIDirContextAdaptor.adapt(ctx));
-      RootCfgClient root = mCtx.getRootConfiguration();
+      ctx = loader.createConnectionWrapper();
+      hostPort = getHostPort(ctx.getLdapContext());
+      RootCfgClient root = ctx.getRootConfiguration();
       ReplicationSynchronizationProviderCfgClient sync = null;
       try
       {
@@ -7756,7 +7847,7 @@
       LocalizableMessage msg = getMessageForException(ne, hostPort);
       throw new ReplicationCliException(msg, ERROR_CONNECTING, ne);
     }
-    catch (OpenDsException ode)
+    catch (Exception ode)
     {
       if (lastBaseDN != null)
       {
@@ -7786,15 +7877,12 @@
    * @throws ReplicationCliException if there is an error updating the
    * configuration of the server.
    */
-  private void deleteReplicationDomain(InitialLdapContext ctx,
-      String baseDN) throws ReplicationCliException
+  private void deleteReplicationDomain(ConnectionWrapper ctx, String baseDN) throws ReplicationCliException
   {
-    String hostPort = getHostPort(ctx);
+    String hostPort = getHostPort(ctx.getLdapContext());
     try
     {
-      ManagementContext mCtx = LDAPManagementContext.createFromContext(
-          JNDIDirContextAdaptor.adapt(ctx));
-      RootCfgClient root = mCtx.getRootConfiguration();
+      RootCfgClient root = ctx.getRootConfiguration();
       ReplicationSynchronizationProviderCfgClient sync = null;
       try
       {
@@ -7830,7 +7918,7 @@
         }
       }
     }
-    catch (OpenDsException ode)
+    catch (Exception ode)
     {
       LocalizableMessage msg = getMessageForDisableException(hostPort, baseDN);
         throw new ReplicationCliException(msg,
@@ -7840,19 +7928,17 @@
 
   /**
    * Disables the replication server for a given server.
-   * @param ctx the connection to the server.
+   * @param connWrapper the connection to the server.
    * @throws ReplicationCliException if there is an error updating the
    * configuration of the server.
    */
-  private void disableReplicationServer(InitialLdapContext ctx)
+  private void disableReplicationServer(ConnectionWrapper connWrapper)
   throws ReplicationCliException
   {
-    String hostPort = getHostPort(ctx);
+    String hostPort = getHostPort(connWrapper.getLdapContext());
     try
     {
-      ManagementContext mCtx = LDAPManagementContext.createFromContext(
-          JNDIDirContextAdaptor.adapt(ctx));
-      RootCfgClient root = mCtx.getRootConfiguration();
+      RootCfgClient root = connWrapper.getRootConfiguration();
       ReplicationSynchronizationProviderCfgClient sync = null;
       ReplicationServerCfgClient replicationServer = null;
       try
@@ -7883,7 +7969,7 @@
         println();
       }
     }
-    catch (OpenDsException ode)
+    catch (Exception ode)
     {
       throw new ReplicationCliException(
           ERR_REPLICATION_DISABLING_REPLICATIONSERVER.get(hostPort),
@@ -9124,13 +9210,13 @@
   }
 
   private void updateAvailableAndReplicatedSuffixesForOneDomain(
-      InitialLdapContext ctxDomain, InitialLdapContext ctxOther,
+      ConnectionWrapper ctxDomain, ConnectionWrapper ctxOther,
       Set<String> availableSuffixes, Set<String> alreadyReplicatedSuffixes)
   {
-    Collection<ReplicaDescriptor> replicas = getReplicas(ctxDomain);
+    Collection<ReplicaDescriptor> replicas = getReplicas(ctxDomain.getLdapContext());
     int replicationPort = getReplicationPort(ctxOther);
     boolean isReplicationServerConfigured = replicationPort != -1;
-    String replicationServer = getReplicationServer(getHostName(ctxOther), replicationPort);
+    String replicationServer = getReplicationServer(getHostName(ctxOther.getLdapContext()), replicationPort);
     for (ReplicaDescriptor replica : replicas)
     {
       if (!isReplicationServerConfigured)
@@ -9162,16 +9248,16 @@
   }
 
   private void updateAvailableAndReplicatedSuffixesForNoDomain(
-      InitialLdapContext ctx1, InitialLdapContext ctx2,
+      ConnectionWrapper ctx1, ConnectionWrapper ctx2,
       Set<String> availableSuffixes, Set<String> alreadyReplicatedSuffixes)
   {
     int replicationPort1 = getReplicationPort(ctx1);
     boolean isReplicationServer1Configured = replicationPort1 != -1;
-    String replicationServer1 = getReplicationServer(getHostName(ctx1), replicationPort1);
+    String replicationServer1 = getReplicationServer(getHostName(ctx1.getLdapContext()), replicationPort1);
 
     int replicationPort2 = getReplicationPort(ctx2);
     boolean isReplicationServer2Configured = replicationPort2 != -1;
-    String replicationServer2 = getReplicationServer(getHostName(ctx2), replicationPort2);
+    String replicationServer2 = getReplicationServer(getHostName(ctx2.getLdapContext()), replicationPort2);
 
     TopologyCache cache1 = isReplicationServer1Configured ? createTopologyCache(ctx1) : null;
     TopologyCache cache2 = isReplicationServer2Configured ? createTopologyCache(ctx2) : null;
@@ -9194,7 +9280,7 @@
     }
   }
 
-  private TopologyCache createTopologyCache(InitialLdapContext ctx)
+  private TopologyCache createTopologyCache(ConnectionWrapper ctx)
   {
     try
     {
@@ -9203,14 +9289,15 @@
       {
         TopologyCache cache = new TopologyCache(adsContext, getTrustManager(sourceServerCI), getConnectTimeout());
         cache.getFilter().setSearchMonitoringInformation(false);
-        cache.setPreferredConnections(getPreferredConnections(ctx));
+        cache.setPreferredConnections(getPreferredConnections(ctx.getLdapContext()));
         cache.reloadTopology();
         return cache;
       }
     }
     catch (Throwable t)
     {
-      logger.warn(LocalizableMessage.raw("Error loading topology cache in " + getLdapUrl(ctx) + ": " + t, t));
+      logger.warn(LocalizableMessage.raw("Error loading topology cache in "
+          + getLdapUrl(ctx.getLdapContext()) + ": " + t, t));
     }
     return null;
   }
@@ -9298,9 +9385,9 @@
     createTopologyCache(adsCtx1, uData, suffixes);
     createTopologyCache(adsCtx2, uData, suffixes);
 
-    int repPort1 = getReplicationPort(adsCtx1.getDirContext());
+    int repPort1 = getReplicationPort(adsCtx1.getConnection());
     String repServer1 =  getReplicationServer(server1.getHostName(), repPort1);
-    int repPort2 = getReplicationPort(adsCtx2.getDirContext());
+    int repPort2 = getReplicationPort(adsCtx2.getConnection());
     String repServer2 =  getReplicationServer(server2.getHostName(), repPort2);
     for (String baseDN : uData.getBaseDNs())
     {

--
Gitblit v1.10.0