/**
  * Runs REST validation on API, stores XML results into apiEntry.
  *
  * @param apiEntry informations about API.
  */
 private void validateTreeXML(ApiEntry apiEntry) {
   StringBuilder sb = new StringBuilder(apiEntry.getMessage());
   sb.append("<results_of_REST_checking>");
   RestValidator restValidator = new RestValidator(apiEntry.getResourceNodes());
   String validation;
   if (restValidator.validateApi()) {
     validation = "Your API is RESTful.";
   } else {
     ErrsAndWarns errsAndWarns = countErrsAndWarns(apiEntry);
     if (errsAndWarns.getErrorsCount() == 0) {
       validation =
           "Your API is RESTful, but found "
               + errsAndWarns.getWarnsCount()
               + " warnings - see details of each resource.";
     } else {
       validation =
           "Your API is not RESTful, found "
               + errsAndWarns.getErrorsCount()
               + " errors and "
               + errsAndWarns.getWarnsCount()
               + " warnings - see details of each resource.";
     }
   }
   sb.append(validation);
   sb.append("</results_of_REST_checking>");
   apiEntry.setMessage(sb.toString());
 }
  /**
   * Handles POST requests for /
   *
   * @param apiEntry the object with form data about entry point.
   * @param result BindingResult with data about validation of input data.
   * @return JSP page which will be shown.
   */
  @RequestMapping(value = "/", method = RequestMethod.POST)
  public String doCheckAPI(ApiEntry apiEntry, BindingResult result) {
    if (result.hasErrors()) {
      return JSP;
    }
    if (!apiEntry.getUrl().startsWith("http://") && !apiEntry.getUrl().startsWith("https://")) {
      apiEntry.setUrl("http://" + apiEntry.getUrl());
    }
    if (apiEntry.getUrl().length() < 10) {
      apiEntry.setMessage("Invalid URL");
      return JSP;
    }

    createTree(apiEntry);
    if (HttpValidator.responseOk(apiEntry)
        && apiEntry.getResourceNodes().getDescendants().size() > 0) {
      validateTree(apiEntry);
      generateViewOfQuestionnaires(apiEntry);
      generateViewOfResources(apiEntry);
      generateViewOfTree(apiEntry);
      return JSPOkResponse;
    } else {
      return JSPBadResponse;
    }
  }
 /**
  * Run REST validation on API, stores results into apiEntry.
  *
  * @param apiEntry informations about API.
  */
 private void validateTree(ApiEntry apiEntry) {
   RestValidator restValidator = new RestValidator(apiEntry.getResourceNodes());
   String validation = "";
   if (restValidator.validateApi()) {
     if (apiEntry.getQuestionnaires().evaluate().equals("")) {
       validation = "</p><h3>Great Job! The API is RESTful!</h3><p>";
     }
     validation =
         validation
             + "</p><h4>Automatically checked constraints</h4><p>Cache constraint OK!<br />Layered System constraint OK!<br />Uniform Interface OK! (for resources under the API structure)</p>";
   } else {
     ErrsAndWarns errsAndWarns = countErrsAndWarns(apiEntry);
     if (errsAndWarns.getErrorsCount() == 0) {
       validation =
           "</p><h4>Automatically checked constraints</h4><p>Cache constraint OK!<br />Layered System constraint OK!<br />Uniform Interface OK! (for resources under the API structure)<br /> But found "
               + errsAndWarns.getWarnsCount()
               + " warnings - see yellow marks below for details.</p>";
     } else {
       validation =
           "</p><h4>Automatically checked constraints</h4><p>Your API is not RESTful, found "
               + errsAndWarns.getErrorsCount()
               + " errors and "
               + errsAndWarns.getWarnsCount()
               + " warnings - see colored marks below for details.</p>";
     }
   }
   apiEntry.setMessage(validation);
 }
  /**
   * Generates the XML view of API tree from apiEntry and saves it to it.
   *
   * @param apiEntry Informations about tree.
   */
  private void generateViewOfTreeXML(ApiEntry apiEntry) {
    StringBuilder sb = new StringBuilder(apiEntry.getMessage());
    sb.append("<api_tree>\n");
    writeResourceNodeTreeViewXML(
        apiEntry.getResourceNodes(), apiEntry.getBaseUrl(), apiEntry.getMaxSiblings(), sb);

    sb.append("</api_tree>\n");

    apiEntry.setMessage(sb.toString());
  }
  /**
   * Generates view of HTTP responses of resources in apiEntry and stores it into it.
   *
   * @param apiEntry with information about resource tree.
   */
  private void generateViewOfResources(ApiEntry apiEntry) {
    StringBuilder sb = new StringBuilder(apiEntry.getMessage());
    Set<String> visited = new HashSet<String>();
    sb.append("\n<div id=\"resourceView\">");
    writeResourceNodeView(apiEntry.getResourceNodes(), apiEntry.getBaseUrl(), sb, visited);

    sb.append("</div>\n");

    apiEntry.setMessage(sb.toString());
  }
  /**
   * Generates the View of APIs resource tree.
   *
   * @param apiEntry for which the view is generated and stored into.
   */
  private void generateViewOfTree(ApiEntry apiEntry) {
    StringBuilder sb = new StringBuilder(apiEntry.getMessage());
    sb.append("\n<div id=\"apiTree\">");
    sb.append("<h4>The API structure:</h4> ");
    sb.append("<ul class=\"short\">\n");
    writeResourceNodeTreeView(
        apiEntry.getResourceNodes(), apiEntry.getBaseUrl(), apiEntry.getMaxSiblings(), sb);

    sb.append("</ul>\n</div><p>");

    apiEntry.setMessage(sb.toString());
  }
  /**
   * Counts REST errors and warnings in tree taken from apiEntry.
   *
   * @param apiEntry apiEntry information.
   * @return ErrsAndWarns object with counts.
   */
  private ErrsAndWarns countErrsAndWarns(ApiEntry apiEntry) {
    ErrsAndWarns errsAndWarns = new ErrsAndWarns();
    countErrsAndWarns(apiEntry.getResourceNodes(), errsAndWarns);

    return errsAndWarns;
  }