From 003b81b2ca6e221a0d2ac51e0becc99ce24f1d8d Mon Sep 17 00:00:00 2001 From: Jordan Padams Date: Thu, 2 Jul 2026 17:16:15 -0700 Subject: [PATCH] Interim fix for M4A/AAC encoding type: recognize as valid, warn content validation unsupported (#1635) - Add M4A/AAC to EncodingMimeMapping so it no longer throws IllegalArgumentException - Replace internal error with a WARNING that content validation is not yet supported - Add new ProblemType CONTENT_VALIDATION_UNSUPPORTED for clear reporting - Add Cucumber test in 4.2.x.feature Co-Authored-By: Claude Sonnet 4.6 --- .../pds/tools/util/EncodingMimeMapping.java | 2 + .../nasa/pds/tools/validate/ProblemType.java | 1 + .../pds4/FileReferenceValidationRule.java | 10 ++- src/test/resources/features/4.2.x.feature | 3 + src/test/resources/github1635/audio_m4a.xml | 62 ++++++++++++++++++ src/test/resources/github1635/sample.m4a | Bin 0 -> 12 bytes 6 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 src/test/resources/github1635/audio_m4a.xml create mode 100644 src/test/resources/github1635/sample.m4a diff --git a/src/main/java/gov/nasa/pds/tools/util/EncodingMimeMapping.java b/src/main/java/gov/nasa/pds/tools/util/EncodingMimeMapping.java index 7af4f609e..f8f784046 100644 --- a/src/main/java/gov/nasa/pds/tools/util/EncodingMimeMapping.java +++ b/src/main/java/gov/nasa/pds/tools/util/EncodingMimeMapping.java @@ -9,6 +9,7 @@ public enum EncodingMimeMapping { GIF(Arrays.asList("gif")), J2C(Arrays.asList("j2c", "jp2", "mj2", "mjp2")), JPEG(Arrays.asList("jpg", "jpeg")), + M4A(Arrays.asList("m4a")), MP4(Arrays.asList("mp4")), NEF(Arrays.asList("nef")), PDF(Arrays.asList("pdf")), @@ -34,6 +35,7 @@ public static EncodingMimeMapping find (String encoding) throws IllegalArgumentE if (encoding.equalsIgnoreCase("JP2")) return J2C; if (encoding.equalsIgnoreCase("JPEG")) return JPEG; if (encoding.equalsIgnoreCase("MMM ODR Stream")) return DAT; + if (encoding.equalsIgnoreCase("M4A/AAC")) return M4A; if (encoding.equalsIgnoreCase("MP4/H.264")) return MP4; if (encoding.equalsIgnoreCase("MP4/H.264/AAC")) return MP4; if (encoding.equalsIgnoreCase("MSSS Camera Mini Header")) return DAT; diff --git a/src/main/java/gov/nasa/pds/tools/validate/ProblemType.java b/src/main/java/gov/nasa/pds/tools/validate/ProblemType.java index 4155f961d..0ce1c196e 100644 --- a/src/main/java/gov/nasa/pds/tools/validate/ProblemType.java +++ b/src/main/java/gov/nasa/pds/tools/validate/ProblemType.java @@ -252,6 +252,7 @@ public enum ProblemType { NON_MP4_FILE("warning.file.not_mp4_mimetype"), NON_WAV_FILE("warning.file.not_wav_mimetype"), + CONTENT_VALIDATION_UNSUPPORTED("warning.validation.content_validation_not_yet_supported"), NON_REGISTERED_PRODUCT("warning.product_not_registered"), diff --git a/src/main/java/gov/nasa/pds/tools/validate/rule/pds4/FileReferenceValidationRule.java b/src/main/java/gov/nasa/pds/tools/validate/rule/pds4/FileReferenceValidationRule.java index 1660e0e33..a9481a21b 100644 --- a/src/main/java/gov/nasa/pds/tools/validate/rule/pds4/FileReferenceValidationRule.java +++ b/src/main/java/gov/nasa/pds/tools/validate/rule/pds4/FileReferenceValidationRule.java @@ -493,7 +493,15 @@ private boolean validateFileAreaDefinitionAndContent(String fileName, TinyNodeIm } else if (doctype.equalsIgnoreCase("MP4/H.264")){ new AudioVideo(this.getListener(), target, urlRef).checkMetadata (false, true); } else if (doctype.equalsIgnoreCase("M4A/AAC")){ - new AudioVideo(this.getListener(), target, urlRef).checkMetadata (true, false); + // Content validation for M4A/AAC is not yet fully implemented. + // Consult PDS4 experts to determine how to validate these products. + this.getListener().addProblem(new ValidationProblem( + new ProblemDefinition(ExceptionType.WARNING, + ProblemType.CONTENT_VALIDATION_UNSUPPORTED, + "Content validation for encoding type 'M4A/AAC' is not yet supported by this version of validate. " + + "Please consult PDS4 experts for guidance on validating M4A/AAC audio products: " + + urlRef.toString()), + target)); } else if (doctype.equalsIgnoreCase("WAV")) { new AudioVideo(this.getListener(), target, urlRef).checkWavHeader(); } else if (!doctype.equalsIgnoreCase("UTF-8 Text") diff --git a/src/test/resources/features/4.2.x.feature b/src/test/resources/features/4.2.x.feature index a2303f1e8..a8206af31 100644 --- a/src/test/resources/features/4.2.x.feature +++ b/src/test/resources/features/4.2.x.feature @@ -12,4 +12,7 @@ Feature: 4.2.x | 1601 | 1 | "github1601" | "-R pds4.bundle --skip-context-validation -t {datasrc}/bundle_test_1601.xml" | "summary:totalErrors=1,summary:referentialIntegrity:failed=1,summary:messageTypes:error.integrity.member_not_found=1" | | 1601 | 2 | "github1601" | "-R pds4.bundle --skip-context-validation --skip-strict-collection-membership -t {datasrc}/bundle_test_1601.xml" | "summary:totalWarnings=1,summary:messageTypes:warning.integrity.member_not_found=1" | +# github1635: M4A/AAC should be a recognized encoding type; content validation not yet supported → WARNING not ERROR +| 1635 | 1 | "github1635" | "--skip-context-validation -t {datasrc}/audio_m4a.xml" | "summary:totalWarnings=1,summary:messageTypes:warning.validation.content_validation_not_yet_supported=1" | + #end diff --git a/src/test/resources/github1635/audio_m4a.xml b/src/test/resources/github1635/audio_m4a.xml new file mode 100644 index 000000000..c95fc6244 --- /dev/null +++ b/src/test/resources/github1635/audio_m4a.xml @@ -0,0 +1,62 @@ + + + + + + + urn:nasa:pds:audio_example:data:sample_m4a_audio + 1.0 + Sample M4A/AAC Audio File + 1.20.0.0 + Product_Observational + + + + + 2024-01-01Z + 2024-01-01Z + + + Test Mission + Mission + + urn:nasa:pds:context:investigation:mission.mars2020 + data_to_investigation + + + + + Test Instrument + Instrument + + urn:nasa:pds:context:instrument:mars2020.camera + is_instrument + + + + + Mars + Planet + + urn:nasa:pds:context:target:planet.mars + data_to_target + + + + + + + sample.m4a + 2024-01-01T00:00:00 + + + sample_audio + 0 + M4A/AAC + Sample M4A audio file + + + diff --git a/src/test/resources/github1635/sample.m4a b/src/test/resources/github1635/sample.m4a new file mode 100644 index 0000000000000000000000000000000000000000..16295020f4f3c957d64f81c4292ee6e0d27cf078 GIT binary patch literal 12 TcmZQzU{FXasVwj{aZ~^R4*&wj literal 0 HcmV?d00001