Skip to content

Commit 06a62ff

Browse files
committed
Add option 'validateLeader' (#567)
1 parent 4ab1f8e commit 06a62ff

File tree

2 files changed

+38
-4
lines changed

2 files changed

+38
-4
lines changed

metafacture-biblio/src/main/java/org/metafacture/biblio/marc21/Marc21Encoder.java

+19-4
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ public final class Marc21Encoder extends
8181
private State state = State.IN_STREAM;
8282

8383
private boolean generateIdField;
84+
private boolean validateLeader = true;
8485

8586
/**
8687
* Initializes the encoder with MARC 21 constants and charset.
@@ -108,6 +109,18 @@ public void setGenerateIdField(final boolean generateIdField) {
108109
this.generateIdField = generateIdField;
109110
}
110111

112+
/**
113+
* Controls whether the leader should be validated.
114+
* <p>
115+
* The default value of {@code validateLeader} is true.
116+
* <p>
117+
*
118+
* @param validateLeader if false the leader is not validated
119+
*/
120+
public void setValidateLeader(final boolean validateLeader) {
121+
this.validateLeader = validateLeader;
122+
}
123+
111124
/**
112125
* Gets the flag to decide whether the ID field is generated.
113126
*
@@ -259,12 +272,14 @@ private void processLeaderAsSubfields(final String name, final char code) {
259272
}
260273

261274
private void requireValidCode(final char code, final char[] validCodes) {
262-
for (final char validCode: validCodes) {
263-
if (validCode == code) {
264-
return;
275+
if (validateLeader) {
276+
for (final char validCode : validCodes) {
277+
if (validCode == code) {
278+
return;
279+
}
265280
}
281+
throw new FormatException("invalid code '" + code + "'; allowed codes are: " + Arrays.toString(validCodes));
266282
}
267-
throw new FormatException("invalid code '" + code + "'; allowed codes are: " + Arrays.toString(validCodes));
268283
}
269284

270285
private void processTopLevelLiteral(final String name, final String value) {

metafacture-biblio/src/test/java/org/metafacture/biblio/marc21/Marc21EncoderTest.java

+19
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@
3838
*/
3939
public final class Marc21EncoderTest {
4040

41+
private static final String BAD_LEADER = "00600ny a22002053n 4500";
42+
4143
private Marc21Encoder marc21Encoder;
4244

4345
@Mock
@@ -147,4 +149,21 @@ public void issue524ShouldComputeValidLeader() {
147149
verify(receiver).process(matches("00055pam a2200037 c 4500021001700000\u001e.*\u001d"));
148150
}
149151

152+
@Test(expected = FormatException.class)
153+
public void issue567ShouldFailValidateLeaderAsDefault() {
154+
marc21Encoder.startRecord("");
155+
marc21Encoder.literal(LEADER_ENTITY, BAD_LEADER);
156+
marc21Encoder.endRecord();
157+
}
158+
159+
@Test
160+
public void issue567ShouldNotValidateLeader() {
161+
marc21Encoder.setValidateLeader(false);
162+
marc21Encoder.startRecord("");
163+
marc21Encoder.literal(LEADER_ENTITY, BAD_LEADER );
164+
marc21Encoder.endRecord();
165+
166+
verify(receiver).process(matches("00026ny a22000253n 4500\u001e\u001d"));
167+
}
168+
150169
}

0 commit comments

Comments
 (0)