From f3f9f37cd05c81867e2852746b169132d8f1b598 Mon Sep 17 00:00:00 2001
From: Jean-Noël Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Fri, 01 Jul 2016 14:30:12 +0000
Subject: [PATCH] Partial OPENDJ-2625 Convert all code that uses JNDI to use the SDK instead

---
 opendj-server-legacy/src/main/java/org/opends/quicksetup/util/ServerController.java |  348 ++++++++++++++++++++++++++++++----------------------------
 1 files changed, 180 insertions(+), 168 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/quicksetup/util/ServerController.java b/opendj-server-legacy/src/main/java/org/opends/quicksetup/util/ServerController.java
index 62a980c..888423f 100644
--- a/opendj-server-legacy/src/main/java/org/opends/quicksetup/util/ServerController.java
+++ b/opendj-server-legacy/src/main/java/org/opends/quicksetup/util/ServerController.java
@@ -20,18 +20,23 @@
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 
 import javax.naming.NamingException;
-import javax.naming.ldap.InitialLdapContext;
 
 import org.forgerock.i18n.LocalizableMessage;
 import org.forgerock.i18n.LocalizableMessageBuilder;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
-import org.opends.quicksetup.*;
+import org.opends.admin.ads.util.ConnectionWrapper;
+import org.opends.admin.ads.util.PreferredConnection.Type;
+import org.opends.quicksetup.Application;
+import org.opends.quicksetup.ApplicationException;
+import org.opends.quicksetup.Configuration;
+import org.opends.quicksetup.Installation;
+import org.opends.quicksetup.ReturnCode;
 import org.opends.quicksetup.installer.InstallerHelper;
 import org.opends.server.util.SetupUtils;
-import org.opends.server.util.StaticUtils;
 
 import com.forgerock.opendj.cli.CliConstants;
 
@@ -39,8 +44,8 @@
 import static com.forgerock.opendj.cli.Utils.*;
 import static com.forgerock.opendj.util.OperatingSystem.*;
 
-import static org.opends.admin.ads.util.ConnectionUtils.*;
 import static org.opends.messages.QuickSetupMessages.*;
