private void run()

in languagetool-dev/src/main/java/org/languagetool/dev/diff/RuleMatchDiffFinder.java [394:523]


  private void run(LightRuleMatchParser parser, File file1, File file2, File outputDir, String langCode, String date) throws IOException {
    if (file1.getName().equals("empty.json")) {
      fullMode = true;
    }
    LightRuleMatchParser.JsonParseResult jsonParseResult1 = parser.parseOutput(file1);
    List<LightRuleMatch> l1 = jsonParseResult1.result;
    LightRuleMatchParser.JsonParseResult jsonParseResult2 = parser.parseOutput(file2);
    List<LightRuleMatch> l2 = jsonParseResult2.result;
    String title = "Comparing " + file1.getName() + " to " + file2.getName();
    System.out.println(title);
    List<RuleMatchDiff> diffs = getDiffs(l1, l2);
    diffs.sort((k, j) -> {
        int idDiff = getFullId(k).compareTo(getFullId(j));
        if (idDiff == 0) {
          int diff2 = k.getStatus().compareTo(j.getStatus());
          if (diff2 == 0) {
            return k.getMarkedText().compareTo(j.getMarkedText());
          } else {
            return diff2;
          }
        }
        return idDiff;
      }
    );
    System.out.println("Total diffs found: " + diffs.size());
    Map<String, List<RuleMatchDiff>> keyToDiffs = groupDiffs(diffs);
    List<OutputFile> outputFiles = new ArrayList<>();
    for (Map.Entry<String, List<RuleMatchDiff>> entry : keyToDiffs.entrySet()) {
      String filename = "result_" + entry.getKey().replace("/", "_").replaceAll("[\\s_]+", "_") + ".html";
      /*if (filename.length() > 100) {
        System.out.println("WARN: Skipping " + filename);
        continue;
      }*/
      File outputFile = new File(outputDir, filename);
      if (entry.getValue().size() > 0) {
        outputFiles.add(new OutputFile(outputFile, entry.getValue()));
      }
      try (FileWriter fw = new FileWriter(outputFile)) {
        System.out.println("Writing result to " + outputFile);
        printHeader(title, fw);
        printDiffs(entry.getValue(), fw, langCode, date, filename, entry.getKey());
        printFooter(fw);
      }
    }
    try (FileWriter fw = new FileWriter(new File(outputDir, "index.html"))) {
      printHeader("Overview of regression results", fw);
      fw.write("<table class='sortable_table'>\n");
      fw.write("<thead>");
      fw.write("<tr>");
      fw.write("  <td>Total</td>");
      fw.write("  <td>ADD</td>");
      fw.write("  <td>REM</td>");
      fw.write("  <td>MOD</td>");
      fw.write("  <td>Source</td>");
      fw.write("  <td title='Picky'>P</td>");
      fw.write("  <td title='temp_off'>T</td>");
      fw.write("  <td title='Premium'>Prem</td>");
      fw.write("  <td>ID</td>");
      fw.write("  <td>Message of first match</td>");
      fw.write("</tr>");
      fw.write("</thead>");
      fw.write("<tbody>\n");
      outputFiles.sort((f1, f2) -> {
          long added1 = f1.items.stream().filter(k -> k.getStatus() == RuleMatchDiff.Status.ADDED).count();
          long added2 = f2.items.stream().filter(k -> k.getStatus() == RuleMatchDiff.Status.ADDED).count();
          if (added2 == added1) {
            long removed1 = f1.items.stream().filter(k -> k.getStatus() == RuleMatchDiff.Status.REMOVED).count();
            long removed2 = f2.items.stream().filter(k -> k.getStatus() == RuleMatchDiff.Status.REMOVED).count();
            return Long.compare(removed2, removed1);
          } else {
            return Long.compare(added2, added1);
          }
        }
      );
      for (OutputFile outputFile : outputFiles) {
        String file = outputFile.file.getName();
        fw.write("<tr>");
        fw.write("<td>" + outputFile.items.size() + "</td>");
        long added = outputFile.items.stream().filter(k -> k.getStatus() == RuleMatchDiff.Status.ADDED).count();
        fw.write("<td " + (added > 0 ? "style='background-color: #c7ffd0'" : "") + ">" + added + "</td>");
        long removed = outputFile.items.stream().filter(k -> k.getStatus() == RuleMatchDiff.Status.REMOVED).count();
        fw.write("<td " + (removed > 0 ? "style='background-color: #ffd2d8'" : "") + ">" + removed + "</td>");
        fw.write("<td>" + outputFile.items.stream().filter(k -> k.getStatus() == RuleMatchDiff.Status.MODIFIED).count() + "</td>");
        fw.write("<td>");
        fw.write(StringUtils.replaceOnce(file, "result_", "").replaceFirst("_.*", ""));
        fw.write("</td>");
        if (outputFile.items.size() > 0 && outputFile.items.get(0).getNewMatch() != null) {
          fw.write("<td>" + (outputFile.items.get(0).getNewMatch().getTags().contains("picky") ? "p" : "") + "</td>");
        } else if (outputFile.items.size() > 0 && outputFile.items.get(0).getOldMatch() != null) {
          fw.write("<td>" + (outputFile.items.get(0).getOldMatch().getTags().contains("picky") ? "p" : "") + "</td>");
        } else {
          fw.write("<td></td>");
        }
        if (outputFile.items.size() > 0 && outputFile.items.get(0).getNewMatch() != null) {
          fw.write("<td>" + (outputFile.items.get(0).getNewMatch().getStatus() == LightRuleMatch.Status.temp_off ? "t" : "") + "</td>");
        } else if (outputFile.items.size() > 0 && outputFile.items.get(0).getOldMatch() != null) {
          fw.write("<td>" + (outputFile.items.get(0).getOldMatch().getStatus() == LightRuleMatch.Status.temp_off ? "t" : "") + "</td>");
        } else {
          fw.write("<td></td>");
        }
        if (outputFile.items.size() > 0 && outputFile.items.get(0).getNewMatch() != null) {
          fw.write("<td>" + (outputFile.items.get(0).getNewMatch().isPremium() ? "prem" : "") + "</td>");
        } else if (outputFile.items.size() > 0 && outputFile.items.get(0).getOldMatch() != null) {
          fw.write("<td>" + (outputFile.items.get(0).getOldMatch().isPremium() ? "prem" : "") + "</td>");
        } else {
          fw.write("<td></td>");
        }
        fw.write("<td>");
        String id = file.replaceFirst("result_.*?_", "").replace(".html", "");
        fw.write("  <a href='" + enc(file) + "'>" + id + "</a>");
        fw.write("  " + getAnalyticsLink(id, langCode));
        fw.write("</td>");
        if (outputFile.items.size() > 0 && outputFile.items.get(0).getNewMatch() != null) {
          fw.write("<td class='msg'>" + escapeSentence(outputFile.items.get(0).getNewMatch().getMessage()) + "</td>");
        } else if (outputFile.items.size() > 0 && outputFile.items.get(0).getOldMatch() != null) {
          fw.write("<td class='msg'>" + escapeSentence(outputFile.items.get(0).getOldMatch().getMessage()) + "</td>");
        } else {
          fw.write("<td></td>");
        }
        fw.write("</tr>\n");
      }
      fw.write("</tbody>");
      fw.write("</table>\n\n");
      fw.write("<br><table class='meta'>\n");
      fw.write("  <tr><td>Old API:</td> <td>" + jsonParseResult1.buildDates + "</td></tr>\n");
      fw.write("  <tr><td>New API:</td> <td>" + jsonParseResult2.buildDates + "</td></tr>\n");
      fw.write("</table>\n");
      printFooterForIndex(fw);
    }
  }