/**
  * 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());
 }
  /**
   * 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());
  }
 /**
  * Handles POST requests for /repeatedtesting
  *
  * @param apiEntry the object with form data about entry point.
  * @return ResponseEntity with resource body.
  */
 @RequestMapping(value = "/repeatedtesting", method = RequestMethod.POST)
 public ResponseEntity<String> doCheckAPIRepeatedTesting(ApiEntry apiEntry, BindingResult result) {
   if (result.hasErrors()) {
     apiEntry.setMessage("Invalid input: max siblings");
     return new ResponseEntity<String>(apiEntry.getMessage(), HttpStatus.BAD_REQUEST);
   }
   if (!apiEntry.getUrl().startsWith("http://") && !apiEntry.getUrl().startsWith("https://")) {
     apiEntry.setUrl("http://" + apiEntry.getUrl());
   }
   if (apiEntry.getUrl().length() < 10) {
     apiEntry.setMessage("Invalid input: URL");
     return new ResponseEntity<String>(apiEntry.getMessage(), HttpStatus.BAD_REQUEST);
   }
   createTree(apiEntry);
   apiEntry.setMessage("<RESTfulChecker_report>");
   generateViewOfEntryPointXML(apiEntry);
   validateTreeXML(apiEntry);
   generateViewOfTreeXML(apiEntry);
   HttpHeaders responseHeaders = new HttpHeaders();
   responseHeaders.setContentType(MediaType.TEXT_XML);
   apiEntry.setMessage(apiEntry.getMessage() + "</RESTfulChecker_report>");
   return new ResponseEntity<String>(apiEntry.getMessage(), responseHeaders, HttpStatus.OK);
 }
  /**
   * Appends XML information about entrypoint into entrypoints message.
   *
   * @param apiEntry data about entrypoint.
   */
  private void generateViewOfEntryPointXML(ApiEntry apiEntry) {
    StringBuilder sb = new StringBuilder(apiEntry.getMessage());
    sb.append("<test_definition>");

    sb.append("<request>");
    sb.append("<API_entry_URL>");
    sb.append(apiEntry.getUrl());
    sb.append("</API_entry_URL>");
    if (apiEntry.getRequestHeaders().size() > 0) {
      sb.append("<headers>");
      for (Header header : apiEntry.getRequestHeaders()) {
        sb.append("<header>");
        sb.append("<key>");
        sb.append(header.getHeaderKey());
        sb.append("</key>");
        sb.append("<value>");
        sb.append(header.getHeaderValue());
        sb.append("</value>");
        sb.append("</header>");
      }
      sb.append("</headers>");
    }

    sb.append("</request>");

    sb.append("<limits>");
    sb.append("<max_siblings>");
    sb.append(apiEntry.getMaxSiblings());
    sb.append("</max_siblings>");
    sb.append("<base_url>");
    sb.append(apiEntry.getBaseUrl());
    sb.append("</base_url>");
    sb.append("</limits>");

    sb.append("</test_definition>");

    apiEntry.setMessage(sb.toString());
  }
 /**
  * Generates view of questionnaire for JSP and stores it into apiEntry.
  *
  * @param apiEntry for which the view is generated.
  */
 private void generateViewOfQuestionnaires(ApiEntry apiEntry) {
   String evaluation = apiEntry.getQuestionnaires().evaluate();
   StringBuilder sb = new StringBuilder(apiEntry.getMessage());
   sb.append("\n<div id=\"questionnairesEvaluation\">");
   sb.append("<h4>Questionnaires evaluation</h4>");
   if (evaluation.equals("")) {
     sb.append("Client-Server OK!<br /> Stateless constraints OK!<br />");
   } else {
     if (!evaluation.contains("This is violation of REST constraint: Client-Server.")) {
       sb.append("Client-Server constraint OK!<br />");
     } else {
       sb.append("Client-Server constraint VIOLATION!<br />");
     }
     if (!evaluation.contains("This is violation of REST constraint: Stateless.")) {
       sb.append("Stateless constraint OK!<br />");
     } else {
       sb.append("Stateless constraint VIOLATION!<br />");
     }
     sb.append(evaluation);
   }
   sb.append("</div>\n");
   apiEntry.setMessage(sb.toString());
 }