/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE file at the root of the source
* tree and available online at
*
* https://github.com/keeps/roda
*/
package org.roda.core.data.v2.validation;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
public class ValidationReport implements Serializable {
private static final long serialVersionUID = 4670965331325954161L;
private List<ValidationIssue> issues;
private boolean valid;
private String message;
public ValidationReport() {
this.valid = true;
this.issues = new ArrayList<>();
}
public List<ValidationIssue> getIssues() {
return issues;
}
public void setIssues(List<ValidationIssue> issues) {
this.issues = issues;
}
public boolean isValid() {
return valid;
}
public void setValid(boolean valid) {
this.valid = valid;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public void addIssue(ValidationIssue issue) {
if (issues == null) {
issues = new ArrayList<>();
}
issues.add(issue);
}
@Override
public String toString() {
return "ValidationReport [valid=" + valid + ", message=" + message + ", issues=" + issues + "]";
}
public String toHtml() {
return toHtml(true, true);
}
public String toHtml(boolean fullHtml, boolean addDefaultCss) {
return toHtml(fullHtml, addDefaultCss, true, "");
}
public String toHtml(boolean fullHtml, boolean addDefaultCss, boolean addIssueValues, String title) {
StringBuilder sb = new StringBuilder();
if (fullHtml) {
sb.append("<html>");
sb.append("<head>");
sb.append("<title>Validation report</title>");
sb.append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />");
if (addDefaultCss) {
sb.append(getDefaultCss());
}
sb.append("</head>");
sb.append("<body>");
sb.append("<h1>Validation report</h1>");
}
// open report
sb.append(getDivBeginning("report"));
// is it valid?
if (title.isEmpty()) {
getValidationEntryAttribute(sb, "valid", "Is valid?", isValid() ? "yes" : "no");
} else {
getValidationEntryAttribute(sb, "valid", title, "");
}
if (message != null && !message.trim().isEmpty()) {
sb.append(getDivBeginning("message"));
// FIXME lfaria 20161018: escape HTML
sb.append(message);
sb.append(getDivEnding());
}
// add validation entries
sb.append(getDivBeginning("entries"));
for (ValidationIssue validationEntry : issues) {
sb.append(getValidationEntryDiv(validationEntry, addIssueValues));
}
sb.append(getDivEnding());
// close report
sb.append(getDivEnding());
if (fullHtml) {
// wrap up
sb.append("</body>");
sb.append("</html>");
}
return sb.toString();
}
private String getDivBeginning(String classString) {
return "<div class=\"" + classString + "\">";
}
private String getDivEnding() {
return "</div>";
}
private String getValidationEntryDiv(ValidationIssue validationEntry, boolean addIssueValues) {
StringBuilder sb = new StringBuilder();
sb.append(getDivBeginning("entry " + "level_error"));
// message
getValidationEntryAttribute(sb, "message", "Message", validationEntry.getMessage());
if (addIssueValues) {
// line number
getValidationEntryAttribute(sb, "line_number", "Line number", Integer.toString(validationEntry.getLineNumber()));
// column number
getValidationEntryAttribute(sb, "column_number", "Column number",
Integer.toString(validationEntry.getColumnNumber()));
}
sb.append(getDivEnding());
return sb.toString();
}
private void getValidationEntryAttribute(StringBuilder sb, String attrClass, String label, String value) {
sb.append(getDivBeginning("entry_attr " + attrClass));
sb.append(getDivBeginning("label"));
sb.append(label);
sb.append(getDivEnding());
sb.append(getDivBeginning("value"));
sb.append(value);
sb.append(getDivEnding());
sb.append(getDivEnding());
}
private String getDefaultCss() {
StringBuilder sb = new StringBuilder();
sb.append("<style>");
sb.append(
".valid {border-bottom: 1px solid black; border-left: 2px solid black;; margin-bottom: 10px; padding: 5px;} ");
sb.append(".entry {display: block; margin-bottom: 10px;} ");
sb.append(".entry div, .valid div {padding-left: 5px; padding-right: 5px;} ");
sb.append(".level_info {border-bottom: 1px solid blue; border-left: 2px solid blue;} ");
sb.append(".level_warning {border-bottom: 1px solid orange; border-left: 2px solid orange;} ");
sb.append(".level_error {border-bottom: 1px solid red; border-left: 2px solid red;} ");
sb.append(".entry .label, .valid .label {font-weight: bold;} ");
sb.append(".entry .label, .entry .value, .valid .label, .valid .value {display: inline; } ");
sb.append("</style>");
return sb.toString();
}
}