public void closeDown() {
   try {
     if (!isServer) clientSocket.close();
     else {
       for (ServerService s : services) s.closeDown();
     }
   } catch (IOException e) {
     e.printStackTrace();
   }
 }
 public void chat(String message) {
   message = message.substring(5);
   if (isServer) {
     for (ServerService s : services)
       s.sendMessageToClients(
           "chat " + gameData.getPlayerName() + " " + gameData.getPlayerSide() + " " + message);
     parseChatMessage(
         "chat " + gameData.getPlayerName() + " " + gameData.getPlayerSide() + " " + message);
   }
   if (!isServer)
     requestToServer.println(
         "chat " + gameData.getPlayerName() + " " + gameData.getPlayerSide() + " " + message);
 }
 public void elaborateShootRequest(int x, int y, String side) {
   String controllerQuery = null;
   if (side.equals("guest")) {
     controllerQuery = cont.shootAtHostSide(x, y);
   }
   if (side.equals("host")) {
     controllerQuery = cont.shootAtGuestSide(x, y);
   }
   for (ServerService s : services) {
     s.sendMessageToClients(controllerQuery);
   }
   if (controllerQuery.startsWith("water")) waterResponse(controllerQuery);
   if (controllerQuery.startsWith("hit")) hitResponse(controllerQuery);
   if (controllerQuery.startsWith("destroyed")) destroyedResponse(controllerQuery);
   if (controllerQuery.startsWith("allShipsDestroyed")) allShipsDestroyed(controllerQuery);
 }
  /**
   * List the items on the dispatcher queue for a project
   *
   * @param project Project name
   * @return Collection of Strings listing the active dispatcher queue items
   * @throws CentralDispatcherException if an error occurs
   */
  public Collection<QueuedItem> listDispatcherQueue(final String project)
      throws CentralDispatcherException {
    if (null == project) {
      throw new CentralDispatcherException(
          "Unsupported operation: project is required by the RunDeck API");
    }
    final HashMap<String, String> params = new HashMap<String, String>();
    params.put("project", project);

    final WebserviceResponse response;
    try {
      response =
          serverService.makeRundeckRequest(RUNDECK_API_LIST_EXECUTIONS_PATH, params, null, null);
    } catch (MalformedURLException e) {
      throw new CentralDispatcherServerRequestException("Failed to make request", e);
    }

    validateResponse(response);

    ////////////////////
    // parse result list of queued items, return the collection of QueuedItems
    ///////////////////

    return parseExecutionListResult(response);
  }
  public DispatcherResult killDispatcherExecution(final String execId)
      throws CentralDispatcherException {
    final HashMap<String, String> params = new HashMap<String, String>();

    final String rundeckApiKillJobPath =
        substitutePathVariable(RUNDECK_API_KILL_JOB_PATH, "id", execId);
    // 2. send request via ServerService
    final WebserviceResponse response;
    try {
      response = serverService.makeRundeckRequest(rundeckApiKillJobPath, params, null, null);
    } catch (MalformedURLException e) {
      throw new CentralDispatcherServerRequestException("Failed to make request", e);
    }

    final Envelope envelope = validateResponse(response);

    final Node result1 = envelope.doc.selectSingleNode("result");
    final String abortStatus = result1.selectSingleNode("abort/@status").getStringValue();
    final boolean result = !"failed".equals(abortStatus);
    final StringBuffer sb = envelope.successMessages();
    return new DispatcherResult() {
      public boolean isSuccessful() {
        return result;
      }

      public String getMessage() {
        return sb.toString();
      }
    };
  }
  /**
   * Submit a request to the server which expects an execution id in response, and return a single
   * QueuedItemResult parsed from the response.
   *
   * @param tempxml xml temp file (or null)
   * @param otherparams parameters for the request
   * @param requestPath
   * @return a single QueuedItemResult
   * @throws com.dtolabs.rundeck.core.dispatcher.CentralDispatcherException if an error occurs
   */
  private QueuedItemResult submitRunRequest(
      final File tempxml, final HashMap<String, String> otherparams, final String requestPath)
      throws CentralDispatcherException {

    final HashMap<String, String> params = new HashMap<String, String>();
    if (null != otherparams) {
      params.putAll(otherparams);
    }

    final WebserviceResponse response;
    try {
      response = serverService.makeRundeckRequest(requestPath, params, tempxml, null);
    } catch (MalformedURLException e) {
      throw new CentralDispatcherServerRequestException("Failed to make request", e);
    }
    validateResponse(response);

    final Document resultDoc = response.getResultDoc();

    if (null != resultDoc.selectSingleNode("/result/execution")
        && null != resultDoc.selectSingleNode("/result/execution/@id")) {
      final Node node = resultDoc.selectSingleNode("/result/execution/@id");
      final String succeededId = node.getStringValue();
      final String name = "adhoc";
      String url = createExecutionURL(succeededId);
      url = makeAbsoluteURL(url);
      logger.info("\t[" + succeededId + "] <" + url + ">");
      return QueuedItemResultImpl.successful("Succeeded queueing " + name, succeededId, url, name);
    }
    return QueuedItemResultImpl.failed("Server response contained no success information.");
  }
  /**
   * Submit a request to the server which expects a list of execution items in the response, and
   * return a single QueuedItemResult parsed from the response.
   *
   * @param tempxml xml temp file (or null)
   * @param otherparams parameters for the request
   * @param requestPath
   * @return a single QueuedItemResult
   * @throws com.dtolabs.rundeck.core.dispatcher.CentralDispatcherException if an error occurs
   */
  private QueuedItemResult submitExecutionRequest(
      final File tempxml, final HashMap<String, String> otherparams, final String requestPath)
      throws CentralDispatcherException {

    final HashMap<String, String> params = new HashMap<String, String>();
    if (null != otherparams) {
      params.putAll(otherparams);
    }

    final WebserviceResponse response;
    try {
      response = serverService.makeRundeckRequest(requestPath, params, tempxml, null);
    } catch (MalformedURLException e) {
      throw new CentralDispatcherServerRequestException("Failed to make request", e);
    }
    validateResponse(response);

    final ArrayList<QueuedItem> list = parseExecutionListResult(response);
    if (null == list || list.size() < 1) {

      return QueuedItemResultImpl.failed("Server response contained no success information.");
    } else {

      final QueuedItem next = list.iterator().next();
      return QueuedItemResultImpl.successful(
          "Succeeded queueing " + next.getName(), next.getId(), next.getUrl(), next.getName());
    }
  }
 public boolean placeShipsOnField(
     String field, String alignment, String shipName, int xStartCoordinate, int yStartCoordinate) {
   if (!gameData.shipAlreadyPlaced(shipName, alignment, xStartCoordinate, yStartCoordinate)) {
     if (!isServer) {
       requestToServer.println(
           "placeShip "
               + field
               + " "
               + alignment
               + " "
               + shipName
               + " "
               + xStartCoordinate
               + " "
               + yStartCoordinate);
       return true;
     }
     if (isServer) {
       boolean controllerQuery =
           cont.addShip(shipName, alignment, field, xStartCoordinate, yStartCoordinate);
       if (controllerQuery) {
         gameData.placeShipsOnField(alignment, shipName, xStartCoordinate, yStartCoordinate);
         for (ServerService s : services) {
           s.sendMessageToClients(
               "placeShip "
                   + field
                   + " "
                   + alignment
                   + " "
                   + shipName
                   + " "
                   + xStartCoordinate
                   + " "
                   + yStartCoordinate);
         }
         return true;
       }
     }
   }
   return false;
 }
 public void elaboratePlaceRequest(
     String field, String alignment, String shipName, int xStartCoordinate, int yStartCoordinate) {
   boolean controllerResponse = false;
   controllerResponse =
       cont.addShip(shipName, alignment, field, xStartCoordinate, yStartCoordinate);
   if (controllerResponse) {
     for (ServerService s : services) {
       s.sendMessageToClients(
           "shipSuccessfullyPlaced "
               + field
               + " "
               + alignment
               + " "
               + shipName
               + " "
               + new Integer(xStartCoordinate).toString()
               + " "
               + new Integer(yStartCoordinate).toString());
     }
   }
 }
 /**
  * If the url appears relative to an authority, i.e. it starts with "/", then convert it to be
  * absolute using the server URL (including context path) provided by the ServerService.
  *
  * @param url a context-relative url path to convert into absolute url.
  * @return absolute URL if input was a url path, otherwise returns the input string.
  */
 String makeContextAbsoluteURL(String url) {
   if (null != url && url.startsWith("/")) {
     // change relative URL into absolute using the base server URL
     try {
       final URL newUrl = new URL(serverService.getConnParams().getServerUrl() + url);
       url = newUrl.toExternalForm();
     } catch (MalformedURLException e) {
       e.printStackTrace();
     }
   }
   return url;
 }
  public Collection<IStoredJob> reallistStoredJobs(final IStoredJobsQuery iStoredJobsQuery)
      throws CentralDispatcherException {
    final HashMap<String, String> params = new HashMap<String, String>();
    final String nameMatch = iStoredJobsQuery.getNameMatch();
    String groupMatch = iStoredJobsQuery.getGroupMatch();
    final String projectFilter = iStoredJobsQuery.getProjectFilter();
    final String idlistFilter = iStoredJobsQuery.getIdlist();

    if (null != nameMatch) {
      params.put("jobExactFilter", nameMatch);
    }
    if (null != groupMatch) {
      final Matcher matcher = Pattern.compile("^/*(.+?)/*$").matcher(groupMatch);
      if (matcher.matches()) {
        // strip leading and trailing slashes
        groupMatch = matcher.group(1);
      }
      params.put("groupPathExact", groupMatch);
    }
    if (null != projectFilter) {
      params.put("project", projectFilter);
    }
    if (null != idlistFilter) {
      params.put("idlist", idlistFilter);
    }

    // 2. send request via ServerService
    final WebserviceResponse response;
    try {
      response = serverService.makeRundeckRequest(RUNDECK_API_JOBS_LIST_PATH, params, null, null);
    } catch (MalformedURLException e) {
      throw new CentralDispatcherServerRequestException("Failed to make request", e);
    }
    validateResponse(response);
    // extract job list
    final Document resultDoc = response.getResultDoc();
    final ArrayList<IStoredJob> list = new ArrayList<IStoredJob>();

    final Node jobs = resultDoc.selectSingleNode("/result/jobs");
    for (final Object job1 : jobs.selectNodes("job")) {
      final Node job = (Node) job1;
      final String id = job.selectSingleNode("@id").getStringValue();
      final String name = job.selectSingleNode("name").getStringValue();
      final String group = job.selectSingleNode("group").getStringValue();
      final String desc = job.selectSingleNode("description").getStringValue();
      final String url = createJobURL(id);
      list.add(StoredJobImpl.create(id, name, url, group, desc, projectFilter));
    }

    return list;
  }
  /**
   * Report execution status
   *
   * @param project project
   * @param title execution title
   * @param status result status, either 'succeed','cancel','fail'
   * @param failedNodeCount total node count
   * @param successNodeCount count of successful nodes
   * @param tags
   * @param script script content (can be null if summary specified)
   * @param summary summary of execution (can be null if script specified)
   * @param start start date (can be null)
   * @param end end date (can be null)
   * @throws com.dtolabs.rundeck.core.dispatcher.CentralDispatcherException
   */
  public void reportExecutionStatus(
      final String project,
      final String title,
      final String status,
      final int failedNodeCount,
      final int successNodeCount,
      final String tags,
      final String script,
      final String summary,
      final Date start,
      final Date end)
      throws CentralDispatcherException {
    final HashMap<String, String> params = new HashMap<String, String>();
    params.put("project", project);
    params.put("title", title);
    params.put("status", status);
    params.put("nodesuccesscount", Integer.toString(successNodeCount));
    params.put("nodefailcount", Integer.toString(failedNodeCount));
    if (null != tags) {
      params.put("tags", tags);
    }
    if (null != script) {
      params.put("script", script);
    }
    params.put("summary", summary);
    if (null != start) {
      params.put("start", Long.toString(start.getTime()));
    }
    if (null != end) {
      params.put("end", Long.toString(end.getTime()));
    }

    final WebserviceResponse response;
    try {
      response = serverService.makeRundeckRequest(RUNDECK_API_EXECUTION_REPORT, params, null, null);
    } catch (MalformedURLException e) {
      throw new CentralDispatcherServerRequestException("Failed to make request", e);
    }

    validateResponse(response);
  }
 public void run() {
   if (isServer) {
     try {
       sSocket = new ServerSocket(portNr);
     } catch (IOException e) {
       e.printStackTrace();
     }
     while (shouldRun) {
       try {
         Socket s = sSocket.accept();
         ServerService c = new ServerService(s, gameData, this, cont);
         services.add(c);
         c.start();
         clientsJoined++;
         System.out.println(
             clientsJoined + " " + cont.getHostPlayers() + " " + cont.getGuestPlayers());
         if (clientsJoined == cont.getHostPlayers() + cont.getGuestPlayers() - 1) {
           System.out.println("ready");
           ready = true;
         }
       } catch (IOException e) {
         e.printStackTrace();
       }
     }
     for (ServerService a : services) a.setShouldRun(false);
   } else {
     while (shouldRun) {
       try {
         String response = responseFromServer.readLine();
         if (response.startsWith("spl")) {
           spl = response.substring(3);
           serverResponse = true;
         }
         if (response.startsWith("opl")) {
           opponentResponse = true;
           opl = response.substring(3);
         }
         if (response.startsWith("gamechallenge")) serverGameData = response;
         if (response.equals("sidefull")) cs.playerNotAdded();
         if (response.equals("playeradded")) cs.playerAdded();
         if (response.startsWith("chat")) {
           parseChatMessage(response);
         }
         if (response.startsWith("water")) {
           waterResponse(response);
         }
         if (response.startsWith("hit")) {
           System.out.println("ship shot");
           hitResponse(response);
         }
         if (response.startsWith("shipSuccessfullyPlaced")) {
           shipPlacedResponse(response);
         }
         if (response.startsWith("destroyed")) {
           destroyedResponse(response);
         }
         if (response.equals("endGame")) {
           closeDown();
         }
         if (response.startsWith("allShipsDestroyed")) allShipsDestroyed(response);
         response = null;
       } catch (IOException e) {
         e.printStackTrace();
       }
     }
   }
 }
 public void sendMessageToAllClients(String message) {
   for (ServerService s : services) s.sendMessageToClients(message);
 }
  public Collection<IStoredJob> listStoredJobs(
      final IStoredJobsQuery iStoredJobsQuery,
      final OutputStream output,
      final JobDefinitionFileFormat fformat)
      throws CentralDispatcherException {
    final HashMap<String, String> params = new HashMap<String, String>();
    final String nameMatch = iStoredJobsQuery.getNameMatch();
    String groupMatch = iStoredJobsQuery.getGroupMatch();
    final String projectFilter = iStoredJobsQuery.getProjectFilter();
    final String idlistFilter = iStoredJobsQuery.getIdlist();

    final String expectedContentType;
    if (null != fformat) {
      params.put("format", fformat.getName());
      expectedContentType = fformat == JobDefinitionFileFormat.xml ? "text/xml" : "text/yaml";
    } else {
      params.put("format", JobDefinitionFileFormat.xml.getName());
      expectedContentType = "text/xml";
    }
    if (null != nameMatch) {
      params.put("jobFilter", nameMatch);
    }
    if (null != groupMatch) {
      final Matcher matcher = Pattern.compile("^/*(.+?)/*$").matcher(groupMatch);
      if (matcher.matches()) {
        // strip leading and trailing slashes
        groupMatch = matcher.group(1);
      }
      params.put("groupPath", groupMatch);
    }
    if (null != projectFilter) {
      params.put("project", projectFilter);
    }
    if (null != idlistFilter) {
      params.put("idlist", idlistFilter);
    }

    // 2. send request via ServerService
    final WebserviceResponse response;
    try {
      response =
          serverService.makeRundeckRequest(
              RUNDECK_API_JOBS_EXPORT_PATH, params, null, null, expectedContentType);
    } catch (MalformedURLException e) {
      throw new CentralDispatcherServerRequestException("Failed to make request", e);
    }
    checkErrorResponse(response);
    // if xml, do local validation and listing
    if (null == fformat || fformat == JobDefinitionFileFormat.xml) {
      validateJobsResponse(response);

      ////////////////////
      // parse result list of queued items, return the collection of QueuedItems
      ///////////////////

      final Document resultDoc = response.getResultDoc();

      final Node node = resultDoc.selectSingleNode("/joblist");
      final ArrayList<IStoredJob> list = new ArrayList<IStoredJob>();
      if (null == node) {
        return list;
      }
      final List items = node.selectNodes("job");
      if (null != items && items.size() > 0) {
        for (final Object o : items) {
          final Node node1 = (Node) o;
          final Node uuid = node1.selectSingleNode("uuid");
          final Node id1 = node1.selectSingleNode("id");
          final String id = null != uuid ? uuid.getStringValue() : id1.getStringValue();
          final String name = node1.selectSingleNode("name").getStringValue();
          final String url = createJobURL(id);

          final Node gnode = node1.selectSingleNode("group");
          final String group = null != gnode ? gnode.getStringValue() : null;
          final String description = node1.selectSingleNode("description").getStringValue();
          list.add(StoredJobImpl.create(id, name, url, group, description, projectFilter));
        }
      }

      if (null != output) {
        // write output doc to the outputstream
        final OutputFormat format = OutputFormat.createPrettyPrint();
        try {
          final XMLWriter writer = new XMLWriter(output, format);
          writer.write(resultDoc);
          writer.flush();
        } catch (IOException e) {
          throw new CentralDispatcherServerRequestException(e);
        }
      }
      return list;
    } else if (fformat == JobDefinitionFileFormat.yaml) {
      // do rought yaml parse
      final Collection<Map> mapCollection = validateJobsResponseYAML(response);
      final ArrayList<IStoredJob> list = new ArrayList<IStoredJob>();

      if (null == mapCollection || mapCollection.size() < 1) {
        return list;
      }
      for (final Map map : mapCollection) {
        final Object uuidobj = map.get("uuid");
        final Object idobj = map.get("id");
        final String id = null != uuidobj ? uuidobj.toString() : idobj.toString();
        final String name = (String) map.get("name");
        final String group = map.containsKey("group") ? (String) map.get("group") : null;
        final String desc = map.containsKey("description") ? (String) map.get("description") : "";
        final String url = createJobURL(id);
        list.add(StoredJobImpl.create(id, name, url, group, desc, projectFilter));
      }

      if (null != output) {
        // write output doc to the outputstream
        try {
          final Writer writer = new OutputStreamWriter(output);
          writer.write(response.getResults());
          writer.flush();
        } catch (IOException e) {
          throw new CentralDispatcherServerRequestException(e);
        }
      }
      return list;
    }
    return null;
  }
  public Collection<IStoredJobLoadResult> loadJobs(
      final ILoadJobsRequest iLoadJobsRequest,
      final File input,
      final JobDefinitionFileFormat format)
      throws CentralDispatcherException {
    final HashMap<String, String> params = new HashMap<String, String>();
    params.put("dupeOption", iLoadJobsRequest.getDuplicateOption().toString());

    if (null != format) {
      params.put("format", format.getName());
    }

    /*
     * Send the request bean and the file as a multipart request.
     */

    // 2. send request via ServerService
    final WebserviceResponse response;
    try {
      response = serverService.makeRundeckRequest(RUNDECK_API_JOBS_UPLOAD, params, input, null);
    } catch (MalformedURLException e) {
      throw new CentralDispatcherServerRequestException("Failed to make request", e);
    }
    validateResponse(response);

    ////////////////////
    // parse result list of queued items, return the collection of QueuedItems
    ///////////////////

    final Document result = response.getResultDoc();

    final int succeeded;
    final int failed;
    final int skipped;
    Node node = result.selectSingleNode("/result/succeeded/@count");
    if (null != node) {
      succeeded = Integer.parseInt(node.getStringValue());
    } else {
      succeeded = -1;
    }
    node = result.selectSingleNode("/result/failed/@count");
    if (null != node) {
      failed = Integer.parseInt(node.getStringValue());
    } else {
      failed = -1;
    }
    node = result.selectSingleNode("/result/skipped/@count");
    if (null != node) {
      skipped = Integer.parseInt(node.getStringValue());
    } else {
      skipped = -1;
    }
    final ArrayList<IStoredJobLoadResult> resultList = new ArrayList<IStoredJobLoadResult>();
    if (succeeded > 0) {
      logger.debug("Succeeded creating/updating " + succeeded + " Jobs:");
      final List nodes = result.selectNodes("/result/succeeded/job");
      for (final Object node2 : nodes) {
        final Node node1 = (Node) node2;
        final IStoredJobLoadResult storedJobLoadResult =
            parseAPIJobResult(node1, true, false, "Succeeded");
        resultList.add(storedJobLoadResult);
      }
    }
    if (failed > 0) {
      logger.debug("Failed to add " + failed + " Jobs:");
      final List nodes = result.selectNodes("/result/failed/job");
      for (final Object node2 : nodes) {
        final Node node1 = (Node) node2;
        final String error =
            null != node1.selectSingleNode("error")
                ? node1.selectSingleNode("error").getStringValue()
                : "Failed";
        final IStoredJobLoadResult storedJobLoadResult =
            parseAPIJobResult(node1, false, false, error);

        resultList.add(storedJobLoadResult);
      }
    }
    if (skipped > 0) {
      logger.debug("Skipped " + skipped + " Jobs:");
      final List nodes = result.selectNodes("/result/skipped/job");
      for (final Object node2 : nodes) {
        final Node node1 = (Node) node2;

        final String error =
            null != node1.selectSingleNode("error")
                ? node1.selectSingleNode("error").getStringValue()
                : "Skipped";
        final IStoredJobLoadResult storedJobLoadResult =
            parseAPIJobResult(node1, true, true, error);
        resultList.add(storedJobLoadResult);
      }
    }
    return resultList;
  }