From 9f759fdb2831b7a552e9cff3d358509c2a98aba2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20R=C3=B6schke?= Date: Thu, 2 May 2024 12:32:52 +0200 Subject: [PATCH] Fixed Tests for PDFValidatior, switched to using ProcessingResults --- .../org/mustangproject/ZUGFeRD/Version.java | 5 ++ .../validator/PDFValidator.java | 27 +++++----- .../validator/PDFValidatorTest.java | 53 ++++++++++--------- .../validator/ResourceCase.java | 14 +++++ 4 files changed, 61 insertions(+), 38 deletions(-) create mode 100644 library/src/main/java/org/mustangproject/ZUGFeRD/Version.java diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/Version.java b/library/src/main/java/org/mustangproject/ZUGFeRD/Version.java new file mode 100644 index 00000000..07d370e9 --- /dev/null +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/Version.java @@ -0,0 +1,5 @@ +package org.mustangproject.ZUGFeRD; + +public class Version { + public static final String VERSION = "2.9.0"; +} diff --git a/validator/src/main/java/org/mustangproject/validator/PDFValidator.java b/validator/src/main/java/org/mustangproject/validator/PDFValidator.java index c850a86c..cbdd803b 100644 --- a/validator/src/main/java/org/mustangproject/validator/PDFValidator.java +++ b/validator/src/main/java/org/mustangproject/validator/PDFValidator.java @@ -35,6 +35,7 @@ import org.verapdf.features.FeatureFactory; import org.verapdf.metadata.fixer.FixerFactory; import org.verapdf.metadata.fixer.MetadataFixerConfig; import org.verapdf.gf.foundry.VeraGreenfieldFoundryProvider; +import org.verapdf.pdfa.flavours.PDFAFlavour; import org.verapdf.pdfa.validation.validators.ValidatorConfig; import org.verapdf.pdfa.validation.validators.ValidatorFactory; import org.verapdf.processor.BatchProcessor; @@ -42,6 +43,7 @@ import org.verapdf.processor.FormatOption; import org.verapdf.processor.ItemProcessor; import org.verapdf.processor.ProcessorConfig; import org.verapdf.processor.ProcessorFactory; +import org.verapdf.processor.ProcessorResult; import org.verapdf.processor.TaskType; import org.verapdf.processor.plugins.PluginsCollectionConfig; import org.verapdf.processor.reports.ItemDetails; @@ -57,12 +59,14 @@ public class PDFValidator extends Validator { } private static final Logger LOGGER = LoggerFactory.getLogger(PDFValidator.class.getCanonicalName()); // log output + private static final PDFAFlavour[] PDF_A_3_FLAVOURS = {PDFAFlavour.PDFA_3_A, PDFAFlavour.PDFA_3_A, PDFAFlavour.PDFA_3_A}; private String pdfFilename; private byte[] fileContents; private String pdfReport; + private ProcessorResult processorResult = null; private String Signature; @@ -113,8 +117,8 @@ public class PDFValidator extends Validator { // starting the processor ItemDetails itemDetails = ItemDetails.fromValues(pdfFilename); inputStream.mark(Integer.MAX_VALUE); - processor.process(itemDetails, inputStream); - pdfReport = reportStream.toString("utf-8").replaceAll( + processorResult = processor.process(itemDetails, inputStream); + pdfReport = processorResult.getValidationResult().toString().replaceAll( "<\\?xml version=\"1\\.0\" encoding=\"utf-8\"\\?>", "" ); @@ -252,14 +256,7 @@ public class PDFValidator extends Validator { .setSection(16).setPart(EPart.pdf)); } - - } catch (final SAXException e) { - LOGGER.error(e.getMessage(), e); - } catch (final IOException e) { - LOGGER.error(e.getMessage(), e); - } catch (final ParserConfigurationException e) { - LOGGER.error(e.getMessage(), e); - } catch (final XPathExpressionException e) { + } catch (final SAXException | IOException | ParserConfigurationException | XPathExpressionException e) { LOGGER.error(e.getMessage(), e); } zfXML = zi.getUTF8(); @@ -308,10 +305,11 @@ public class PDFValidator extends Validator { //end final long endTime = Calendar.getInstance().getTimeInMillis(); - if (!pdfReport.contains("validationReports compliant=\"1\"")) { + if (!processorResult.getValidationResult().isCompliant()) { context.setInvalid(); } - if (!pdfReport.contains("PDF/A-3")) { + if (Arrays.stream(PDF_A_3_FLAVOURS) + .anyMatch(pdfaFlavour -> processorResult.getValidationResult().getPDFAFlavour().equals(pdfaFlavour))) { context.addResultItem( new ValidationResultItem(ESeverity.error, "Not a PDF/A-3").setSection(23).setPart(EPart.pdf)); @@ -329,8 +327,9 @@ public class PDFValidator extends Validator { } - public void setFileContents(byte[] fileContents) { - this.fileContents = fileContents; + public void setFileContents(byte[] filecontents) throws IrrecoverableValidationError { + this.fileContents = filecontents; + } public String getRawXML() { diff --git a/validator/src/test/java/org/mustangproject/validator/PDFValidatorTest.java b/validator/src/test/java/org/mustangproject/validator/PDFValidatorTest.java index f267b094..5084dddd 100644 --- a/validator/src/test/java/org/mustangproject/validator/PDFValidatorTest.java +++ b/validator/src/test/java/org/mustangproject/validator/PDFValidatorTest.java @@ -55,15 +55,17 @@ public class PDFValidatorTest extends ResourceCase { try { - File tempFile = getResourceAsFile("XMLinvalidV2PDF.pdf");// need a more invalid file here + byte [] contents = getResourceAsByteArray("XMLinvalidV2PDF.pdf");// need a more invalid file here - pv.setFilename(tempFile.getAbsolutePath()); + pv.setFilename("XMLinvalidV2PDF.pdf"); + pv.setFileContents(contents); pv.validate(); // assertEquals("", pv.getXMLResult()); // - tempFile = getResourceAsFile("Facture_F20180027.pdf"); - pv.setFilename(tempFile.getAbsolutePath()); + contents = getResourceAsByteArray("Facture_F20180027.pdf"); + pv.setFilename("Facture_F20180027.pdf"); + pv.setFileContents(contents); pv.validate(); String actual = pv.getXMLResult(); assertEquals(true, actual.contains("summary status=\"valid")); @@ -74,10 +76,10 @@ public class PDFValidatorTest extends ResourceCase { xv.validate(); actual = vc.getXMLResult(); - assertEquals(true, actual.contains("validationReport profileName=\"PDF/A-3")); - assertEquals(true, actual.contains("batchSummary totalJobs=\"1\" failedToParse=\"0\" encrypted=\"0\"")); + assertEquals(true, actual.contains("flavour=3u")); + assertEquals(true, actual.contains("flavour=3b")); assertEquals(true, - actual.contains("validationReports compliant=\"1\" nonCompliant=\"0\" failedJobs=\"0\">")); + actual.contains("isCompliant=true")); // test some xml // assertEquals(true, actual.contains("2")); // valid one - tempFile = getResourceAsFile("validV2PDF.pdf"); + contents = getResourceAsByteArray("validV2PDF.pdf"); - pv.setFilename(tempFile.getAbsolutePath()); + pv.setFilename("validV2PDF.pdf"); + pv.setFileContents(contents); vc.clear(); pv.validate(); actual = pv.getXMLResult(); - assertEquals(true, actual.contains("validationReport profileName=\"PDF/A-3")); - assertEquals(true, actual.contains("batchSummary totalJobs=\"1\" failedToParse=\"0\" encrypted=\"0\"")); - assertEquals(true, - actual.contains("validationReports compliant=\"1\" nonCompliant=\"0\" failedJobs=\"0\">")); + assertEquals(true, actual.contains("flavour=3u")); + assertEquals(true, actual.contains("summary status=\"valid")); + assertEquals(false, actual.contains("summary status=\"invalid")); assertEquals(false, actual.contains("XMP Metadata: ConformanceLevel contains invalid value")); - tempFile = getResourceAsFile("attributeBasedXMP_zugferd_2p0_EN16931_Einfach.pdf"); + contents = getResourceAsByteArray("attributeBasedXMP_zugferd_2p0_EN16931_Einfach.pdf"); - pv.setFilename(tempFile.getAbsolutePath()); + pv.setFilename("attributeBasedXMP_zugferd_2p0_EN16931_Einfach.pdf"); + pv.setFileContents(contents); vc.clear(); pv.validate(); actual = pv.getXMLResult(); diff --git a/validator/src/test/java/org/mustangproject/validator/ResourceCase.java b/validator/src/test/java/org/mustangproject/validator/ResourceCase.java index 5810700f..4149ca65 100644 --- a/validator/src/test/java/org/mustangproject/validator/ResourceCase.java +++ b/validator/src/test/java/org/mustangproject/validator/ResourceCase.java @@ -37,4 +37,18 @@ public class ResourceCase extends TestCase { } } + public static byte[] getResourceAsByteArray(String resourcePath) { + try { + InputStream in = ClassLoader.getSystemClassLoader().getResourceAsStream(resourcePath); + if (in == null) { + return null; + } + return in.readAllBytes(); + } catch (IOException e) { + LOGGER.error(e.getMessage(), e); + return null; + } + } + + }