package husacct.validate.task.imexporting.reporting;
import husacct.common.enums.ExtensionTypes;
import husacct.validate.domain.validation.Violation;
import husacct.validate.domain.validation.internaltransferobjects.ViolationsPerSeverity;
import husacct.validate.task.TaskServiceImpl;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URISyntaxException;
public class HTMLReportWriter extends ReportWriter {
private FileWriter writer;
private BufferedWriter html;
// Resources
private File resourcesDir;
private File javascriptDir;
private File jqueryJSOutput;
private File dataTableJSOutput;
private File imagenew;
private File cssDir;
private File cssDestination;
public HTMLReportWriter(Report report, String path, String fileName, TaskServiceImpl taskServiceImpl) throws IOException {
super(report, path, fileName, ExtensionTypes.HTML, taskServiceImpl);
}
@Override
public void createReport() throws IOException, URISyntaxException {
createFile();
createResources();
writer = new FileWriter(getFileName());
html = new BufferedWriter(writer);
html.append("<html>");
createStatics();
createBody();
html.append("</html>");
html.flush();
html.close();
}
private void createResources() throws IOException, URISyntaxException {
resourcesDir = new File(path + "/HUSACCT Report Resources");
resourcesDir.mkdir();
javascriptDir = new File(resourcesDir + "/js");
javascriptDir.mkdir();
jqueryJSOutput = new File(javascriptDir + "/jquery-1.7.2.min.js");
copyfile(getClass().getClassLoader().getResourceAsStream("husacct/common/resources/validate/jquery-1.7.2.min.js"), jqueryJSOutput);
dataTableJSOutput = new File(javascriptDir + "/jquery.dataTables.js");
copyfile(getClass().getClassLoader().getResourceAsStream("husacct/common/resources/validate/jquery.dataTables.js"), dataTableJSOutput);
File imageold = new File(report.getImagePath());
FileInputStream fis = new FileInputStream(imageold);
imagenew = new File(resourcesDir + "/image.png");
copyfile(fis, imagenew);
fis.close();
imageold.delete();
cssDir = new File(resourcesDir + "/css");
cssDir.mkdir();
InputStream cssResource = getClass().getClassLoader().getResourceAsStream("husacct/common/resources/validate/style.css");
cssDestination = new File(cssDir + "/style.css");
copyfile(cssResource, cssDestination);
}
private void createStatics() throws IOException {
html.append("<head>");
html.append("<script type=\"text/javascript\" src=\"./HUSACCT Report Resources/js/jquery-1.7.2.min.js\"></script>");
html.append("<script type=\"text/javascript\" src=\"./HUSACCT Report Resources/js/jquery.dataTables.js\"></script>");
html.append("<script type=\"text/javascript\">$(document).ready(function() {$('#example').dataTable( { \"bPaginate\": false, bInfo : false} );}); </script>");
html.append("<link rel=\"stylesheet\" href=\"./HUSACCT Report Resources/css/style.css\" type=\"text/css\" />");
html.append("</head>");
}
private void createBody() throws IOException {
html.append("<body>");
html.append("<table width=\"100%\">");
html.append("<tr>");
html.append("<td>");
createStatistics();
html.append("</td>");
html.append("</tr>");
html.append("<tr>");
html.append("<td>");
createTable();
html.append("</td>");
html.append("</tr>");
html.append("</table>");
html.append("</body>");
}
private void createStatistics() throws IOException {
html.append("<div class=\"image\">");
html.append("<img src=\"./HUSACCT Report Resources/image.png\"/>");
html.append("</div>");
html.append("<span class=\"title\">HUSACCT HTML REPORT</span><br/>");
html.append("<span>Date generated: " + getCurrentDate() + "</span><br />Project: " + report.getProjectName() + "<br />Version: " + report.getVersion() + "<br />");
html.append("<span>Violations generated on: " + report.getFormattedDate() + "</span><br />");
html.append("<span class=\"stats\">Statistics</span><br/>");
html.append("Total violations: " + report.getViolations().getValue().size() + "<br />" + "<br />");
for (ViolationsPerSeverity severityPerViolation : report.getViolationsPerSeverity()) {
html.append(severityPerViolation.getSeverity().getSeverityKeyTranslated() + ": " + severityPerViolation.getAmount() + "<br />");
}
}
private void createTable() throws IOException {
html.append("<span class=\"stats\">Violations</span>");
html.append("<table id=\"example\" border=\"1\" width=\"100%\">");
html.append("<thead>");
html.append("<tr>");
for (String columnHeader : report.getLocaleColumnHeaders()) {
html.append("<th>");
if (columnHeader != null && !columnHeader.trim().equals("")) {
html.append(columnHeader);
} else {
html.append(" ");
}
html.append("</th>");
}
html.append("</tr>");
html.append("</thead>");
html.append("<tbody>");
for (Violation violation : report.getViolations().getValue()) {
html.append("<tr>");
// Source
if (violation.getClassPathFrom() != null) {
createColumn(violation.getClassPathFrom());
} else {
createColumn("");
}
// Rule
String message = taskServiceImpl.getMessage(violation);
if (message != null) {
createColumn(message);
} else {
createColumn("");
}
// LineNumber
if (violation.getLinenumber() > 0) {
createColumn("" + violation.getLinenumber());
} else {
createColumn("");
}
// Dependency Kind
if (violation.getViolationTypeKey() != null) {
createColumn(getDependencyKindValue(violation.getViolationTypeKey(), violation.getIsIndirect()));
} else {
createColumn("");
}
// Target
if (violation.getClassPathTo() != null) {
createColumn(violation.getClassPathTo());
} else {
createColumn("");
}
// Severity
if (violation.getSeverity() != null) {
createColumn(violation.getSeverity().getSeverityKeyTranslated());
} else {
createColumn("");
}
html.append("</tr>");
}
html.append("</tbody>");
html.append("</table>");
}
private void createColumn(String content) throws IOException {
html.append("<td>");
if (content != null && !content.trim().equals("")) {
html.append(content);
} else {
html.append(" ");
}
html.append("</td>");
}
private void copyfile(InputStream inputStream, File destination) throws IOException {
OutputStream out = new FileOutputStream(destination);
byte[] buf = new byte[1024];
int len;
while ((len = inputStream.read(buf)) > 0) {
out.write(buf, 0, len);
}
inputStream.close();
out.close();
}
}