You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by zh...@apache.org on 2017/08/11 17:26:49 UTC

[19/23] geode git commit: GEODE-3413: overhaul launcher and process classes and tests

http://git-wip-us.apache.org/repos/asf/geode/blob/894f3ee7/geode-core/src/main/java/org/apache/geode/internal/process/ProcessStreamReader.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/internal/process/ProcessStreamReader.java b/geode-core/src/main/java/org/apache/geode/internal/process/ProcessStreamReader.java
index b514c6a..39b900a 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/process/ProcessStreamReader.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/process/ProcessStreamReader.java
@@ -14,15 +14,12 @@
  */
 package org.apache.geode.internal.process;
 
-import java.io.BufferedReader;
-import java.io.IOException;
+import static org.apache.commons.lang.Validate.isTrue;
+import static org.apache.commons.lang.Validate.notNull;
+
 import java.io.InputStream;
-import java.io.InputStreamReader;
 
 import org.apache.commons.lang.SystemUtils;
-import org.apache.logging.log4j.Logger;
-
-import org.apache.geode.internal.logging.LogService;
 
 /**
  * Reads the output stream of a Process.
@@ -30,8 +27,8 @@ import org.apache.geode.internal.logging.LogService;
  * @since GemFire 7.0
  */
 public abstract class ProcessStreamReader implements Runnable {
-  private static final int DEFAULT_PROCESS_OUTPUT_WAIT_TIME_MILLISECONDS = 5000;
-  private static final Logger logger = LogService.getLogger();
+
+  private static final int DEFAULT_PROCESS_OUTPUT_WAIT_TIME_MILLIS = 5000;
 
   protected final Process process;
   protected final InputStream inputStream;
@@ -40,8 +37,11 @@ public abstract class ProcessStreamReader implements Runnable {
   private Thread thread;
 
   protected ProcessStreamReader(final Builder builder) {
+    notNull(builder, "Invalid builder '" + builder + "' specified");
+
     this.process = builder.process;
     this.inputStream = builder.inputStream;
+
     if (builder.inputListener == null) {
       this.inputListener = new InputListener() {
         @Override
@@ -59,44 +59,13 @@ public abstract class ProcessStreamReader implements Runnable {
     }
   }
 
-  @Override
-  public void run() {
-    final boolean isDebugEnabled = logger.isDebugEnabled();
-    if (isDebugEnabled) {
-      logger.debug("Running {}", this);
-    }
-    BufferedReader reader = null;
-    try {
-      reader = new BufferedReader(new InputStreamReader(inputStream));
-      String line;
-      while ((line = reader.readLine()) != null) {
-        this.inputListener.notifyInputLine(line);
-      }
-    } catch (IOException e) {
-      if (isDebugEnabled) {
-        logger.debug("Failure reading from buffered input stream: {}", e.getMessage(), e);
-      }
-    } finally {
-      try {
-        reader.close();
-      } catch (IOException e) {
-        if (isDebugEnabled) {
-          logger.debug("Failure closing buffered input stream reader: {}", e.getMessage(), e);
-        }
-      }
-      if (isDebugEnabled) {
-        logger.debug("Terminating {}", this);
-      }
-    }
-  }
-
   public ProcessStreamReader start() {
     synchronized (this) {
-      if (this.thread == null) {
-        this.thread = new Thread(this, createThreadName());
-        this.thread.setDaemon(true);
-        this.thread.start();
-      } else if (this.thread.isAlive()) {
+      if (thread == null) {
+        thread = new Thread(this, createThreadName());
+        thread.setDaemon(true);
+        thread.start();
+      } else if (thread.isAlive()) {
         throw new IllegalStateException(this + " has already started");
       } else {
         throw new IllegalStateException(this + " was stopped and cannot be restarted");
@@ -107,33 +76,23 @@ public abstract class ProcessStreamReader implements Runnable {
 
   public ProcessStreamReader stop() {
     synchronized (this) {
-      if (this.thread != null && this.thread.isAlive()) {
-        this.thread.interrupt();
-      } else if (this.thread != null) {
-        if (logger.isDebugEnabled()) {
-          logger.debug("{} has already been stopped", this);
-        }
-      } else {
-        if (logger.isDebugEnabled()) {
-          logger.debug("{} has not been started", this);
-        }
+      if (thread != null && thread.isAlive()) {
+        thread.interrupt();
       }
     }
     return this;
   }
 
   public ProcessStreamReader stopAsync(final long delayMillis) {
-    Runnable delayedStop = new Runnable() {
-      @Override
-      public void run() {
-        try {
-          Thread.sleep(delayMillis);
-        } catch (InterruptedException e) {
-        } finally {
-          stop();
-        }
+    Runnable delayedStop = () -> {
+      try {
+        Thread.sleep(delayMillis);
+      } catch (InterruptedException ignored) {
+      } finally {
+        stop();
       }
     };
+
     String threadName =
         getClass().getSimpleName() + " stopAfterDelay Thread @" + Integer.toHexString(hashCode());
     Thread thread = new Thread(delayedStop, threadName);
@@ -144,14 +103,14 @@ public abstract class ProcessStreamReader implements Runnable {
 
   public boolean isRunning() {
     synchronized (this) {
-      if (this.thread != null) {
-        return this.thread.isAlive();
+      if (thread != null) {
+        return thread.isAlive();
       }
     }
     return false;
   }
 
-  public void join() throws InterruptedException {
+  public ProcessStreamReader join() throws InterruptedException {
     Thread thread;
     synchronized (this) {
       thread = this.thread;
@@ -159,9 +118,10 @@ public abstract class ProcessStreamReader implements Runnable {
     if (thread != null) {
       thread.join();
     }
+    return this;
   }
 
-  public void join(final long millis) throws InterruptedException {
+  public ProcessStreamReader join(final long millis) throws InterruptedException {
     Thread thread;
     synchronized (this) {
       thread = this.thread;
@@ -169,9 +129,10 @@ public abstract class ProcessStreamReader implements Runnable {
     if (thread != null) {
       thread.join(millis);
     }
+    return this;
   }
 
-  public void join(final long millis, final int nanos) throws InterruptedException {
+  public ProcessStreamReader join(final long millis, final int nanos) throws InterruptedException {
     Thread thread;
     synchronized (this) {
       thread = this.thread;
@@ -179,47 +140,44 @@ public abstract class ProcessStreamReader implements Runnable {
     if (thread != null) {
       thread.join(millis, nanos);
     }
+    return this;
   }
 
   @Override
   public String toString() {
-    final StringBuilder sb = new StringBuilder(getClass().getSimpleName());
+    StringBuilder sb = new StringBuilder(getClass().getSimpleName());
     sb.append(" Thread").append(" #").append(System.identityHashCode(this));
-    sb.append(" alive=").append(isRunning()); // this.thread == null ? false :
-                                              // this.thread.isAlive());
-    sb.append(" listener=").append(this.inputListener);
+    sb.append(" alive=").append(isRunning());
+    sb.append(" listener=").append(inputListener);
     return sb.toString();
   }
 
   private String createThreadName() {
-    return getClass().getSimpleName() + "@" + Integer.toHexString(hashCode());
+    return getClass().getSimpleName() + '@' + Integer.toHexString(hashCode());
   }
 
   /**
    * Defines the callback for lines of output found in the stream.
    */
-  public static interface InputListener {
-    public void notifyInputLine(String line);
+  public interface InputListener {
+    void notifyInputLine(final String line);
   }
 
   /** Default ReadingMode is BLOCKING */
-  public static enum ReadingMode {
-    BLOCKING, NON_BLOCKING;
-  }
-
-  public static String waitAndCaptureProcessStandardOutputStream(final Process process) {
-    return waitAndCaptureProcessStandardOutputStream(process,
-        DEFAULT_PROCESS_OUTPUT_WAIT_TIME_MILLISECONDS);
+  public enum ReadingMode {
+    BLOCKING, NON_BLOCKING
   }
 
-  public static String waitAndCaptureProcessStandardOutputStream(final Process process,
+  private static String waitAndCaptureProcessStandardOutputStream(final Process process,
       final long waitTimeMilliseconds) {
+    notNull(process, "Invalid process '" + process + "' specified");
+
     return waitAndCaptureProcessStream(process, process.getInputStream(), waitTimeMilliseconds);
   }
 
   public static String waitAndCaptureProcessStandardErrorStream(final Process process) {
     return waitAndCaptureProcessStandardErrorStream(process,
-        DEFAULT_PROCESS_OUTPUT_WAIT_TIME_MILLISECONDS);
+        DEFAULT_PROCESS_OUTPUT_WAIT_TIME_MILLIS);
   }
 
   public static String waitAndCaptureProcessStandardErrorStream(final Process process,
@@ -228,8 +186,8 @@ public abstract class ProcessStreamReader implements Runnable {
   }
 
   private static String waitAndCaptureProcessStream(final Process process,
-      final InputStream processInputStream, long waitTimeMilliseconds) {
-    final StringBuffer buffer = new StringBuffer();
+      final InputStream processInputStream, final long waitTimeMilliseconds) {
+    StringBuffer buffer = new StringBuffer();
 
     InputListener inputListener = line -> {
       buffer.append(line);
@@ -242,7 +200,7 @@ public abstract class ProcessStreamReader implements Runnable {
     try {
       reader.start();
 
-      final long endTime = (System.currentTimeMillis() + waitTimeMilliseconds);
+      long endTime = System.currentTimeMillis() + waitTimeMilliseconds;
 
       while (System.currentTimeMillis() < endTime) {
         try {
@@ -259,15 +217,16 @@ public abstract class ProcessStreamReader implements Runnable {
 
   /**
    * Builds a ProcessStreamReader.
-   * 
+   *
    * @since GemFire 8.2
    */
   public static class Builder {
-    protected Process process;
-    protected InputStream inputStream;
-    protected InputListener inputListener;
-    protected long continueReadingMillis = 0;
-    protected ReadingMode readingMode = ReadingMode.BLOCKING;
+
+    final Process process;
+    InputStream inputStream;
+    InputListener inputListener;
+    long continueReadingMillis = 0;
+    ReadingMode readingMode = ReadingMode.BLOCKING;
 
     public Builder(final Process process) {
       this.process = process;
@@ -297,16 +256,12 @@ public abstract class ProcessStreamReader implements Runnable {
     }
 
     public ProcessStreamReader build() {
-      if (process == null) {
-        throw new NullPointerException("process may not be null");
-      }
-      if (inputStream == null) {
-        throw new NullPointerException("inputStream may not be null");
-      }
-      if (continueReadingMillis < 0) {
-        throw new IllegalArgumentException("continueReadingMillis must zero or positive");
-      }
-      switch (this.readingMode) {
+      notNull(process, "Invalid process '" + process + "' specified");
+      notNull(inputStream, "Invalid inputStream '" + inputStream + "' specified");
+      isTrue(continueReadingMillis >= 0,
+          "Invalid continueReadingMillis '" + continueReadingMillis + "' specified");
+
+      switch (readingMode) {
         case NON_BLOCKING:
           return new NonBlockingProcessStreamReader(this);
         default:

http://git-wip-us.apache.org/repos/asf/geode/blob/894f3ee7/geode-core/src/main/java/org/apache/geode/internal/process/ProcessTerminatedAbnormallyException.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/internal/process/ProcessTerminatedAbnormallyException.java b/geode-core/src/main/java/org/apache/geode/internal/process/ProcessTerminatedAbnormallyException.java
deleted file mode 100644
index 510353c..0000000
--- a/geode-core/src/main/java/org/apache/geode/internal/process/ProcessTerminatedAbnormallyException.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
- * agreements. See the NOTICE file distributed with this work for additional information regarding
- * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License. You may obtain a
- * copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package org.apache.geode.internal.process;
-
-import org.apache.geode.GemFireException;
-
-/**
- * The ProcessTerminatedAbnormallyException class is a GemFireException (or RuntimeException)
- * indicating that a process terminated abnormally, and it's exit code is captured along with this
- * RuntimeException.
- * </p>
- * 
- * @see org.apache.geode.GemFireException
- * @since GemFire 7.0
- */
-public class ProcessTerminatedAbnormallyException extends GemFireException {
-  private static final long serialVersionUID = -1181367425266595492L;
-  private final int exitValue;
-
-  /**
-   * Constructs an instance of the ProcessTerminatedAbnormallyException class with the given exit
-   * value of the process.
-   * </p>
-   * 
-   * @param exitValue an integer value indicating the exit value of the terminated process.
-   */
-  public ProcessTerminatedAbnormallyException(final int exitValue) {
-    this.exitValue = exitValue;
-  }
-
-  /**
-   * Constructs an instance of the ProcessTerminatedAbnormallyException class with the given exit
-   * value of the process and a message indicating the reason of the abnormal termination.
-   * </p>
-   * 
-   * @param exitValue an integer value indicating the exit value of the terminated process.
-   * @param message a String indicating the reason the process terminated abnormally.
-   */
-  public ProcessTerminatedAbnormallyException(final int exitValue, final String message) {
-    super(message);
-    this.exitValue = exitValue;
-  }
-
-  /**
-   * Constructs an instance of the ProcessTerminatedAbnormallyException class with the given exit
-   * value of the process and a Throwable representing the underlying cause of the process
-   * termination.
-   * </p>
-   * 
-   * @param exitValue an integer value indicating the exit value of the terminated process.
-   * @param cause a Throwable encapsulating the undelrying cause of the process termination.
-   */
-  public ProcessTerminatedAbnormallyException(final int exitValue, final Throwable cause) {
-    super(cause);
-    this.exitValue = exitValue;
-  }
-
-  /**
-   * Constructs an instance of the ProcessTerminatedAbnormallyException class with the given exit
-   * value of the process as well as a message indicating the reason of the abnormal termination
-   * along with a Throwable representing the underlying cause of the process termination.
-   * </p>
-   * 
-   * @param exitValue an integer value indicating the exit value of the terminated process.
-   * @param message a String indicating the reason the process terminated abnormally.
-   * @param cause a Throwable encapsulating the undelrying cause of the process termination.
-   */
-  public ProcessTerminatedAbnormallyException(final int exitValue, final String message,
-      final Throwable cause) {
-    super(message, cause);
-    this.exitValue = exitValue;
-  }
-
-  /**
-   * Gets the exit value returned by the process when it terminated.
-   * </p>
-   * 
-   * @return an integer value indicating the exit value of the terminated process.
-   */
-  public int getExitValue() {
-    return exitValue;
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/geode/blob/894f3ee7/geode-core/src/main/java/org/apache/geode/internal/process/ProcessType.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/internal/process/ProcessType.java b/geode-core/src/main/java/org/apache/geode/internal/process/ProcessType.java
index b15030d..86f9dc1 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/process/ProcessType.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/process/ProcessType.java
@@ -14,6 +14,8 @@
  */
 package org.apache.geode.internal.process;
 
+import static org.apache.commons.lang.StringUtils.EMPTY;
+
 import org.apache.geode.distributed.internal.DistributionConfig;
 
 /**
@@ -25,7 +27,7 @@ import org.apache.geode.distributed.internal.DistributionConfig;
 public enum ProcessType {
   LOCATOR("LOCATOR", "vf.gf.locator"), SERVER("SERVER", "vf.gf.server");
 
-  public static final String TEST_PREFIX_PROPERTY =
+  public static final String PROPERTY_TEST_PREFIX =
       DistributionConfig.GEMFIRE_PREFIX + "test.ProcessType.TEST_PREFIX";
 
   private static final String SUFFIX_PID = "pid";
@@ -36,33 +38,33 @@ public enum ProcessType {
   private final String name;
   private final String fileName;
 
-  private ProcessType(final String name, final String fileName) {
+  ProcessType(final String name, final String fileName) {
     this.name = name;
     this.fileName = fileName;
   }
 
   public String getPidFileName() {
-    return new StringBuilder(System.getProperty(TEST_PREFIX_PROPERTY, "")).append(this.fileName)
-        .append(".").append(SUFFIX_PID).toString();
+    return new StringBuilder(System.getProperty(PROPERTY_TEST_PREFIX, EMPTY)).append(fileName)
+        .append('.').append(SUFFIX_PID).toString();
   }
 
   public String getStopRequestFileName() {
-    return new StringBuilder(System.getProperty(TEST_PREFIX_PROPERTY, "")).append(this.fileName)
-        .append(".").append(SUFFIX_STOP_REQUEST).toString();
+    return new StringBuilder(System.getProperty(PROPERTY_TEST_PREFIX, EMPTY)).append(fileName)
+        .append('.').append(SUFFIX_STOP_REQUEST).toString();
   }
 
   public String getStatusRequestFileName() {
-    return new StringBuilder(System.getProperty(TEST_PREFIX_PROPERTY, "")).append(this.fileName)
-        .append(".").append(SUFFIX_STATUS_REQUEST).toString();
+    return new StringBuilder(System.getProperty(PROPERTY_TEST_PREFIX, EMPTY)).append(fileName)
+        .append('.').append(SUFFIX_STATUS_REQUEST).toString();
   }
 
   public String getStatusFileName() {
-    return new StringBuilder(System.getProperty(TEST_PREFIX_PROPERTY, "")).append(this.fileName)
-        .append(".").append(SUFFIX_STATUS).toString();
+    return new StringBuilder(System.getProperty(PROPERTY_TEST_PREFIX, EMPTY)).append(fileName)
+        .append('.').append(SUFFIX_STATUS).toString();
   }
 
   @Override
   public String toString() {
-    return this.name;
+    return name;
   }
 }

http://git-wip-us.apache.org/repos/asf/geode/blob/894f3ee7/geode-core/src/main/java/org/apache/geode/internal/process/ProcessUtils.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/internal/process/ProcessUtils.java b/geode-core/src/main/java/org/apache/geode/internal/process/ProcessUtils.java
index 3ff74d8..3cf850f 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/process/ProcessUtils.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/process/ProcessUtils.java
@@ -14,14 +14,16 @@
  */
 package org.apache.geode.internal.process;
 
+import static org.apache.commons.lang.Validate.isTrue;
+import static org.apache.commons.lang.Validate.notEmpty;
+import static org.apache.commons.lang.Validate.notNull;
+
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileReader;
 import java.io.IOException;
 import java.lang.management.ManagementFactory;
 
-import org.apache.geode.internal.util.IOUtils;
-
 /**
  * Utility operations for processes such as identifying the process id (pid).
  * 
@@ -31,7 +33,9 @@ public class ProcessUtils {
 
   private static InternalProcessUtils internal = initializeInternalProcessUtils();
 
-  private ProcessUtils() {}
+  private ProcessUtils() {
+    // nothing
+  }
 
   /**
    * Returns the pid for this process.
@@ -50,8 +54,11 @@ public class ProcessUtils {
    * @throws PidUnavailableException if parsing the pid from the RuntimeMXBean name fails
    */
   public static int identifyPid(final String name) throws PidUnavailableException {
+    notEmpty(name, "Invalid name '" + name + "' specified");
+
+
     try {
-      final int index = name.indexOf("@");
+      final int index = name.indexOf('@');
       if (index < 0) {
         throw new PidUnavailableException("Unable to parse pid from " + name);
       }
@@ -69,6 +76,8 @@ public class ProcessUtils {
    * @return true if the pid matches a currently running process
    */
   public static boolean isProcessAlive(final int pid) {
+    isTrue(pid > 0, "Invalid pid '" + pid + "' specified");
+
     return internal.isProcessAlive(pid);
   }
 
@@ -80,6 +89,8 @@ public class ProcessUtils {
    * @return true if the Process is a currently running process
    */
   public static boolean isProcessAlive(final Process process) {
+    notNull(process, "Invalid process '" + process + "' specified");
+
     return process.isAlive();
   }
 
@@ -91,16 +102,17 @@ public class ProcessUtils {
    * @return true if the process was terminated by this operation
    */
   public static boolean killProcess(final int pid) {
+    isTrue(pid > 0, "Invalid pid '" + pid + "' specified");
+
     return internal.killProcess(pid);
   }
 
   public static int readPid(final File pidFile) throws IOException {
-    BufferedReader reader = null;
-    try {
-      reader = new BufferedReader(new FileReader(pidFile));
+    notNull(pidFile, "Invalid pidFile '" + pidFile + "' specified");
+    isTrue(pidFile.exists(), "Nonexistent pidFile '" + pidFile + "' specified");
+
+    try (BufferedReader reader = new BufferedReader(new FileReader(pidFile))) {
       return Integer.parseInt(reader.readLine());
-    } finally {
-      IOUtils.close(reader);
     }
   }
 
@@ -125,40 +137,33 @@ public class ProcessUtils {
       Class.forName("com.sun.tools.attach.VirtualMachine");
       Class.forName("com.sun.tools.attach.VirtualMachineDescriptor");
       return new AttachProcessUtils();
-    } catch (ClassNotFoundException e) {
-      // fall through
-    } catch (LinkageError e) {
+    } catch (ClassNotFoundException | LinkageError ignored) {
       // fall through
     }
 
     // 2) try NativeCalls but make sure it doesn't throw UnsupportedOperationException
     try {
-      // TODO: get rid of Class.forName usage if NativeCalls always safely loads
+      // consider getting rid of Class.forName usage if NativeCalls always safely loads
       Class.forName("org.apache.geode.internal.shared.NativeCalls");
-      NativeProcessUtils inst = new NativeProcessUtils();
-      boolean result = inst.isProcessAlive(identifyPid());
+      NativeProcessUtils nativeProcessUtils = new NativeProcessUtils();
+      boolean result = nativeProcessUtils.isProcessAlive(identifyPid());
       if (result) {
-        return inst;
+        return nativeProcessUtils;
       }
-    } catch (ClassNotFoundException e) {
-      // fall through
-    } catch (LinkageError e) {
-      // fall through
-    } catch (PidUnavailableException e) {
-      // fall through (log warning??)
-    } catch (UnsupportedOperationException e) {
+    } catch (ClassNotFoundException | LinkageError | PidUnavailableException
+        | UnsupportedOperationException ignored) {
       // fall through
     }
 
-    // 3) TODO: log warning and then proceed with no-op
+    // 3) consider logging warning and then proceed with no-op
     return new InternalProcessUtils() {
       @Override
-      public boolean isProcessAlive(int pid) {
+      public boolean isProcessAlive(final int pid) {
         return false;
       }
 
       @Override
-      public boolean killProcess(int pid) {
+      public boolean killProcess(final int pid) {
         return false;
       }
 
@@ -178,12 +183,13 @@ public class ProcessUtils {
    * Defines the SPI for ProcessUtils
    */
   interface InternalProcessUtils {
-    public boolean isProcessAlive(int pid);
 
-    public boolean killProcess(int pid);
+    boolean isProcessAlive(final int pid);
+
+    boolean killProcess(final int pid);
 
-    public boolean isAvailable();
+    boolean isAvailable();
 
-    public boolean isAttachApiAvailable();
+    boolean isAttachApiAvailable();
   }
 }

http://git-wip-us.apache.org/repos/asf/geode/blob/894f3ee7/geode-core/src/main/java/org/apache/geode/internal/process/StartupStatus.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/internal/process/StartupStatus.java b/geode-core/src/main/java/org/apache/geode/internal/process/StartupStatus.java
index a207994..ede0bdc 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/process/StartupStatus.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/process/StartupStatus.java
@@ -14,14 +14,15 @@
  */
 package org.apache.geode.internal.process;
 
+import static org.apache.commons.lang.Validate.notNull;
+
 import org.apache.logging.log4j.Logger;
 
-import org.apache.geode.internal.logging.LogService;
 import org.apache.geode.i18n.StringId;
+import org.apache.geode.internal.logging.LogService;
 
 /**
  * Extracted from LogWriterImpl and changed to static.
- * 
  */
 public class StartupStatus {
   private static final Logger logger = LogService.getLogger();
@@ -29,14 +30,21 @@ public class StartupStatus {
   /** protected by static synchronized */
   private static StartupStatusListener listener;
 
+  private StartupStatus() {
+    // do nothing
+  }
+
   /**
    * Writes both a message and exception to this writer. If a startup listener is registered, the
    * message will be written to the listener as well to be reported to a user.
-   * 
+   *
    * @since GemFire 7.0
    */
-  public static synchronized void startup(StringId msgID, Object[] params) {
-    String message = msgID.toLocalizedString(params);
+  public static synchronized void startup(final StringId msgId, final Object... params) {
+    notNull(msgId, "Invalid msgId '" + msgId + "' specified");
+    notNull(params, "Invalid params '" + params + "' specified");
+
+    String message = msgId.toLocalizedString(params);
 
     if (listener != null) {
       listener.setStatus(message);
@@ -45,7 +53,7 @@ public class StartupStatus {
     logger.info(message);
   }
 
-  public static synchronized void setListener(StartupStatusListener listener) {
+  public static synchronized void setListener(final StartupStatusListener listener) {
     StartupStatus.listener = listener;
   }
 

http://git-wip-us.apache.org/repos/asf/geode/blob/894f3ee7/geode-core/src/main/java/org/apache/geode/internal/process/StartupStatusListener.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/internal/process/StartupStatusListener.java b/geode-core/src/main/java/org/apache/geode/internal/process/StartupStatusListener.java
index 0e3abb7..07a20fc 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/process/StartupStatusListener.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/process/StartupStatusListener.java
@@ -24,5 +24,5 @@ public interface StartupStatusListener {
    * Report the current status of system startup. The status message reported to this method should
    * already be internationalized.
    */
-  public void setStatus(String status);
+  void setStatus(final String status);
 }

http://git-wip-us.apache.org/repos/asf/geode/blob/894f3ee7/geode-core/src/main/java/org/apache/geode/internal/process/UnableToControlProcessException.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/internal/process/UnableToControlProcessException.java b/geode-core/src/main/java/org/apache/geode/internal/process/UnableToControlProcessException.java
index ac4e4c8..3e8daec 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/process/UnableToControlProcessException.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/process/UnableToControlProcessException.java
@@ -24,23 +24,23 @@ public class UnableToControlProcessException extends Exception {
   private static final long serialVersionUID = 7579463534993125290L;
 
   /**
-   * Creates a new <code>UnableToControlProcessException</code>.
+   * Creates a new {@code UnableToControlProcessException}.
    */
   public UnableToControlProcessException(final String message) {
     super(message);
   }
 
   /**
-   * Creates a new <code>UnableToControlProcessException</code> that was caused by a given exception
+   * Creates a new {@code UnableToControlProcessException} that was caused by a given exception
    */
-  public UnableToControlProcessException(final String message, final Throwable thr) {
-    super(message, thr);
+  public UnableToControlProcessException(final String message, final Throwable cause) {
+    super(message, cause);
   }
 
   /**
-   * Creates a new <code>UnableToControlProcessException</code> that was caused by a given exception
+   * Creates a new {@code UnableToControlProcessException} that was caused by a given exception
    */
-  public UnableToControlProcessException(final Throwable thr) {
-    super(thr.getMessage(), thr);
+  public UnableToControlProcessException(final Throwable cause) {
+    super(cause.getMessage(), cause);
   }
 }

http://git-wip-us.apache.org/repos/asf/geode/blob/894f3ee7/geode-core/src/main/java/org/apache/geode/internal/process/signal/AbstractSignalNotificationHandler.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/internal/process/signal/AbstractSignalNotificationHandler.java b/geode-core/src/main/java/org/apache/geode/internal/process/signal/AbstractSignalNotificationHandler.java
index 6a44558..2658d5f 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/process/signal/AbstractSignalNotificationHandler.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/process/signal/AbstractSignalNotificationHandler.java
@@ -12,9 +12,10 @@
  * or implied. See the License for the specific language governing permissions and limitations under
  * the License.
  */
-
 package org.apache.geode.internal.process.signal;
 
+import static org.apache.commons.lang.StringUtils.EMPTY;
+
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
@@ -25,44 +26,34 @@ import java.util.Set;
 
 /**
  * The AbstractSignalNotificationHandler class...
- * </p>
- * 
- * @see org.apache.geode.internal.process.signal.Signal
- * @see org.apache.geode.internal.process.signal.SignalEvent
- * @see org.apache.geode.internal.process.signal.SignalListener
+ *
  * @since GemFire 7.0
  */
-@SuppressWarnings("unused")
 public abstract class AbstractSignalNotificationHandler {
 
-  // NOTE use the enumerated type instead...
+  /**
+   * @deprecated use the enumerated type instead...
+   */
   @Deprecated
   protected static final List<String> SIGNAL_NAMES;
 
   // Based on Open BSD OS Signals...
   static {
-    final String[] SIGNAL_NAMES_ARRAY =
-        new String[] {"", "HUP", "INT", "QUIT", "ILL", "TRAP", "ABRT", "EMT", "FPE", "KILL", "BUS",
-            "SEGV", "SYS", "PIPE", "ALRM", "TERM", "URG", "STOP", "TSTP", "CONT", "CHLD", "TTIN",
-            "TTOU", "IO", "XCPU", "XFSZ", "VTALRM", "PROF", "WINCH", "INFO", "USR1", "USR2"};
+    String[] SIGNAL_NAMES_ARRAY = new String[] {EMPTY, "HUP", "INT", "QUIT", "ILL", "TRAP", "ABRT",
+        "EMT", "FPE", "KILL", "BUS", "SEGV", "SYS", "PIPE", "ALRM", "TERM", "URG", "STOP", "TSTP",
+        "CONT", "CHLD", "TTIN", "TTOU", "IO", "XCPU", "XFSZ", "VTALRM", "PROF", "WINCH", "INFO",
+        "USR1", "USR2"};
 
     SIGNAL_NAMES = Collections.unmodifiableList(Arrays.asList(SIGNAL_NAMES_ARRAY));
   }
 
-  protected static final SignalListener LOGGING_SIGNAL_LISTENER = new SignalListener() {
-    public void handle(final SignalEvent event) {
-      System.out.printf("Logging SignalListener Received Signal '%1$s' (%2$d)%n",
+  private static final SignalListener LOGGING_SIGNAL_LISTENER =
+      event -> System.out.printf("Logging SignalListener Received Signal '%1$s' (%2$d)%n",
           event.getSignal().getName(), event.getSignal().getNumber());
-    }
-  };
 
-  protected static final SignalListener NO_OP_SIGNAL_LISTENER = new SignalListener() {
-    public void handle(final SignalEvent event) {
-      // no op
-    }
-  };
-
-  // Map used to register SignalListeners with SignalHandlers...
+  /**
+   * Map used to register SignalListeners with SignalHandlers...
+   */
   private final Map<Signal, Set<SignalListener>> signalListeners =
       Collections.synchronizedMap(new HashMap<Signal, Set<SignalListener>>(Signal.values().length));
 
@@ -80,52 +71,52 @@ public abstract class AbstractSignalNotificationHandler {
     }
   }
 
-  protected static void assertValidArgument(final boolean valid, final String message,
+  static void assertValidArgument(final boolean valid, final String message,
       final Object... arguments) {
     if (!valid) {
       throw new IllegalArgumentException(String.format(message, arguments));
     }
   }
 
-  public AbstractSignalNotificationHandler() {
-    for (final Signal signal : Signal.values()) {
-      signalListeners.put(signal, Collections.synchronizedSet(new HashSet<SignalListener>()));
+  protected AbstractSignalNotificationHandler() {
+    for (Signal signal : Signal.values()) {
+      signalListeners.put(signal, Collections.synchronizedSet(new HashSet<>()));
     }
     // NOTE uncomment for debugging purposes...
-    // registerListener(LOGGING_SIGNAL_LISTENER);
+    // debug();
   }
 
-  public boolean hasListeners(final Signal signal) {
+  boolean hasListeners(final Signal signal) {
     return !signalListeners.get(signal).isEmpty();
   }
 
-  public boolean isListening(final SignalListener listener) {
+  boolean isListening(final SignalListener listener) {
     boolean registered = false;
 
-    for (final Signal signal : Signal.values()) {
+    for (Signal signal : Signal.values()) {
       registered |= isListening(listener, signal);
     }
 
     return registered;
   }
 
-  public boolean isListening(final SignalListener listener, final Signal signal) {
+  boolean isListening(final SignalListener listener, final Signal signal) {
     assertNotNull(signal,
         "The signal to determine whether the listener is registered listening for cannot be null!");
     return signalListeners.get(signal).contains(listener);
   }
 
   protected void notifyListeners(final SignalEvent event) {
-    final Set<SignalListener> listeners = signalListeners.get(event.getSignal());
+    Set<SignalListener> listeners = signalListeners.get(event.getSignal());
     Set<SignalListener> localListeners = Collections.emptySet();
 
     if (listeners != null) {
       synchronized (listeners) {
-        localListeners = new HashSet<SignalListener>(listeners);
+        localListeners = new HashSet<>(listeners);
       }
     }
 
-    for (final SignalListener listener : localListeners) {
+    for (SignalListener listener : localListeners) {
       listener.handle(event);
     }
   }
@@ -136,14 +127,14 @@ public abstract class AbstractSignalNotificationHandler {
 
     boolean registered = false;
 
-    for (final Signal signal : Signal.values()) {
+    for (Signal signal : Signal.values()) {
       registered |= registerListener(listener, signal);
     }
 
     return registered;
   }
 
-  public boolean registerListener(final SignalListener listener, final Signal signal) {
+  boolean registerListener(final SignalListener listener, final Signal signal) {
     assertNotNull(signal, "The signal to register the listener for cannot be null!");
     assertNotNull(listener,
         "The SignalListener being registered to listen for '%1$s' signals cannot be null!",
@@ -155,23 +146,23 @@ public abstract class AbstractSignalNotificationHandler {
   public boolean unregisterListener(final SignalListener listener) {
     boolean unregistered = false;
 
-    for (final Signal signal : Signal.values()) {
+    for (Signal signal : Signal.values()) {
       unregistered |= unregisterListener(listener, signal);
     }
 
     return unregistered;
   }
 
-  public boolean unregisterListener(final SignalListener listener, final Signal signal) {
+  boolean unregisterListener(final SignalListener listener, final Signal signal) {
     assertNotNull(signal, "The signal from which to unregister the listener cannot be null!");
 
     return signalListeners.get(signal).remove(listener);
   }
 
-  public boolean unregisterListeners(final Signal signal) {
+  boolean unregisterListeners(final Signal signal) {
     assertNotNull(signal, "The signal from which to unregister all listeners cannot be null!");
 
-    final Set<SignalListener> listeners = signalListeners.get(signal);
+    Set<SignalListener> listeners = signalListeners.get(signal);
 
     synchronized (listeners) {
       listeners.clear();
@@ -179,4 +170,10 @@ public abstract class AbstractSignalNotificationHandler {
     }
   }
 
+  /**
+   * Do not delete.
+   */
+  private void debug() {
+    registerListener(LOGGING_SIGNAL_LISTENER);
+  }
 }

http://git-wip-us.apache.org/repos/asf/geode/blob/894f3ee7/geode-core/src/main/java/org/apache/geode/internal/process/signal/Signal.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/internal/process/signal/Signal.java b/geode-core/src/main/java/org/apache/geode/internal/process/signal/Signal.java
index 78b19db..9dfdfef 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/process/signal/Signal.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/process/signal/Signal.java
@@ -12,17 +12,15 @@
  * or implied. See the License for the specific language governing permissions and limitations under
  * the License.
  */
-
 package org.apache.geode.internal.process.signal;
 
 import org.apache.commons.lang.StringUtils;
 
 /**
  * Signals defined in the enumerated type were based on Open BSD and the IBM JVM...
- * </p>
- * 
- * @see org.apache.geode.internal.process.signal.SignalType
+ *
  * @since GemFire 7.0
+ *
  * @see <a href=
  *      "http://www.fromdual.com/operating-system-signals">http://www.fromdual.com/operating-system-signals</a>
  * @see <a href=
@@ -30,7 +28,6 @@ import org.apache.commons.lang.StringUtils;
  * @see <a href=
  *      "http://publib.boulder.ibm.com/infocenter/java7sdk/v7r0/index.jsp?topic=%2Fcom.ibm.java.aix.70.doc%2Fuser%2Fsighand.html">http://publib.boulder.ibm.com/infocenter/java7sdk/v7r0/index.jsp?topic=%2Fcom.ibm.java.aix.70.doc%2Fuser%2Fsighand.html</a>
  */
-@SuppressWarnings("unused")
 public enum Signal {
   SIGHUP(1, "HUP", SignalType.INTERRUPT, "Hang up. JVM exits normally."),
   SIGINT(2, "INT", SignalType.INTERRUPT, "Interactive attention (CTRL-C). JVM exits normally."),
@@ -93,7 +90,7 @@ public enum Signal {
   }
 
   public static Signal valueOfName(final String name) {
-    for (final Signal signal : values()) {
+    for (Signal signal : values()) {
       if (signal.getName().equalsIgnoreCase(name)) {
         return signal;
       }
@@ -102,16 +99,6 @@ public enum Signal {
     return null;
   }
 
-  public static Signal valueOfNumber(final int number) {
-    for (final Signal signal : values()) {
-      if (signal.getNumber() == number) {
-        return signal;
-      }
-    }
-
-    return null;
-  }
-
   public String getDescription() {
     return description;
   }
@@ -132,5 +119,4 @@ public enum Signal {
   public String toString() {
     return "SIG".concat(getName());
   }
-
 }

http://git-wip-us.apache.org/repos/asf/geode/blob/894f3ee7/geode-core/src/main/java/org/apache/geode/internal/process/signal/SignalEvent.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/internal/process/signal/SignalEvent.java b/geode-core/src/main/java/org/apache/geode/internal/process/signal/SignalEvent.java
index 7038337..d012afa 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/process/signal/SignalEvent.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/process/signal/SignalEvent.java
@@ -12,19 +12,17 @@
  * or implied. See the License for the specific language governing permissions and limitations under
  * the License.
  */
-
 package org.apache.geode.internal.process.signal;
 
 import java.util.EventObject;
 
 /**
  * The SignalEvent class...
- * </p>
- * 
+ *
  * @see java.util.EventObject
+ *
  * @since GemFire 7.0
  */
-@SuppressWarnings("unused")
 public class SignalEvent extends EventObject {
 
   private final Signal signal;
@@ -36,16 +34,15 @@ public class SignalEvent extends EventObject {
   }
 
   public Signal getSignal() {
-    return this.signal;
+    return signal;
   }
 
   @Override
   public String toString() {
-    final StringBuilder buffer = new StringBuilder(getClass().getSimpleName());
+    StringBuilder buffer = new StringBuilder(getClass().getSimpleName());
     buffer.append("{ signal = ").append(getSignal());
     buffer.append(", source = ").append(getSource());
     buffer.append("}");
     return buffer.toString();
   }
-
 }

http://git-wip-us.apache.org/repos/asf/geode/blob/894f3ee7/geode-core/src/main/java/org/apache/geode/internal/process/signal/SignalListener.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/internal/process/signal/SignalListener.java b/geode-core/src/main/java/org/apache/geode/internal/process/signal/SignalListener.java
index 501b9db..e874480 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/process/signal/SignalListener.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/process/signal/SignalListener.java
@@ -12,20 +12,18 @@
  * or implied. See the License for the specific language governing permissions and limitations under
  * the License.
  */
-
 package org.apache.geode.internal.process.signal;
 
 import java.util.EventListener;
 
 /**
- * <p>
  * The SignalListener class...
- * </p>
- * 
+ *
  * @see java.util.EventListener
+ *
  * @since GemFire 7.0
  */
-@SuppressWarnings("unused")
 public interface SignalListener extends EventListener {
+
   void handle(SignalEvent event);
 }

http://git-wip-us.apache.org/repos/asf/geode/blob/894f3ee7/geode-core/src/main/java/org/apache/geode/internal/process/signal/SignalType.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/internal/process/signal/SignalType.java b/geode-core/src/main/java/org/apache/geode/internal/process/signal/SignalType.java
index 9545dab..f29dc35 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/process/signal/SignalType.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/process/signal/SignalType.java
@@ -12,13 +12,11 @@
  * or implied. See the License for the specific language governing permissions and limitations under
  * the License.
  */
-
 package org.apache.geode.internal.process.signal;
 
 /**
  * The SignalType class...
- * </p>
- * 
+ *
  * @since GemFire 7.0
  */
 public enum SignalType {
@@ -38,7 +36,6 @@ public enum SignalType {
 
   @Override
   public String toString() {
-    return this.description;
+    return description;
   }
-
 }

http://git-wip-us.apache.org/repos/asf/geode/blob/894f3ee7/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StartServerCommand.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StartServerCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StartServerCommand.java
index 9b743c8..8080e3f 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StartServerCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StartServerCommand.java
@@ -35,7 +35,6 @@ import org.apache.geode.internal.OSProcess;
 import org.apache.geode.internal.i18n.LocalizedStrings;
 import org.apache.geode.internal.lang.StringUtils;
 import org.apache.geode.internal.lang.SystemUtils;
-import org.apache.geode.internal.process.ClusterConfigurationNotAvailableException;
 import org.apache.geode.internal.process.ProcessStreamReader;
 import org.apache.geode.internal.process.ProcessType;
 import org.apache.geode.internal.util.IOUtils;
@@ -407,8 +406,6 @@ public class StartServerCommand implements GfshCommand {
       return ResultBuilder.createUserErrorResult(message);
     } catch (IllegalStateException e) {
       return ResultBuilder.createUserErrorResult(e.getMessage());
-    } catch (ClusterConfigurationNotAvailableException e) {
-      return ResultBuilder.createShellClientErrorResult(e.getMessage());
     } catch (VirtualMachineError e) {
       SystemFailure.initiateFailure(e);
       throw e;

http://git-wip-us.apache.org/repos/asf/geode/blob/894f3ee7/geode-core/src/test/java/org/apache/geode/distributed/AbstractLauncherIntegrationTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/org/apache/geode/distributed/AbstractLauncherIntegrationTest.java b/geode-core/src/test/java/org/apache/geode/distributed/AbstractLauncherIntegrationTest.java
index 4766653..9b0bedf 100755
--- a/geode-core/src/test/java/org/apache/geode/distributed/AbstractLauncherIntegrationTest.java
+++ b/geode-core/src/test/java/org/apache/geode/distributed/AbstractLauncherIntegrationTest.java
@@ -14,8 +14,16 @@
  */
 package org.apache.geode.distributed;
 
-import org.apache.geode.distributed.internal.DistributionConfig;
-import org.apache.geode.test.junit.categories.IntegrationTest;
+import static org.apache.geode.distributed.AbstractLauncher.loadGemFireProperties;
+import static org.apache.geode.distributed.ConfigurationProperties.GROUPS;
+import static org.apache.geode.distributed.ConfigurationProperties.NAME;
+import static org.apache.geode.distributed.internal.DistributionConfig.GEMFIRE_PREFIX;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.util.Properties;
+
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -23,21 +31,16 @@ import org.junit.experimental.categories.Category;
 import org.junit.rules.TemporaryFolder;
 import org.junit.rules.TestName;
 
-import java.io.File;
-import java.io.FileWriter;
-import java.util.Properties;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.apache.geode.distributed.ConfigurationProperties.*;
+import org.apache.geode.test.junit.categories.IntegrationTest;
 
 /**
- * Integration tests for AbstractLauncher class. These tests require file system I/O.
+ * Integration tests for {@link AbstractLauncher} that require file system I/O.
  */
 @Category(IntegrationTest.class)
 public class AbstractLauncherIntegrationTest {
 
-  private File gemfirePropertiesFile;
-  private Properties expectedGemfireProperties;
+  private File propertiesFile;
+  private Properties expectedProperties;
 
   @Rule
   public final TemporaryFolder temporaryFolder = new TemporaryFolder();
@@ -47,26 +50,20 @@ public class AbstractLauncherIntegrationTest {
 
   @Before
   public void setUp() throws Exception {
-    this.gemfirePropertiesFile =
-        this.temporaryFolder.newFile(DistributionConfig.GEMFIRE_PREFIX + "properties");
+    propertiesFile = temporaryFolder.newFile(GEMFIRE_PREFIX + "properties");
 
-    this.expectedGemfireProperties = new Properties();
-    this.expectedGemfireProperties.setProperty(NAME, "memberOne");
-    this.expectedGemfireProperties.setProperty(GROUPS, "groupOne, groupTwo");
-    this.expectedGemfireProperties.store(new FileWriter(this.gemfirePropertiesFile, false),
-        this.testName.getMethodName());
+    expectedProperties = new Properties();
+    expectedProperties.setProperty(NAME, "memberOne");
+    expectedProperties.setProperty(GROUPS, "groupOne, groupTwo");
+    expectedProperties.store(new FileWriter(propertiesFile, false), testName.getMethodName());
 
-    assertThat(this.gemfirePropertiesFile).isNotNull();
-    assertThat(this.gemfirePropertiesFile.exists()).isTrue();
-    assertThat(this.gemfirePropertiesFile.isFile()).isTrue();
+    assertThat(propertiesFile).exists().isFile();
   }
 
   @Test
-  public void testLoadGemFirePropertiesFromFile() throws Exception {
-    final Properties actualGemFireProperties =
-        AbstractLauncher.loadGemFireProperties(this.gemfirePropertiesFile.toURI().toURL());
+  public void loadGemFirePropertiesFromFile() throws Exception {
+    Properties loadedProperties = loadGemFireProperties(propertiesFile.toURI().toURL());
 
-    assertThat(actualGemFireProperties).isNotNull();
-    assertThat(actualGemFireProperties).isEqualTo(this.expectedGemfireProperties);
+    assertThat(loadedProperties).isEqualTo(expectedProperties);
   }
 }

http://git-wip-us.apache.org/repos/asf/geode/blob/894f3ee7/geode-core/src/test/java/org/apache/geode/distributed/AbstractLauncherIntegrationTestCase.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/org/apache/geode/distributed/AbstractLauncherIntegrationTestCase.java b/geode-core/src/test/java/org/apache/geode/distributed/AbstractLauncherIntegrationTestCase.java
deleted file mode 100755
index bf6a854..0000000
--- a/geode-core/src/test/java/org/apache/geode/distributed/AbstractLauncherIntegrationTestCase.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
- * agreements. See the NOTICE file distributed with this work for additional information regarding
- * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License. You may obtain a
- * copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- */
-package org.apache.geode.distributed;
-
-import static org.apache.geode.distributed.ConfigurationProperties.MCAST_PORT;
-import static org.junit.Assert.assertTrue;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.geode.distributed.internal.DistributionConfig;
-import org.apache.geode.distributed.internal.InternalDistributedSystem;
-import org.apache.geode.internal.logging.LogService;
-import org.apache.geode.internal.process.PidUnavailableException;
-import org.apache.geode.internal.process.ProcessStreamReader.InputListener;
-import org.apache.geode.internal.process.ProcessUtils;
-import org.apache.geode.internal.util.IOUtils;
-import org.apache.geode.internal.util.StopWatch;
-import org.apache.logging.log4j.Logger;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.contrib.java.lang.system.RestoreSystemProperties;
-import org.junit.rules.TestName;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.net.ServerSocket;
-import java.nio.file.Files;
-import java.util.List;
-import java.util.Properties;
-import java.util.concurrent.Callable;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-/**
- * @since GemFire 8.0
- */
-public abstract class AbstractLauncherIntegrationTestCase {
-  protected static final Logger logger = LogService.getLogger();
-
-  protected static final int WAIT_FOR_PROCESS_TO_DIE_TIMEOUT = 5 * 60 * 1000; // 5 minutes
-  protected static final int TIMEOUT_MILLISECONDS = WAIT_FOR_PROCESS_TO_DIE_TIMEOUT;
-  protected static final int WAIT_FOR_FILE_CREATION_TIMEOUT = 10 * 1000; // 10s
-  protected static final int WAIT_FOR_FILE_DELETION_TIMEOUT = 10 * 1000; // 10s
-  protected static final int WAIT_FOR_MBEAN_TIMEOUT = 10 * 1000; // 10s
-  protected static final int INTERVAL_MILLISECONDS = 100;
-
-  private static final String EXPECTED_EXCEPTION_ADD =
-      "<ExpectedException action=add>{}</ExpectedException>";
-  private static final String EXPECTED_EXCEPTION_REMOVE =
-      "<ExpectedException action=remove>{}</ExpectedException>";
-  private static final String EXPECTED_EXCEPTION_MBEAN_NOT_REGISTERED =
-      "MBean Not Registered In GemFire Domain";
-
-  protected volatile ServerSocket socket;
-
-  protected volatile File pidFile;
-  protected volatile File stopRequestFile;
-  protected volatile File statusRequestFile;
-  protected volatile File statusFile;
-
-  @Rule
-  public TestName testName = new TestName();
-
-  @Rule
-  public RestoreSystemProperties restoreSystemProperties = new RestoreSystemProperties();
-
-  @Before
-  public final void setUpAbstractLauncherIntegrationTestCase() throws Exception {
-    System.setProperty(DistributionConfig.GEMFIRE_PREFIX + MCAST_PORT, Integer.toString(0));
-    logger.info(EXPECTED_EXCEPTION_ADD, EXPECTED_EXCEPTION_MBEAN_NOT_REGISTERED);
-  }
-
-  @After
-  public final void tearDownAbstractLauncherIntegrationTestCase() throws Exception {
-    logger.info(EXPECTED_EXCEPTION_REMOVE, EXPECTED_EXCEPTION_MBEAN_NOT_REGISTERED);
-    if (this.socket != null) {
-      this.socket.close();
-      this.socket = null;
-    }
-    delete(this.pidFile);
-    this.pidFile = null;
-    delete(this.stopRequestFile);
-    this.stopRequestFile = null;
-    delete(this.statusRequestFile);
-    this.statusRequestFile = null;
-    delete(this.statusFile);
-    this.statusFile = null;
-  }
-
-  protected void delete(final File file) throws Exception {
-    assertEventuallyTrue("deleting " + file, new Callable<Boolean>() {
-      @Override
-      public Boolean call() throws Exception {
-        if (file == null) {
-          return true;
-        }
-        try {
-          Files.delete(file.toPath());
-        } catch (IOException e) {
-        }
-        return !file.exists();
-      }
-    }, WAIT_FOR_FILE_DELETION_TIMEOUT, INTERVAL_MILLISECONDS);
-  }
-
-  protected void waitForPidToStop(final int pid, boolean throwOnTimeout) throws Exception {
-    assertEventuallyFalse("Process never died", new Callable<Boolean>() {
-      @Override
-      public Boolean call() throws Exception {
-        return ProcessUtils.isProcessAlive(pid);
-      }
-    }, WAIT_FOR_PROCESS_TO_DIE_TIMEOUT, INTERVAL_MILLISECONDS);
-  }
-
-  protected void waitForPidToStop(final int pid) throws Exception {
-    waitForPidToStop(pid, true);
-  }
-
-  protected void waitForFileToDelete(final File file, boolean throwOnTimeout) throws Exception {
-    if (file == null) {
-      return;
-    }
-    assertEventuallyTrue("waiting for file " + file + " to delete", new Callable<Boolean>() {
-      @Override
-      public Boolean call() throws Exception {
-        return !file.exists();
-      }
-    }, WAIT_FOR_FILE_DELETION_TIMEOUT, INTERVAL_MILLISECONDS);
-  }
-
-  protected void waitForFileToDelete(final File file) throws Exception {
-    waitForFileToDelete(file, true);
-  }
-
-  protected static int getPid() throws PidUnavailableException {
-    return ProcessUtils.identifyPid();
-  }
-
-  protected InputListener createLoggingListener(final String name, final String header) {
-    return new InputListener() {
-      @Override
-      public void notifyInputLine(String line) {
-        logger.info(new StringBuilder("[").append(header).append("]").append(line).toString());
-      }
-
-      @Override
-      public String toString() {
-        return name;
-      }
-    };
-  }
-
-  protected InputListener createCollectionListener(final String name, final String header,
-      final List<String> lines) {
-    return new InputListener() {
-      @Override
-      public void notifyInputLine(String line) {
-        lines.add(line);
-      }
-
-      @Override
-      public String toString() {
-        return name;
-      }
-    };
-  }
-
-  protected InputListener createExpectedListener(final String name, final String header,
-      final String expected, final AtomicBoolean atomic) {
-    return new InputListener() {
-      @Override
-      public void notifyInputLine(String line) {
-        if (line.contains(expected)) {
-          atomic.set(true);
-        }
-      }
-
-      @Override
-      public String toString() {
-        return name;
-      }
-    };
-  }
-
-  protected void writeGemfireProperties(final Properties gemfireProperties,
-      final File gemfirePropertiesFile) throws IOException {
-    if (!gemfirePropertiesFile.exists()) {
-      gemfireProperties.store(new FileWriter(gemfirePropertiesFile),
-          "Configuration settings for the GemFire Server");
-    }
-  }
-
-  protected int readPid(final File pidFile) throws IOException {
-    BufferedReader reader = null;
-    try {
-      reader = new BufferedReader(new FileReader(pidFile));
-      return Integer.parseInt(StringUtils.trim(reader.readLine()));
-    } finally {
-      IOUtils.close(reader);
-    }
-  }
-
-  protected void writePid(final File pidFile, final int pid) throws IOException {
-    FileWriter writer = new FileWriter(pidFile);
-    writer.write(String.valueOf(pid));
-    writer.write("\n");
-    writer.flush();
-    writer.close();
-  }
-
-  protected void waitForFileToExist(final File file, boolean throwOnTimeout) throws Exception {
-    assertEventuallyTrue("waiting for file " + file + " to exist", new Callable<Boolean>() {
-      @Override
-      public Boolean call() throws Exception {
-        return file.exists();
-      }
-    }, WAIT_FOR_FILE_CREATION_TIMEOUT, INTERVAL_MILLISECONDS);
-  }
-
-  protected void waitForFileToExist(final File file) throws Exception {
-    waitForFileToExist(file, true);
-  }
-
-  protected String getUniqueName() {
-    return getClass().getSimpleName() + "_" + testName.getMethodName();
-  }
-
-  protected static void assertEventuallyTrue(final String message, final Callable<Boolean> callable,
-      final int timeout, final int interval) throws Exception {
-    boolean done = false;
-    for (StopWatch time = new StopWatch(true); !done && time.elapsedTimeMillis() < timeout; done =
-        (callable.call())) {
-      Thread.sleep(interval);
-    }
-    assertTrue(message, done);
-  }
-
-  protected static void assertEventuallyFalse(final String message,
-      final Callable<Boolean> callable, final int timeout, final int interval) throws Exception {
-    boolean done = false;
-    for (StopWatch time = new StopWatch(true); !done && time.elapsedTimeMillis() < timeout; done =
-        (!callable.call())) {
-      Thread.sleep(interval);
-    }
-    assertTrue(message, done);
-  }
-
-  protected static void disconnectFromDS() {
-    InternalDistributedSystem ids = InternalDistributedSystem.getConnectedInstance();
-    if (ids != null) {
-      ids.disconnect();
-    }
-  }
-}

http://git-wip-us.apache.org/repos/asf/geode/blob/894f3ee7/geode-core/src/test/java/org/apache/geode/distributed/AbstractLauncherServiceStateTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/org/apache/geode/distributed/AbstractLauncherServiceStateTest.java b/geode-core/src/test/java/org/apache/geode/distributed/AbstractLauncherServiceStateTest.java
new file mode 100755
index 0000000..4b03c92
--- /dev/null
+++ b/geode-core/src/test/java/org/apache/geode/distributed/AbstractLauncherServiceStateTest.java
@@ -0,0 +1,224 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.apache.geode.distributed;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.management.ManagementFactory;
+import java.net.InetAddress;
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+import org.apache.geode.internal.GemFireVersion;
+import org.apache.geode.internal.process.ProcessUtils;
+import org.apache.geode.management.internal.cli.json.GfJsonArray;
+import org.apache.geode.management.internal.cli.json.GfJsonException;
+import org.apache.geode.management.internal.cli.json.GfJsonObject;
+import org.apache.geode.test.junit.categories.UnitTest;
+
+/**
+ * Unit tests for {@link AbstractLauncher.ServiceState}. Tests marshalling of ServiceState to and
+ * from JSON.
+ * 
+ * @since GemFire 7.0
+ */
+@Category(UnitTest.class)
+public class AbstractLauncherServiceStateTest {
+
+  private static String serviceName;
+  private static String name;
+  private static int pid;
+  private static long uptime;
+  private static String workingDirectory;
+  private static List<String> jvmArguments;
+  private static String classpath;
+  private static String gemfireVersion;
+  private static String javaVersion;
+
+  private TestLauncher launcher;
+
+  @Before
+  public void setUp() throws Exception {
+    serviceName = "Test";
+    pid = ProcessUtils.identifyPid();
+    uptime = 123456789;
+    name = AbstractLauncherServiceStateTest.class.getSimpleName();
+    workingDirectory = new File(System.getProperty("user.dir")).getAbsolutePath();
+    jvmArguments = ManagementFactory.getRuntimeMXBean().getInputArguments();
+    classpath = ManagementFactory.getRuntimeMXBean().getClassPath();
+    gemfireVersion = GemFireVersion.getGemFireVersion();
+    javaVersion = System.getProperty("java.version");
+
+    int port = 12345;
+    InetAddress host = InetAddress.getLocalHost();
+
+    launcher = new TestLauncher(host, port, name);
+  }
+
+  @After
+  public void tearDown() throws Exception {
+    serviceName = null;
+    name = null;
+    workingDirectory = null;
+    jvmArguments = null;
+    classpath = null;
+    gemfireVersion = null;
+    javaVersion = null;
+  }
+
+  @Test
+  public void serviceStateCanBeMarshalledToAndFromJson() throws Exception {
+    TestLauncher.TestState status = launcher.status();
+    String json = status.toJson();
+    validateJson(status, json);
+    validateStatus(status, TestLauncher.TestState.fromJson(json));
+  }
+
+  private void validateStatus(final TestLauncher.TestState expected,
+      final TestLauncher.TestState actual) {
+    assertThat(actual.getClasspath()).isEqualTo(expected.getClasspath());
+    assertThat(actual.getGemFireVersion()).isEqualTo(expected.getGemFireVersion());
+    assertThat(actual.getJavaVersion()).isEqualTo(expected.getJavaVersion());
+    assertThat(actual.getJvmArguments()).isEqualTo(expected.getJvmArguments());
+    assertThat(actual.getPid()).isEqualTo(expected.getPid());
+    assertThat(actual.getStatus()).isEqualTo(expected.getStatus());
+    assertThat(actual.getTimestamp()).isEqualTo(expected.getTimestamp());
+    assertThat(actual.getUptime()).isEqualTo(expected.getUptime());
+    assertThat(actual.getWorkingDirectory()).isEqualTo(expected.getWorkingDirectory());
+    assertThat(actual.getHost()).isEqualTo(expected.getHost());
+    assertThat(actual.getPort()).isEqualTo(expected.getPort());
+    assertThat(actual.getMemberName()).isEqualTo(expected.getMemberName());
+  }
+
+  private void validateJson(final TestLauncher.TestState expected, final String json) {
+    TestLauncher.TestState actual = TestLauncher.TestState.fromJson(json);
+    validateStatus(expected, actual);
+  }
+
+  private static class TestLauncher extends AbstractLauncher<String> {
+
+    private final InetAddress bindAddress;
+    private final int port;
+    private final String memberName;
+    private final File logFile;
+
+    TestLauncher(final InetAddress bindAddress, final int port, final String memberName) {
+      this.bindAddress = bindAddress;
+      this.port = port;
+      this.memberName = memberName;
+      this.logFile = new File(memberName + ".log");
+    }
+
+    public TestState status() {
+      return new TestState(Status.ONLINE, null, System.currentTimeMillis(), getId(), pid, uptime,
+          workingDirectory, jvmArguments, classpath, gemfireVersion, javaVersion, getLogFileName(),
+          getBindAddressAsString(), getPortAsString(), name);
+    }
+
+    @Override
+    public void run() {
+      // nothing
+    }
+
+    public String getId() {
+      return getServiceName() + "@" + getBindAddress() + "[" + getPort() + "]";
+    }
+
+    @Override
+    public String getLogFileName() {
+      try {
+        return logFile.getCanonicalPath();
+      } catch (IOException e) {
+        return logFile.getAbsolutePath();
+      }
+    }
+
+    @Override
+    public String getMemberName() {
+      return memberName;
+    }
+
+    @Override
+    public Integer getPid() {
+      return null;
+    }
+
+    @Override
+    public String getServiceName() {
+      return serviceName;
+    }
+
+    InetAddress getBindAddress() {
+      return bindAddress;
+    }
+
+    String getBindAddressAsString() {
+      return bindAddress.getCanonicalHostName();
+    }
+
+    int getPort() {
+      return port;
+    }
+
+    String getPortAsString() {
+      return String.valueOf(getPort());
+    }
+
+    private static class TestState extends ServiceState<String> {
+
+      protected static TestState fromJson(final String json) {
+        try {
+          GfJsonObject gfJsonObject = new GfJsonObject(json);
+
+          Status status = Status.valueOfDescription(gfJsonObject.getString(JSON_STATUS));
+          List<String> jvmArguments = Arrays
+              .asList(GfJsonArray.toStringArray(gfJsonObject.getJSONArray(JSON_JVMARGUMENTS)));
+
+          return new TestState(status, gfJsonObject.getString(JSON_STATUSMESSAGE),
+              gfJsonObject.getLong(JSON_TIMESTAMP), gfJsonObject.getString(JSON_LOCATION),
+              gfJsonObject.getInt(JSON_PID), gfJsonObject.getLong(JSON_UPTIME),
+              gfJsonObject.getString(JSON_WORKINGDIRECTORY), jvmArguments,
+              gfJsonObject.getString(JSON_CLASSPATH), gfJsonObject.getString(JSON_GEMFIREVERSION),
+              gfJsonObject.getString(JSON_JAVAVERSION), gfJsonObject.getString(JSON_LOGFILE),
+              gfJsonObject.getString(JSON_HOST), gfJsonObject.getString(JSON_PORT),
+              gfJsonObject.getString(JSON_MEMBERNAME));
+        } catch (GfJsonException e) {
+          throw new IllegalArgumentException("Unable to create TestState from JSON: " + json);
+        }
+      }
+
+      protected TestState(final Status status, final String statusMessage, final long timestamp,
+          final String location, final Integer pid, final Long uptime,
+          final String workingDirectory, final List<String> jvmArguments, final String classpath,
+          final String gemfireVersion, final String javaVersion, final String logFile,
+          final String host, final String port, final String name) {
+        super(status, statusMessage, timestamp, location, pid, uptime, workingDirectory,
+            jvmArguments, classpath, gemfireVersion, javaVersion, logFile, host, port, name);
+      }
+
+      @Override
+      protected String getServiceName() {
+        return serviceName;
+      }
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/geode/blob/894f3ee7/geode-core/src/test/java/org/apache/geode/distributed/AbstractLauncherServiceStatusTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/org/apache/geode/distributed/AbstractLauncherServiceStatusTest.java b/geode-core/src/test/java/org/apache/geode/distributed/AbstractLauncherServiceStatusTest.java
deleted file mode 100755
index 1aa449e..0000000
--- a/geode-core/src/test/java/org/apache/geode/distributed/AbstractLauncherServiceStatusTest.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
- * agreements. See the NOTICE file distributed with this work for additional information regarding
- * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License. You may obtain a
- * copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- */
-package org.apache.geode.distributed;
-
-import static org.junit.Assert.*;
-
-import java.io.File;
-import java.io.IOException;
-import java.lang.management.ManagementFactory;
-import java.net.InetAddress;
-import java.util.Arrays;
-import java.util.List;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-
-import org.apache.geode.internal.GemFireVersion;
-import org.apache.geode.internal.process.ProcessUtils;
-import org.apache.geode.management.internal.cli.json.GfJsonArray;
-import org.apache.geode.management.internal.cli.json.GfJsonException;
-import org.apache.geode.management.internal.cli.json.GfJsonObject;
-import org.apache.geode.test.junit.categories.UnitTest;
-
-/**
- * Tests marshaling of ServiceStatus to and from JSON.
- * 
- * @since GemFire 7.0
- */
-@Category(UnitTest.class)
-public class AbstractLauncherServiceStatusTest {
-
-  private static String serviceName;
-  private static InetAddress host;
-  private static int port;
-  private static String name;
-  private static int pid;
-  private static long uptime;
-  private static String workingDirectory;
-  private static List<String> jvmArguments;
-  private static String classpath;
-  private static String gemfireVersion;
-  private static String javaVersion;
-
-  private TestLauncher launcher;
-
-  @Before
-  public void setUp() throws Exception {
-    serviceName = "Test";
-    port = 12345;
-    host = InetAddress.getLocalHost();
-    pid = ProcessUtils.identifyPid();
-    uptime = 123456789;
-    name = AbstractLauncherServiceStatusTest.class.getSimpleName();
-    workingDirectory = new File(System.getProperty("user.dir")).getAbsolutePath();
-    jvmArguments = ManagementFactory.getRuntimeMXBean().getInputArguments();
-    classpath = ManagementFactory.getRuntimeMXBean().getClassPath();
-    gemfireVersion = GemFireVersion.getGemFireVersion();
-    javaVersion = System.getProperty("java.version");
-
-    this.launcher = new TestLauncher(host, port, name);
-  }
-
-  @After
-  public void tearDown() throws Exception {
-    serviceName = null;
-    host = null;
-    name = null;
-    workingDirectory = null;
-    jvmArguments = null;
-    classpath = null;
-    gemfireVersion = null;
-    javaVersion = null;
-  }
-
-  @Test
-  public void testMarshallingTestStatusToAndFromJson() {
-    final TestLauncher.TestState status = this.launcher.status();
-    final String json = status.toJson();
-    validateJson(status, json);
-    validateStatus(status, TestLauncher.TestState.fromJson(json));
-  }
-
-  private void validateStatus(final TestLauncher.TestState expected,
-      final TestLauncher.TestState actual) {
-    assertEquals(expected.getClasspath(), actual.getClasspath());
-    assertEquals(expected.getGemFireVersion(), actual.getGemFireVersion());
-    assertEquals(expected.getJavaVersion(), actual.getJavaVersion());
-    assertEquals(expected.getJvmArguments(), actual.getJvmArguments());
-    assertEquals(expected.getPid(), actual.getPid());
-    assertEquals(expected.getStatus(), actual.getStatus());
-    assertEquals(expected.getTimestamp(), actual.getTimestamp());
-    assertEquals(expected.getUptime(), actual.getUptime());
-    assertEquals(expected.getWorkingDirectory(), actual.getWorkingDirectory());
-    assertEquals(expected.getHost(), actual.getHost());
-    assertEquals(expected.getPort(), actual.getPort());
-    assertEquals(expected.getMemberName(), actual.getMemberName());
-  }
-
-  private void validateJson(final TestLauncher.TestState expected, final String json) {
-    final TestLauncher.TestState actual = TestLauncher.TestState.fromJson(json);
-    validateStatus(expected, actual);
-  }
-
-  private static class TestLauncher extends AbstractLauncher<String> {
-
-    private final InetAddress bindAddress;
-    private final int port;
-    private final String memberName;
-    private final File logFile;
-
-    TestLauncher(InetAddress bindAddress, int port, String memberName) {
-      this.bindAddress = bindAddress;
-      this.port = port;
-      this.memberName = memberName;
-      this.logFile = new File(memberName + ".log");
-    }
-
-    public TestState status() {
-      return new TestState(Status.ONLINE, null, System.currentTimeMillis(), getId(), pid, uptime,
-          workingDirectory, jvmArguments, classpath, gemfireVersion, javaVersion, getLogFileName(),
-          getBindAddressAsString(), getPortAsString(), name);
-    }
-
-    @Override
-    public void run() {}
-
-    public String getId() {
-      return getServiceName() + "@" + getBindAddress() + "[" + getPort() + "]";
-    }
-
-    @Override
-    public String getLogFileName() {
-      try {
-        return this.logFile.getCanonicalPath();
-      } catch (IOException e) {
-        return this.logFile.getAbsolutePath();
-      }
-    }
-
-    @Override
-    public String getMemberName() {
-      return this.memberName;
-    }
-
-    @Override
-    public Integer getPid() {
-      return null;
-    }
-
-    @Override
-    public String getServiceName() {
-      return serviceName;
-    }
-
-    InetAddress getBindAddress() {
-      return this.bindAddress;
-    }
-
-    String getBindAddressAsString() {
-      return this.bindAddress.getCanonicalHostName();
-    }
-
-    int getPort() {
-      return this.port;
-    }
-
-    String getPortAsString() {
-      return String.valueOf(getPort());
-    }
-
-    private static class TestState extends ServiceState<String> {
-
-      protected static TestState fromJson(final String json) {
-        try {
-          final GfJsonObject gfJsonObject = new GfJsonObject(json);
-
-          final Status status = Status.valueOfDescription(gfJsonObject.getString(JSON_STATUS));
-          final List<String> jvmArguments = Arrays
-              .asList(GfJsonArray.toStringArray(gfJsonObject.getJSONArray(JSON_JVMARGUMENTS)));
-
-          return new TestState(status, gfJsonObject.getString(JSON_STATUSMESSAGE),
-              gfJsonObject.getLong(JSON_TIMESTAMP), gfJsonObject.getString(JSON_LOCATION),
-              gfJsonObject.getInt(JSON_PID), gfJsonObject.getLong(JSON_UPTIME),
-              gfJsonObject.getString(JSON_WORKINGDIRECTORY), jvmArguments,
-              gfJsonObject.getString(JSON_CLASSPATH), gfJsonObject.getString(JSON_GEMFIREVERSION),
-              gfJsonObject.getString(JSON_JAVAVERSION), gfJsonObject.getString(JSON_LOGFILE),
-              gfJsonObject.getString(JSON_HOST), gfJsonObject.getString(JSON_PORT),
-              gfJsonObject.getString(JSON_MEMBERNAME));
-        } catch (GfJsonException e) {
-          throw new IllegalArgumentException("Unable to create TestState from JSON: " + json);
-        }
-      }
-
-      protected TestState(final Status status, final String statusMessage, final long timestamp,
-          final String location, final Integer pid, final Long uptime,
-          final String workingDirectory, final List<String> jvmArguments, final String classpath,
-          final String gemfireVersion, final String javaVersion, final String logFile,
-          final String host, final String port, final String name) {
-        super(status, statusMessage, timestamp, location, pid, uptime, workingDirectory,
-            jvmArguments, classpath, gemfireVersion, javaVersion, logFile, host, port, name);
-      }
-
-      @Override
-      protected String getServiceName() {
-        return serviceName;
-      }
-    }
-  }
-
-}