private static void logEndTime(CommandLine command, long startTime) {
   log.info(
       "Completed "
           + command.getExecutable()
           + " in "
           + (System.currentTimeMillis() - startTime)
           + "ms");
 }
  /**
   * Stopping a pumper thread. The implementation actually waits longer than specified in 'timeout'
   * to detect if the timeout was indeed exceeded. If the timeout was exceeded an IOException is
   * created to be thrown to the caller.
   *
   * @param thread the thread to be stopped
   * @param timeout the time in ms to wait to join
   */
  protected void stopThread(final Thread thread, final long timeout) {

    if (thread != null) {
      try {
        if (timeout == 0) {
          thread.join();
        } else {
          final long timeToWait = timeout + STOP_TIMEOUT_ADDITION;
          final long startTime = System.currentTimeMillis();
          thread.join(timeToWait);
          if (!(System.currentTimeMillis() < startTime + timeToWait)) {
            final String msg = "The stop timeout of " + timeout + " ms was exceeded";
            caught = new ExecuteException(msg, Executor.INVALID_EXITVALUE);
          }
        }
      } catch (final InterruptedException e) {
        thread.interrupt();
      }
    }
  }
 public static long logStartInfo(CommandLine command, File projectRoot) {
   log.info(
       "Starting " + dirPath(projectRoot) + "> " + StringUtils.join(command.toStrings(), " "));
   return System.currentTimeMillis();
 }