Skip to content

Commit

Permalink
control PDF error dir
Browse files Browse the repository at this point in the history
Add a new parameter to place PDF error files in specified directory. If it is not specified, then the PDF error files are tossed.
  • Loading branch information
Al Niessner authored and Al Niessner committed Jun 26, 2023
1 parent 18852e1 commit 92e6c2b
Show file tree
Hide file tree
Showing 7 changed files with 58 additions and 12 deletions.
8 changes: 6 additions & 2 deletions src/main/java/gov/nasa/pds/tools/label/LocationValidator.java
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ public class LocationValidator {
private RuleContext ruleContext;
private String validationRule;
private String labelExtension;
private String pdfErrorDir;

/*
* Sets the report object in BundleManager static class.
Expand Down Expand Up @@ -430,10 +431,13 @@ public void setRule(String ruleName) {
}

public void setEveryN(int value) {
ruleContext.setEveryN(value);
ruleContext.setEveryN(value);
}
public void setSpotCheckData(int value) {
ruleContext.setSpotCheckData(value);
ruleContext.setSpotCheckData(value);
}
public void setPDFErrorDir(String dir) {
ruleContext.setPDFErrorDir(dir);
}

public void setAllowUnlabeledFiles(boolean flag) {
Expand Down
15 changes: 9 additions & 6 deletions src/main/java/gov/nasa/pds/tools/util/PDFUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -49,12 +49,15 @@ public URL getTarget() {
return (this.target);
}

private synchronized void writeErrorToFile(URI uri, ValidationResult result, String flavor) {
private synchronized void writeErrorToFile(String baseDir, URI uri, ValidationResult result, String flavor) {
// Ignore the write if baseDir has not been given
if (baseDir.isEmpty()) return;

// Write to an external file with ".error" appended to file name in user's
// default directory the content of result.

// Build the external filename and save it for other to access.
this.externalErrorFilename = System.getProperty("user.dir") + File.separator
this.externalErrorFilename = baseDir + File.separator
+ FilenameUtils.getName(uri.getPath()) + "." + flavor + ".error.csv";

LOG.debug("writeErrorToFile:uri,this.externalErrorFilename {},{}", uri,
Expand Down Expand Up @@ -99,7 +102,7 @@ private synchronized void writeErrorToFile(URI uri, ValidationResult result, Str
}
}

private boolean validatePDF(URI uri, String pdfRef) throws IOException {
private boolean validatePDF(String baseDir, URI uri, String pdfRef) throws IOException {
boolean pdfValidateFlag = false;

try {
Expand Down Expand Up @@ -130,7 +133,7 @@ private boolean validatePDF(URI uri, String pdfRef) throws IOException {

// Write the result to external file so the user can look over in the validate
// report.
this.writeErrorToFile(uri, result, parser.getFlavour().getId());
this.writeErrorToFile(baseDir, uri, result, parser.getFlavour().getId());

this.errorMessage = "Validation failed for flavour PDF/A-" + detectedFlavour.getId()
+ ". Detailed error output can be found at " + this.getExternalErrorFilename();
Expand All @@ -151,7 +154,7 @@ private boolean validatePDF(URI uri, String pdfRef) throws IOException {
* @return true if the PDF is PDF/A compliant, and false otherwise
*
*/
public synchronized boolean validateFileStandardConformity(String pdfBase, URL parentURL)
public synchronized boolean validateFileStandardConformity(String baseDir, String pdfBase, URL parentURL)
throws Exception {
// Do the validation of the PDF document.
// https://verapdf.org/category/software/
Expand Down Expand Up @@ -188,7 +191,7 @@ public synchronized boolean validateFileStandardConformity(String pdfBase, URL p

// First, validate the PDF against PDFAFlavour.PDFA_1_A, if it does not
// validate, do it again with PDFAFlavour.PDFA_1_B
pdfValidateFlag = this.validatePDF(uri, pdfRef);
pdfValidateFlag = this.validatePDF(baseDir, uri, pdfRef);

LOG.debug("validateFileStandardConformity:pdfRef,pdfValidateFlag [{}],{}", parent,
pdfValidateFlag);
Expand Down
11 changes: 11 additions & 0 deletions src/main/java/gov/nasa/pds/tools/validate/rule/RuleContext.java
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,10 @@ public class RuleContext extends ContextBase {
* The key used to indicate how many lines or records to skip during content validation.
*/
public static final String EVERY_N_KEY = "validate.every-n";
/**
* Property to specify directory for PDF error directory.
*/
public static final String PDF_ERROR_DIR = "validate.pdfErrorDir";
/**
* The key used to indicate how many lines or records to skip during content validation.
*/
Expand Down Expand Up @@ -404,6 +408,13 @@ public int getEveryN() {
public void setEveryN(int value) {
putContextValue(EVERY_N_KEY, value);
}
public String getPDFErrorDir() {
return getContextValue(PDF_ERROR_DIR, String.class) == null ? "" : getContextValue(PDF_ERROR_DIR, String.class);
}

public void setPDFErrorDir(String dir) {
putContextValue(PDF_ERROR_DIR, dir);
}

public int getSpotCheckData() {
return getContextValue(SPOT_CHECK_DATA_KEY, Integer.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -727,7 +727,7 @@ private void handlePDF(ValidationTarget target, URL fileRef, TinyNodeImpl fileOb
DocumentsChecker check = new DocumentsChecker();
if (check.isMimeTypeCorrect(fileRef.toString(), "PDF/A")) {
// The parent is also needed for validateFileStandardConformity function.
pdfValidateFlag = this.pdfUtil.validateFileStandardConformity(pdfName, new URL(parent, directory));
pdfValidateFlag = this.pdfUtil.validateFileStandardConformity(this.getContext().getPDFErrorDir(), pdfName, new URL(parent, directory));

// Report an error if the PDF file is not PDF/A compliant.
if (!pdfValidateFlag) {
Expand Down
25 changes: 22 additions & 3 deletions src/main/java/gov/nasa/pds/validate/ValidateLauncher.java
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,8 @@ public class ValidateLauncher {

private int everyN;

private String pdfErrorDir;

private int spotCheckData;

private boolean allowUnlabeledFiles;
Expand Down Expand Up @@ -282,7 +284,7 @@ public ValidateLauncher() throws TransformerConfigurationException {
deprecatedFlagWarning = false;
validateContext = true;
checkInbetweenFields = false;

pdfErrorDir = "";
setLabelExtension(Constants.DEFAULT_LABEL_EXTENSION);

this.flushValidators();
Expand Down Expand Up @@ -331,6 +333,12 @@ public void query(CommandLine line) throws Exception {
throw new InvalidOptionException(
"Could not parse value '" + line.getOptionValue("everyN", "1") + "': " + a.getMessage());
}
setPDFErrorDir(line.getOptionValue("pdf-errors", ""));
File dir = new File(pdfErrorDir);
if (!dir.isDirectory()) {
throw new InvalidOptionException(
"Could not parse dir '" + this.pdfErrorDir + "' as a directory");
}

for (Option o : processedOptions) {
LOG.debug("query:o.getOpt() {}", o.getOpt());
Expand Down Expand Up @@ -759,6 +767,9 @@ public void query(File configuration) throws ConfigurationException {
if (config.containsKey(ConfigKey.EVERY_N)) {
setEveryN(config.getInt(ConfigKey.EVERY_N));
}
if (config.containsKey(ConfigKey.PDF_ERROR_DIR)) {
setPDFErrorDir(config.getString(ConfigKey.PDF_ERROR_DIR));
}
if (config.containsKey(ConfigKey.SPOT_CHECK_DATA)) {
setSpotCheckData(config.getInt(ConfigKey.SPOT_CHECK_DATA));
}
Expand Down Expand Up @@ -1069,8 +1080,12 @@ public void setMaxErrors(long value) {
}

public void setEveryN(int value) {
this.everyN = value;
}
this.everyN = value;
}

public void setPDFErrorDir(String dir) {
this.pdfErrorDir = dir;
}

public void setSpotCheckData(int value) {
this.spotCheckData = value;
Expand Down Expand Up @@ -1306,6 +1321,9 @@ public void setupReport() throws IOException {
if (everyN != 1) {
report.addParameter(" Data Every N " + everyN);
}
if (pdfErrorDir.isEmpty()) {
report.addParameter(" PDF Error Directory " + pdfErrorDir);
}
if (spotCheckData != -1) {
report.addParameter(" Data Spot Check " + spotCheckData);
}
Expand Down Expand Up @@ -1383,6 +1401,7 @@ public boolean doValidation(Map<URL, String> checksumManifest) throws Exception
validator.setCheckData(contentValidationFlag);
validator.setSpotCheckData(spotCheckData);
validator.setEveryN(everyN);
validator.setPDFErrorDir(pdfErrorDir);
validator.setAllowUnlabeledFiles(allowUnlabeledFiles);
validator.setValidateContext(validateContext);
validator.setSkipProductValidation(skipProductValidation);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,11 @@ public class ConfigKey {
*/
public static final String EVERY_N = "validate.everyN";

/**
* Property to specify directory for PDF error directory.
*/
public static final String PDF_ERROR_DIR = "validate.pdfErrorDir";

/**
* Property to specify how many lines or records to skip during content validation.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,10 @@ public enum Flag {
NO_DATA(null, "no-data-check",
"DEPRECATED: This option has been renamed to --skip-content-validation to be more consistent with other argument naming."),

PDF_ERROR_DIR(null, "pdf-errors", "directory", String.class,
"the directory to put PDF error reports that detail why a PDF file is not compliant that is not included in the standard report " +
"with undefined or empty string meaning the detailed reports are lost"),

/** Flag to disable data content validation. */
SKIP_CONTENT_VALIDATION("D", "skip-content-validation",
"Disable product content validation. The tool will skip check the bytes within the content of the data file."),
Expand Down

0 comments on commit 92e6c2b

Please sign in to comment.