From 06a62ffb61c202220f627b49ded1de01fc419f43 Mon Sep 17 00:00:00 2001 From: Pascal Christoph Date: Mon, 18 Nov 2024 13:52:39 +0100 Subject: [PATCH 1/3] Add option 'validateLeader' (#567) --- .../biblio/marc21/Marc21Encoder.java | 23 +++++++++++++++---- .../biblio/marc21/Marc21EncoderTest.java | 19 +++++++++++++++ 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/metafacture-biblio/src/main/java/org/metafacture/biblio/marc21/Marc21Encoder.java b/metafacture-biblio/src/main/java/org/metafacture/biblio/marc21/Marc21Encoder.java index 3cd536fe7..fb8ad50b2 100644 --- a/metafacture-biblio/src/main/java/org/metafacture/biblio/marc21/Marc21Encoder.java +++ b/metafacture-biblio/src/main/java/org/metafacture/biblio/marc21/Marc21Encoder.java @@ -81,6 +81,7 @@ public final class Marc21Encoder extends private State state = State.IN_STREAM; private boolean generateIdField; + private boolean validateLeader = true; /** * Initializes the encoder with MARC 21 constants and charset. @@ -108,6 +109,18 @@ public void setGenerateIdField(final boolean generateIdField) { this.generateIdField = generateIdField; } + /** + * Controls whether the leader should be validated. + *

+ * The default value of {@code validateLeader} is true. + *

+ * + * @param validateLeader if false the leader is not validated + */ + public void setValidateLeader(final boolean validateLeader) { + this.validateLeader = validateLeader; + } + /** * Gets the flag to decide whether the ID field is generated. * @@ -259,12 +272,14 @@ private void processLeaderAsSubfields(final String name, final char code) { } private void requireValidCode(final char code, final char[] validCodes) { - for (final char validCode: validCodes) { - if (validCode == code) { - return; + if (validateLeader) { + for (final char validCode : validCodes) { + if (validCode == code) { + return; + } } + throw new FormatException("invalid code '" + code + "'; allowed codes are: " + Arrays.toString(validCodes)); } - throw new FormatException("invalid code '" + code + "'; allowed codes are: " + Arrays.toString(validCodes)); } private void processTopLevelLiteral(final String name, final String value) { diff --git a/metafacture-biblio/src/test/java/org/metafacture/biblio/marc21/Marc21EncoderTest.java b/metafacture-biblio/src/test/java/org/metafacture/biblio/marc21/Marc21EncoderTest.java index e8e70325d..f81d864c2 100644 --- a/metafacture-biblio/src/test/java/org/metafacture/biblio/marc21/Marc21EncoderTest.java +++ b/metafacture-biblio/src/test/java/org/metafacture/biblio/marc21/Marc21EncoderTest.java @@ -38,6 +38,8 @@ */ public final class Marc21EncoderTest { + private static final String BAD_LEADER = "00600ny a22002053n 4500"; + private Marc21Encoder marc21Encoder; @Mock @@ -147,4 +149,21 @@ public void issue524ShouldComputeValidLeader() { verify(receiver).process(matches("00055pam a2200037 c 4500021001700000\u001e.*\u001d")); } + @Test(expected = FormatException.class) + public void issue567ShouldFailValidateLeaderAsDefault() { + marc21Encoder.startRecord(""); + marc21Encoder.literal(LEADER_ENTITY, BAD_LEADER); + marc21Encoder.endRecord(); + } + + @Test + public void issue567ShouldNotValidateLeader() { + marc21Encoder.setValidateLeader(false); + marc21Encoder.startRecord(""); + marc21Encoder.literal(LEADER_ENTITY, BAD_LEADER ); + marc21Encoder.endRecord(); + + verify(receiver).process(matches("00026ny a22000253n 4500\u001e\u001d")); + } + } From eab57cd43bcfbd670a0741210332cf4ed0a71adf Mon Sep 17 00:00:00 2001 From: TobiasNx <61879957+TobiasNx@users.noreply.github.com> Date: Tue, 19 Nov 2024 09:26:49 +0100 Subject: [PATCH 2/3] Update Marc21Encoder.java Add leader hint to error message --- .../java/org/metafacture/biblio/marc21/Marc21Encoder.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/metafacture-biblio/src/main/java/org/metafacture/biblio/marc21/Marc21Encoder.java b/metafacture-biblio/src/main/java/org/metafacture/biblio/marc21/Marc21Encoder.java index fb8ad50b2..c1f027d3b 100644 --- a/metafacture-biblio/src/main/java/org/metafacture/biblio/marc21/Marc21Encoder.java +++ b/metafacture-biblio/src/main/java/org/metafacture/biblio/marc21/Marc21Encoder.java @@ -170,7 +170,7 @@ public void startEntity(final String name) { private void startField(final String name) { if (name.length() != NAME_LENGTH) { - throw new FormatException("invalid entity name: " + name); + throw new FormatException("invalid leader entity name: " + name); } final char[] tag = new char[RecordFormat.TAG_LENGTH]; final char[] indicators = new char[Marc21Constants.MARC21_FORMAT.getIndicatorLength()]; @@ -227,7 +227,7 @@ private void processLeaderAsOneLiteral(final String value) { private void processLeaderAsSubfields(final String name, final String value) { if (value.length() != 1) { throw new FormatException( - "literal must only contain a single character:" + name); + "leader literal must only contain a single character:" + name); } processLeaderAsSubfields(name, value.charAt(0)); } @@ -278,7 +278,7 @@ private void requireValidCode(final char code, final char[] validCodes) { return; } } - throw new FormatException("invalid code '" + code + "'; allowed codes are: " + Arrays.toString(validCodes)); + throw new FormatException("invalid code in leader'" + code + "'; allowed codes are: " + Arrays.toString(validCodes)); } } From b7d9e81b432d979c6c46631632cc8160466535d4 Mon Sep 17 00:00:00 2001 From: TobiasNx <61879957+TobiasNx@users.noreply.github.com> Date: Tue, 19 Nov 2024 12:32:34 +0100 Subject: [PATCH 3/3] Update metafacture-biblio/src/main/java/org/metafacture/biblio/marc21/Marc21Encoder.java --- .../main/java/org/metafacture/biblio/marc21/Marc21Encoder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/metafacture-biblio/src/main/java/org/metafacture/biblio/marc21/Marc21Encoder.java b/metafacture-biblio/src/main/java/org/metafacture/biblio/marc21/Marc21Encoder.java index c1f027d3b..84e4f50f6 100644 --- a/metafacture-biblio/src/main/java/org/metafacture/biblio/marc21/Marc21Encoder.java +++ b/metafacture-biblio/src/main/java/org/metafacture/biblio/marc21/Marc21Encoder.java @@ -170,7 +170,7 @@ public void startEntity(final String name) { private void startField(final String name) { if (name.length() != NAME_LENGTH) { - throw new FormatException("invalid leader entity name: " + name); + throw new FormatException("invalid entity name: " + name); } final char[] tag = new char[RecordFormat.TAG_LENGTH]; final char[] indicators = new char[Marc21Constants.MARC21_FORMAT.getIndicatorLength()];