package eu.europa.esig.dss.asic.validation; import java.util.ArrayList; import java.util.List; import eu.europa.esig.dss.ASiCContainerType; import eu.europa.esig.dss.DSSDocument; import eu.europa.esig.dss.DSSException; import eu.europa.esig.dss.DSSUnsupportedOperationException; import eu.europa.esig.dss.DSSUtils; import eu.europa.esig.dss.asic.ASiCExtractResult; import eu.europa.esig.dss.asic.ASiCUtils; import eu.europa.esig.dss.asic.AbstractASiCContainerExtractor; import eu.europa.esig.dss.utils.Utils; import eu.europa.esig.dss.validation.AdvancedSignature; import eu.europa.esig.dss.validation.ContainerInfo; import eu.europa.esig.dss.validation.DocumentValidator; import eu.europa.esig.dss.validation.ManifestFile; import eu.europa.esig.dss.validation.SignedDocumentValidator; import eu.europa.esig.dss.validation.ValidationContext; public abstract class AbstractASiCContainerValidator extends SignedDocumentValidator { protected List<DocumentValidator> validators; private ASiCExtractResult extractResult; private ASiCContainerType containerType; /** * Default constructor used with reflexion (see SignedDocumentValidator) */ private AbstractASiCContainerValidator() { super(null); this.document = null; } protected AbstractASiCContainerValidator(final DSSDocument document) { super(null); this.document = document; } protected void analyseEntries() { AbstractASiCContainerExtractor extractor = getArchiveExtractor(); extractResult = extractor.extract(); containerType = ASiCUtils.getContainerType(document, extractResult.getMimeTypeDocument(), extractResult.getZipComment(), extractResult.getSignedDocuments()); } abstract AbstractASiCContainerExtractor getArchiveExtractor(); public ASiCContainerType getContainerType() { return containerType; } @Override public List<AdvancedSignature> processSignaturesValidation(final ValidationContext validationContext, boolean structuralValidation) { List<AdvancedSignature> allSignatures = new ArrayList<AdvancedSignature>(); List<DocumentValidator> currentValidators = getValidators(); for (DocumentValidator documentValidator : currentValidators) { // CAdES / XAdES allSignatures.addAll(documentValidator.processSignaturesValidation(validationContext, structuralValidation)); } return allSignatures; } /** * This method allows to retrieve the container information (ASiC Container) * * @return */ @Override protected ContainerInfo getContainerInfo() { ContainerInfo containerInfo = new ContainerInfo(); containerInfo.setContainerType(containerType); containerInfo.setZipComment(extractResult.getZipComment()); DSSDocument mimeTypeDocument = extractResult.getMimeTypeDocument(); if (mimeTypeDocument != null) { String mimeTypeContent = DSSUtils.toString(DSSUtils.toByteArray(mimeTypeDocument)); containerInfo.setMimeTypeFilePresent(true); containerInfo.setMimeTypeContent(mimeTypeContent); } else { containerInfo.setMimeTypeFilePresent(false); } List<DSSDocument> signedDocuments = extractResult.getSignedDocuments(); if (Utils.isCollectionNotEmpty(signedDocuments)) { List<String> signedDocumentFilenames = new ArrayList<String>(); for (DSSDocument dssDocument : signedDocuments) { signedDocumentFilenames.add(dssDocument.getName()); } containerInfo.setSignedDocumentFilenames(signedDocumentFilenames); } containerInfo.setManifestFiles(getManifestFilesDecriptions()); return containerInfo; } protected abstract List<ManifestFile> getManifestFilesDecriptions(); @Override public List<AdvancedSignature> getSignatures() { List<AdvancedSignature> allSignatures = new ArrayList<AdvancedSignature>(); List<DocumentValidator> currentValidators = getValidators(); for (DocumentValidator documentValidator : currentValidators) { allSignatures.addAll(documentValidator.getSignatures()); } return allSignatures; } abstract List<DocumentValidator> getValidators(); protected List<DSSDocument> getSignatureDocuments() { return extractResult.getSignatureDocuments(); } protected List<DSSDocument> getSignedDocuments() { return extractResult.getSignedDocuments(); } protected List<DSSDocument> getManifestDocuments() { return extractResult.getManifestDocuments(); } @Override public List<DSSDocument> getOriginalDocuments(String signatureId) throws DSSException { // TODO throw new DSSUnsupportedOperationException("This method is not applicable for this kind of file!"); } }