/* 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.bdoc;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import org.digidoc4j.SignatureValidationResult;
import org.digidoc4j.exceptions.DigiDoc4JException;
import org.digidoc4j.exceptions.TechnicalException;
import org.digidoc4j.impl.bdoc.report.ContainerValidationReport;
import org.digidoc4j.impl.bdoc.report.SignatureValidationReport;
import org.digidoc4j.impl.bdoc.report.SignatureValidationReportCreator;
import org.digidoc4j.impl.bdoc.xades.validation.SignatureValidationData;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import eu.europa.esig.dss.jaxb.simplereport.SimpleReport;
import eu.europa.esig.dss.jaxb.simplereport.XmlPolicy;
public class BDocValidationReportBuilder {
private final static Logger logger = LoggerFactory.getLogger(BDocValidationReportBuilder.class);
private List<DigiDoc4JException> manifestErrors;
private List<SignatureValidationData> signatureValidationData;
private String reportInXml;
public BDocValidationReportBuilder(List<SignatureValidationData> signatureValidationData, List<DigiDoc4JException> manifestErrors) {
logger.debug("Initializing BDoc validation report builder");
this.manifestErrors = manifestErrors;
this.signatureValidationData = signatureValidationData;
}
public String buildXmlReport() {
if (reportInXml == null) {
reportInXml = generateNewReport();
}
return reportInXml;
}
private String generateNewReport() {
logger.debug("Generating a new XML validation report");
ContainerValidationReport report = new ContainerValidationReport();
report.setPolicy(extractValidationPolicy());
report.setValidationTime(new Date());
report.setSignaturesCount(signatureValidationData.size());
report.setValidSignaturesCount(extractValidSignaturesCount());
report.setSignatures(createSignaturesValidationReport());
report.setContainerErrors(createContainerErrors());
return createFormattedXmlString(report);
}
private List<SignatureValidationReport> createSignaturesValidationReport() {
List<SignatureValidationReport> signaturesReport = new ArrayList<>();
for (SignatureValidationData validationData : signatureValidationData) {
SignatureValidationReport signatureValidationReport = SignatureValidationReportCreator.create(validationData);
signaturesReport.add(signatureValidationReport);
}
return signaturesReport;
}
private XmlPolicy extractValidationPolicy() {
if (signatureValidationData.isEmpty()) {
return null;
}
SignatureValidationData validationData = signatureValidationData.get(0);
SimpleReport simpleReport = validationData.getReport().getReport().getSimpleReportJaxb();
return simpleReport.getPolicy();
}
private int extractValidSignaturesCount() {
int validSignaturesCount = 0;
for (SignatureValidationData validationData : signatureValidationData) {
SignatureValidationResult validationResult = validationData.getValidationResult();
if (validationResult.isValid()) {
validSignaturesCount++;
}
}
return validSignaturesCount;
}
private List<String> createContainerErrors() {
List<String> containerErrors = new ArrayList<>();
for (DigiDoc4JException manifestError : manifestErrors) {
containerErrors.add(manifestError.getMessage());
}
return containerErrors;
}
private String createFormattedXmlString(ContainerValidationReport simpleReport) {
try {
JAXBContext context = JAXBContext.newInstance(ContainerValidationReport.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
StringWriter stringWriter = new StringWriter();
marshaller.marshal(simpleReport, stringWriter);
String xmlReport = stringWriter.toString();
logger.trace(xmlReport);
return xmlReport;
} catch (JAXBException e) {
throw new TechnicalException("Failed to create validation report in XML: " + e.getMessage(), e);
}
}
}