/**
   * When data is available on the socket, this method is called to run the command or throw an
   * error if it can't.
   *
   * @throws SocketServerException
   */
  private void handleClientData() throws SocketServerException {
    try {
      input.setLength(0); // clear

      String res;
      int a;
      // (char) -1 is not equal to -1.
      // ready is checked to ensure the read call doesn't block.
      while ((a = in.read()) != -1 && in.ready()) {
        input.append((char) a);
      }
      String inputString = input.toString();
      Logger.debug("Got data from client: " + inputString);
      try {
        AndroidCommand cmd = getCommand(inputString);
        Logger.debug("Got command of type " + cmd.commandType().toString());
        res = runCommand(cmd);
        Logger.debug("Returning result: " + res);
      } catch (final CommandTypeException e) {
        res = new AndroidCommandResult(WDStatus.UNKNOWN_ERROR, e.getMessage()).toString();
      } catch (final JSONException e) {
        res =
            new AndroidCommandResult(WDStatus.UNKNOWN_ERROR, "Error running and parsing command")
                .toString();
      }
      out.write(res);
      out.flush();
    } catch (final IOException e) {
      throw new SocketServerException(
          "Error processing data to/from socket (" + e.toString() + ")");
    }
  }
 /**
  * When {@link #handleClientData()} has valid data, this method delegates the command.
  *
  * @param cmd AndroidCommand
  * @return Result
  */
 private String runCommand(final AndroidCommand cmd) {
   AndroidCommandResult res;
   if (cmd.commandType() == AndroidCommandType.SHUTDOWN) {
     keepListening = false;
     res = new AndroidCommandResult(WDStatus.SUCCESS, "OK, shutting down");
   } else if (cmd.commandType() == AndroidCommandType.ACTION) {
     try {
       res = executor.execute(cmd);
     } catch (
         final Exception
             e) { // Here we catch all possible exceptions and return a JSON Wire Protocol
       // UnknownError
       // This prevents exceptions from halting the bootstrap app
       res = new AndroidCommandResult(WDStatus.UNKNOWN_ERROR, e.getMessage());
     }
   } else {
     // this code should never be executed, here for future-proofing
     res =
         new AndroidCommandResult(
             WDStatus.UNKNOWN_ERROR, "Unknown command type, could not execute!");
   }
   return res.toString();
 }