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);
}
}