+import static org.opends.server.util.CollectionUtils.*;
 
 /** Class used to manipulate an OpenDS server. */
 public class ServerController {
@@ -298,13 +303,13 @@
 
   /**
    * This methods starts the server.
-   * @param verify boolean indicating whether this method will attempt to
+   * @param verifyCanConnect boolean indicating whether this method will attempt to
    * connect to the server after starting to verify that it is listening.
    * @param suppressOutput indicating that ouput to standard output streams
    * from the server should be suppressed.
    * @throws org.opends.quicksetup.ApplicationException if something goes wrong.
    */
-  private void startServer(boolean verify, boolean suppressOutput)
+  private void startServer(boolean verifyCanConnect, boolean suppressOutput)
   throws ApplicationException
   {
     if (suppressOutput && !StandardOutputSuppressor.isSuppressed()) {
@@ -324,173 +329,14 @@
         mb.append(application.getLineBreak());
         application.notifyListeners(mb.toMessage());
       }
-      logger.info(LocalizableMessage.raw("starting server"));
 
-      ArrayList<String> argList = new ArrayList<>();
-      argList.add(Utils.getScriptPath(
-          Utils.getPath(installation.getServerStartCommandFile())));
-      argList.add("--timeout");
-      argList.add("0");
-      String[] args = new String[argList.size()];
-      argList.toArray(args);
-      ProcessBuilder pb = new ProcessBuilder(args);
-      pb.directory(installation.getBinariesDirectory());
-      Map<String, String> env = pb.environment();
-      env.put(SetupUtils.OPENDJ_JAVA_HOME, System.getProperty("java.home"));
-      env.remove(SetupUtils.OPENDJ_JAVA_ARGS);
-
-      // Upgrader's classpath contains jars located in the temporary
-      // directory that we don't want locked by the directory server
-      // when it starts.  Since we're just calling the start-ds script
-      // it will figure out the correct classpath for the server.
-      env.remove("CLASSPATH");
       try
       {
-        String startedId = getStartedId();
-        Process process = pb.start();
+        startServerViaAnotherProcess();
 
-        BufferedReader err =
-          new BufferedReader(new InputStreamReader(process.getErrorStream()));
-        BufferedReader out =
-          new BufferedReader(new InputStreamReader(process.getInputStream()));
-
-        StartReader errReader = new StartReader(err, startedId, true);
-        StartReader outputReader = new StartReader(out, startedId, false);
-
-        int returnValue = process.waitFor();
-
-        logger.info(LocalizableMessage.raw("start-ds return value: "+returnValue));
-
-        if (returnValue != 0)
+        if (verifyCanConnect)
         {
-          throw new ApplicationException(ReturnCode.START_ERROR,
-              INFO_ERROR_STARTING_SERVER_CODE.get(returnValue),
-              null);
-        }
-        if (outputReader.isFinished())
-        {
-          logger.info(LocalizableMessage.raw("Output reader finished."));
-        }
-        if (errReader.isFinished())
-        {
-          logger.info(LocalizableMessage.raw("Error reader finished."));
-        }
-        if (!outputReader.startedIdFound() && !errReader.startedIdFound())
-        {
-          logger.warn(LocalizableMessage.raw("Started ID could not be found"));
-        }
-
-        // Check if something wrong occurred reading the starting of the server
-        ApplicationException ex = errReader.getException();
-        if (ex == null)
-        {
-          ex = outputReader.getException();
-        }
-        if (ex != null)
-        {
-          // This is meaningless right now since we throw
-          // the exception below, but in case we change out
-          // minds later or add the ability to return exceptions
-          // in the output only instead of throwing...
-          throw ex;
-        } else if (verify)
-        {
-          /*
-           * There are no exceptions from the readers and they are marked as
-           * finished. So it seems that everything went fine.
-           *
-           * However we can have issues with the firewalls or do not have rights
-           * to connect or since the startup process is asynchronous we will
-           * have to wait for the databases and the listeners to initialize.
-           * Just check if we can connect to the server.
-           * Try 30 times with an interval of 3 seconds between try.
-           */
-          boolean connected = false;
-          Configuration config = installation.getCurrentConfiguration();
-          int port = config.getAdminConnectorPort();
-
-          // See if the application has prompted for credentials.  If
-          // not we'll just try to connect anonymously.
-          String userDn = null;
-          String userPw = null;
-          if (application != null) {
-            userDn = application.getUserData().getDirectoryManagerDn();
-            userPw = application.getUserData().getDirectoryManagerPwd();
-          }
-          if (userDn == null || userPw == null) {
-            userDn = null;
-            userPw = null;
-          }
-
-          InitialLdapContext ctx = null;
-          for (int i=0; i<50 && !connected; i++)
-          {
-            String hostName = null;
-            if (application != null)
-            {
-              hostName = application.getUserData().getHostName();
-            }
-            if (hostName == null)
-            {
-              hostName = "localhost";
-            }
-
-            int dig = i % 10;
-
-            if ((dig == 3 || dig == 4) && !"localhost".equals(hostName))
-            {
-              // Try with local host. This might be necessary in certain
-              // network configurations.
-              hostName = "localhost";
-            }
-
-            if (dig == 5 || dig == 6)
-            {
-              // Try with 0.0.0.0. This might be necessary in certain
-              // network configurations.
-              hostName = "0.0.0.0";
-            }
-
-            hostName = getHostNameForLdapUrl(hostName);
-            String ldapUrl = "ldaps://"+hostName+":" + port;
-            try
-            {
-              int timeout = CliConstants.DEFAULT_LDAP_CONNECT_TIMEOUT;
-              if (application != null && application.getUserData() != null)
-              {
-                timeout = application.getUserData().getConnectTimeout();
-              }
-              ctx = createLdapsContext(ldapUrl, userDn, userPw, timeout,
-                  null, null, null);
-              connected = true;
-            }
-            catch (NamingException ne)
-            {
-              logger.warn(LocalizableMessage.raw("Could not connect to server: "+ne, ne));
-            }
-            finally
-            {
-              StaticUtils.close(ctx);
-            }
-            if (!connected)
-            {
-              try
-              {
-                Thread.sleep(3000);
-              }
-              catch (Throwable t)
-              {
-                 // do nothing
-              }
-            }
-          }
-          if (!connected)
-          {
-            final LocalizableMessage msg = isWindows()
-                ? INFO_ERROR_STARTING_SERVER_IN_WINDOWS.get(port)
-                : INFO_ERROR_STARTING_SERVER_IN_UNIX.get(port);
-            throw new ApplicationException(ReturnCode.START_ERROR, msg, null);
-          }
+          verifyCanConnect();
         }
       } catch (IOException | InterruptedException ioe)
       {
@@ -513,6 +359,172 @@
     }
   }
 
+  private void startServerViaAnotherProcess() throws IOException, InterruptedException, ApplicationException
+  {
+    logger.info(LocalizableMessage.raw("starting server"));
+
+    List<String> argList = newArrayList(
+        Utils.getScriptPath(Utils.getPath(installation.getServerStartCommandFile())),
+        "--timeout", "0");
+
+    ProcessBuilder pb = new ProcessBuilder(argList.toArray(new String[argList.size()]));
+    pb.directory(installation.getBinariesDirectory());
+    Map<String, String> env = pb.environment();
+    env.put(SetupUtils.OPENDJ_JAVA_HOME, System.getProperty("java.home"));
+    env.remove(SetupUtils.OPENDJ_JAVA_ARGS);
+
+    // Upgrader's classpath contains jars located in the temporary
+    // directory that we don't want locked by the directory server
+    // when it starts. Since we're just calling the start-ds script
+    // it will figure out the correct classpath for the server.
+    env.remove("CLASSPATH");
+
+    String startedId = getStartedId();
+    Process process = pb.start();
+
+    BufferedReader err = new BufferedReader(new InputStreamReader(process.getErrorStream()));
+    BufferedReader out = new BufferedReader(new InputStreamReader(process.getInputStream()));
+
+    StartReader errReader = new StartReader(err, startedId, true);
+    StartReader outputReader = new StartReader(out, startedId, false);
+
+    int returnValue = process.waitFor();
+
+    logger.info(LocalizableMessage.raw("start-ds return value: " + returnValue));
+
+    if (returnValue != 0)
+    {
+      throw new ApplicationException(ReturnCode.START_ERROR, INFO_ERROR_STARTING_SERVER_CODE.get(returnValue), null);
+    }
+    if (outputReader.isFinished())
+    {
+      logger.info(LocalizableMessage.raw("Output reader finished."));
+    }
+    if (errReader.isFinished())
+    {
+      logger.info(LocalizableMessage.raw("Error reader finished."));
+    }
+    if (!outputReader.startedIdFound() && !errReader.startedIdFound())
+    {
+      logger.warn(LocalizableMessage.raw("Started ID could not be found"));
+    }
+
+    // Check if something wrong occurred reading the starting of the server
+    ApplicationException ex = errReader.getException();
+    if (ex == null)
+    {
+      ex = outputReader.getException();
+    }
+    if (ex != null)
+    {
+      // This is meaningless right now since we throw
+      // the exception below, but in case we change out
+      // minds later or add the ability to return exceptions
+      // in the output only instead of throwing...
+      throw ex;
+    }
+  }
+
+  private void verifyCanConnect() throws IOException, ApplicationException
+  {
+    /*
+     * There are no exceptions from the readers and they are marked as
+     * finished. So it seems that everything went fine.
+     *
+     * However we can have issues with the firewalls or do not have rights
+     * to connect or since the startup process is asynchronous we will
+     * have to wait for the databases and the listeners to initialize.
+     * Just check if we can connect to the server.
+     * Try 30 times with an interval of 3 seconds between try.
+     */
+    boolean connected = false;
+    Configuration config = installation.getCurrentConfiguration();
+    int port = config.getAdminConnectorPort();
+
+    // See if the application has prompted for credentials.  If
+    // not we'll just try to connect anonymously.
+    String userDn = null;
+    String userPw = null;
+    if (application != null) {
+      userDn = application.getUserData().getDirectoryManagerDn();
+      userPw = application.getUserData().getDirectoryManagerPwd();
+    }
+    if (userDn == null || userPw == null) {
+      userDn = null;
+      userPw = null;
+    }
+
+    for (int i=0; i<50 && !connected; i++)
+    {
+      String hostName = getHostName(i);
+      String ldapUrl = "ldaps://"+hostName+":" + port;
+      try
+      {
+        int timeout = CliConstants.DEFAULT_LDAP_CONNECT_TIMEOUT;
+        if (application != null && application.getUserData() != null)
+        {
+          timeout = application.getUserData().getConnectTimeout();
+        }
+        try (ConnectionWrapper conn = new ConnectionWrapper(ldapUrl, Type.LDAPS, userDn, userPw, timeout, null))
+        {
+          return;
+        }
+      }
+      catch (NamingException ne)
+      {
+        logger.warn(LocalizableMessage.raw("Could not connect to server: "+ne, ne));
+      }
+
+      try
+      {
+        // not connected yet
+        Thread.sleep(3000);
+      }
+      catch (Throwable t)
+      {
+        // do nothing
+      }
+    }
+
+    // Could not connect
+    final LocalizableMessage msg = isWindows()
+        ? INFO_ERROR_STARTING_SERVER_IN_WINDOWS.get(port)
+        : INFO_ERROR_STARTING_SERVER_IN_UNIX.get(port);
+    throw new ApplicationException(ReturnCode.START_ERROR, msg, null);
+  }
+
+  private String getHostName(int i)
+  {
+    String hostName = null;
+    if (application != null)
+    {
+      hostName = application.getUserData().getHostName();
+    }
+    if (hostName == null)
+    {
+      hostName = "localhost";
+    }
+
+    int dig = i % 10;
+
+    if ((dig == 3 || dig == 4) && !"localhost".equals(hostName))
+    {
+      // Try with local host. This might be necessary in certain
+      // network configurations.
+      hostName = "localhost";
+    }
+
+    if (dig == 5 || dig == 6)
+    {
+      // Try with 0.0.0.0. This might be necessary in certain
+      // network configurations.
+      hostName = "0.0.0.0";
+    }
+
+    hostName = getHostNameForLdapUrl(hostName);
+    return hostName;
+  }
+
   /**
    * This class is used to read the standard error and standard output of the
    * Stop process.

--
Gitblit v1.10.0