Skip to content

Commit

Permalink
Add option 'validateLeader' (#567)
Browse files Browse the repository at this point in the history
  • Loading branch information
dr0i committed Nov 19, 2024
1 parent 4ab1f8e commit 06a62ff
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -108,6 +109,18 @@ public void setGenerateIdField(final boolean generateIdField) {
this.generateIdField = generateIdField;
}

/**
* Controls whether the leader should be validated.
* <p>
* The default value of {@code validateLeader} is true.
* <p>
*
* @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.
*
Expand Down Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@
*/
public final class Marc21EncoderTest {

private static final String BAD_LEADER = "00600ny a22002053n 4500";

private Marc21Encoder marc21Encoder;

@Mock
Expand Down Expand Up @@ -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"));
}

}

0 comments on commit 06a62ff

Please sign in to comment.