/******************************************************************************* * Copyright 2012 Pearson Education * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package org.semantictools.jsonld.io.impl; import java.io.PrintWriter; import org.semantictools.jsonld.LdValidationMessage; import org.semantictools.jsonld.LdValidationReport; import org.semantictools.jsonld.io.LdValidationReportWriter; public class HtmlReportWriter implements LdValidationReportWriter { @Override public void writeReport(PrintWriter writer, LdValidationReport report) { HtmlWriter delegate = new HtmlWriter(writer); delegate.writeReport(report); writer.flush(); } static class HtmlWriter { private int indentSize=2; private int indent; private PrintWriter writer; public HtmlWriter(PrintWriter out) { this.writer = out; } private HtmlWriter pushIndent() { indent++; return this; } private HtmlWriter popIndent() { indent--; return this; } private HtmlWriter indent() { for (int i=0; i<indent*indentSize; i++) { writer.print(' '); } return this; } private HtmlWriter print(String text) { writer.print(text); return this; } private HtmlWriter println(String text) { writer.println(text); return this; } private HtmlWriter println() { writer.println(); return this; } public void writeReport(LdValidationReport report) { beginHtml(); println("<head>"); printStyle(); println("</head>"); println("<body>"); println("<H1>JSON-LD Validation Report</H1>"); pushIndent(); if (report.listMessages().isEmpty()) { printOk(); } else { printTable(report); } popIndent(); println("</body>"); endHtml(); } private void printOk() { indent().println("<div class=\"ok\">OK!</div>"); indent().println("<div>No errors or warnings detected.</div>"); } private void printTable(LdValidationReport report) { openTag("<table>"); openTag("<tr>"); indent().println("<th>Severity</th><th>Path</th><th>Description</th>"); endTag("</tr>"); for (LdValidationMessage message : report.listMessages()) { printMessage(message); } endTag("</table>"); } public static void main(String[] args) { LdValidationReport report = new LdValidationReport(); HtmlReportWriter writer = new HtmlReportWriter(); PrintWriter out = new PrintWriter(System.out); writer.writeReport(out, report); out.flush(); } private void printStyle() { openTag("<style>"); println("BODY {"); pushIndent(); indent().println("font-family: sans-serif;"); indent().println("padding-left: 3em;"); popIndent(); println("}"); println("H1 {"); pushIndent(); indent().println("color: #336699;"); popIndent(); println("}"); println("TABLE {"); pushIndent(); indent().println("border-collapse: collapse;"); indent().println("border-spacing: 0px;"); popIndent(); println("}"); println("TH {"); pushIndent(); indent().println("border-collapse: collapse;"); indent().println("border: 1px solid #336699;"); indent().println("padding: 5px;"); indent().println("background-color: #336699;"); indent().println("color: white;"); indent().println("font-weight: bold;"); popIndent(); println("}"); println("TD {"); pushIndent(); indent().println("border-collapse: collapse;"); indent().println("border: 1px solid #336699;"); indent().println("padding: 5px;"); popIndent(); println("}"); println(".ok {"); pushIndent(); indent().println("font-weight: bold;"); indent().println("margin-bottom: 0.5em;"); popIndent(); println("}"); endTag("</style>"); } private void printMessage(LdValidationMessage message) { String text = message.getText().replace("\n", "<br>\n"); openTag("<tr>"); indent().print("<td>").print(message.getResult().name()).println("</td>"); indent().print("<td>").print(message.getPath()).println("</td>"); indent().print("<td>").print(text).println("</td>"); endTag("</tr>"); } private void endTag(String text) { popIndent(); indent().println(text); } private void openTag(String text) { indent().println(text); pushIndent(); } private void closeEmptyTag() { println("/>"); } private void closeTag() { println(">"); } private HtmlWriter attr(String name, String value) { print(" "); print(name); print("="); print("\""); print(value); print("\""); return this; } private HtmlWriter beginTag(String tag) { indent().print("<"); print(tag); return this; } private void endHtml() { println("</html>"); } private void beginHtml() { println("<html>"); } } }