/* DigiDoc4J library
*
* This software is released under either the GNU Library General Public
* License (see LICENSE.LGPL).
*
* Note that the only valid version of the LGPL license as far as this
* project is concerned is the original GNU Library General Public License
* Version 2.1, February 1999
*/
package org.digidoc4j.impl.ddoc;
import ee.sk.digidoc.DigiDocException;
import ee.sk.digidoc.SignedDoc;
import org.digidoc4j.ValidationResult;
import org.digidoc4j.exceptions.DigiDoc4JException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Comment;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSSerializer;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.util.ArrayList;
import java.util.List;
/**
* Overview of errors and warnings for DDoc
*/
public class ValidationResultForDDoc implements ValidationResult {
private static final Logger logger = LoggerFactory.getLogger(ValidationResultForDDoc.class);
private List<DigiDoc4JException> containerExceptions = new ArrayList<>();
private boolean hasFatalErrors = false;
private List<DigiDoc4JException> errors = new ArrayList<>();
private Document report;
private Element rootElement;
/**
* Constructor
*
* @param exceptions add description
*/
public ValidationResultForDDoc(List<DigiDocException> exceptions) {
this(exceptions, null);
logger.debug("");
}
/**
* Constructor
*
* @param exceptions add description
* @param openContainerExceptions list of exceptions encountered when opening the container
*/
public ValidationResultForDDoc(List<DigiDocException> exceptions,
List<DigiDocException> openContainerExceptions) {
logger.debug("");
Element childElement;
initXMLReport();
if (openContainerExceptions != null) {
for (DigiDocException exception : openContainerExceptions) {
DigiDoc4JException digiDoc4JException = new DigiDoc4JException(exception.getCode(), exception.getMessage());
containerExceptions.add(digiDoc4JException);
if (SignedDoc.hasFatalErrs((ArrayList) openContainerExceptions)) {
hasFatalErrors = true;
}
}
exceptions.addAll(0, openContainerExceptions);
}
for (DigiDocException exception : exceptions) {
String message = exception.getMessage();
int code = exception.getCode();
DigiDoc4JException digiDoc4JException = new DigiDoc4JException(code, message);
logger.debug("Validation error." + " Code: " + code + ", message: " + message);
errors.add(digiDoc4JException);
childElement = report.createElement("error");
childElement.setAttribute("Code", Integer.toString(code));
childElement.setAttribute("Message", message);
rootElement.appendChild(childElement);
}
}
/**
* Does the container have fatal errors
*
* @return true if fatal errors have been encountered
*/
public boolean hasFatalErrors() {
logger.debug("Has fatal errors: " + hasFatalErrors);
return hasFatalErrors;
}
private void initXMLReport() {
logger.debug("");
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder db = dbf.newDocumentBuilder();
report = db.newDocument();
rootElement = report.createElement("root");
report.appendChild(rootElement);
Comment comment = report.createComment("DDoc verification result");
report.insertBefore(comment, rootElement);
} catch (ParserConfigurationException e) {
logger.error(e.getMessage());
throw new DigiDoc4JException(e);
}
}
@Override
public List<DigiDoc4JException> getErrors() {
logger.debug("Returning " + errors.size() + " errors");
return errors;
}
@Override
public List<DigiDoc4JException> getWarnings() {
logger.debug("");
return new ArrayList<>();
}
@Override
public boolean hasErrors() {
boolean hasErrors = (errors.size() != 0);
logger.debug("Has Errors: " + hasErrors);
return hasErrors;
}
@Override
public boolean hasWarnings() {
logger.debug("");
return false;
}
@Override
public boolean isValid() {
logger.debug("");
return !hasErrors();
}
@Override
public String getReport() {
logger.debug("");
return reportToString(report);
}
static String reportToString(Document document) {
logger.debug("");
DOMImplementationLS domImplementation = (DOMImplementationLS) document.getImplementation();
LSSerializer lsSerializer = domImplementation.createLSSerializer();
return lsSerializer.writeToString(document);
}
@Override
public List<DigiDoc4JException> getContainerErrors() {
logger.debug("");
return containerExceptions;
}
}