protected int installJava(Connection conn, PrintStream logger, Iterable<String> javaVersion)
     throws IOException, InterruptedException {
   int result = 1;
   for (String version : javaVersion) {
     result = conn.exec(getInstallCommand(version), logger);
     if (result == 0) {
       return result;
     }
   }
   return result;
 }
  private boolean installJava(final PrintStream logger, final Connection conn)
      throws IOException, InterruptedException {
    logger.println("Verifying that java exists");
    if (conn.exec("java -fullversion", logger) != 0) {
      logger.println("Try to install one of these Java-versions: " + VALID_VERSIONS);
      // TODO Web UI to let users install a custom java (or any other type of tool) package.
      logger.println("Trying to find a working package manager");
      for (JavaInstaller installer : INSTALLERS) {
        if (!installer.isUsable(conn, logger)) {
          continue;
        }
        if (installer.installJava(conn, logger, VALID_VERSIONS) == 0) {
          return true;
        }
      }

      logger.println("Java could not be installed using any of the supported package managers");
      return false;
    }
    return true;
  }
  private boolean runInitScript(
      final Computer computer, final PrintStream logger, final Connection conn, final SCPClient scp)
      throws IOException, InterruptedException {

    String initScript = Util.fixEmptyAndTrim(computer.getNode().getInitScript());

    if (initScript == null) {
      return true;
    }
    if (conn.exec("test -e ~/.hudson-run-init", logger) == 0) {
      return true;
    }

    logger.println("Executing init script");
    scp.put(initScript.getBytes("UTF-8"), "init.sh", "/tmp", "0700");
    Session session = conn.openSession();
    session.requestDumbPTY(); // so that the remote side bundles stdout and stderr
    session.execCommand(buildUpCommand(computer, "/tmp/init.sh"));

    session.getStdin().close(); // nothing to write here
    session.getStderr().close(); // we are not supposed to get anything from stderr
    IOUtils.copy(session.getStdout(), logger);

    int exitStatus = waitCompletion(session);
    if (exitStatus != 0) {
      logger.println("init script failed: exit code=" + exitStatus);
      return false;
    }
    session.close();

    // Needs a tty to run sudo.
    session = conn.openSession();
    session.requestDumbPTY(); // so that the remote side bundles stdout and stderr
    session.execCommand(buildUpCommand(computer, "touch ~/.hudson-run-init"));
    session.close();

    return true;
  }
 private boolean checkCommand(Connection conn, PrintStream logger, String command)
     throws IOException, InterruptedException {
   logger.println("Checking: " + command);
   return conn.exec(command, logger) == 0;
 }