Skip to content

Commit bd719d2

Browse files
committed
Merge #526 from branch '454-allowMarc21EncoderToGetLeaderAsOneString' of github.com:metafacture/metafacture-core
2 parents e40c106 + eb38a1b commit bd719d2

File tree

3 files changed

+72
-13
lines changed

3 files changed

+72
-13
lines changed

metafacture-biblio/src/main/java/org/metafacture/biblio/iso2709/Iso2709Constants.java

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,13 @@
2323
* @author Christoph Böhme
2424
*
2525
*/
26-
final class Iso2709Constants {
26+
public final class Iso2709Constants {
2727

28-
static final int RECORD_LABEL_LENGTH = 24;
28+
public static final int IMPL_CODES_START = 6;
29+
public static final int IMPL_CODES_LENGTH = 4;
30+
public static final int RECORD_LABEL_LENGTH = 24;
31+
public static final int RECORD_STATUS_POS = 5;
32+
public static final int SYSTEM_CHARS_START = 17;
2933

3034
static final int MIN_RECORD_LENGTH = RECORD_LABEL_LENGTH + 2;
3135
static final int MAX_RECORD_LENGTH = 99_999;
@@ -38,18 +42,11 @@ final class Iso2709Constants {
3842
static final int RECORD_LENGTH_START = 0;
3943
static final int RECORD_LENGTH_LENGTH = 5;
4044

41-
static final int RECORD_STATUS_POS = 5;
42-
43-
static final int IMPL_CODES_START = 6;
44-
static final int IMPL_CODES_LENGTH = 4;
45-
4645
static final int INDICATOR_LENGTH_POS = 10;
4746
static final int IDENTIFIER_LENGTH_POS = 11;
4847

4948
static final int BASE_ADDRESS_START = 12;
5049
static final int BASE_ADDRESS_LENGTH = 5;
51-
52-
static final int SYSTEM_CHARS_START = 17;
5350
static final int SYSTEM_CHARS_LENGTH = 3;
5451

5552
static final int FIELD_LENGTH_LENGTH_POS = 20;

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

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.metafacture.biblio.marc21;
1818

19+
import org.metafacture.biblio.iso2709.Iso2709Constants;
1920
import org.metafacture.biblio.iso2709.RecordBuilder;
2021
import org.metafacture.biblio.iso2709.RecordFormat;
2122
import org.metafacture.framework.FluxCommand;
@@ -180,7 +181,12 @@ public void literal(final String name, final String value) {
180181
builder.appendSubfield(name.toCharArray(), value);
181182
break;
182183
case IN_LEADER_ENTITY:
183-
processLiteralInLeader(name, value);
184+
if (name == Marc21EventNames.LEADER_ENTITY) {
185+
processLeaderAsOneLiteral(value);
186+
}
187+
else {
188+
processLeaderAsSubfields(name, value);
189+
}
184190
break;
185191
case IN_RECORD:
186192
processTopLevelLiteral(name, value);
@@ -190,12 +196,30 @@ public void literal(final String name, final String value) {
190196
}
191197
}
192198

193-
private void processLiteralInLeader(final String name, final String value) {
199+
private void processLeaderAsOneLiteral(final String value) {
200+
if (value.length() != Iso2709Constants.RECORD_LABEL_LENGTH) {
201+
throw new FormatException(
202+
"leader literal must contain " + Iso2709Constants.RECORD_LABEL_LENGTH + " characters: " + value);
203+
}
204+
processLeaderAsSubfields(Marc21EventNames.RECORD_STATUS_LITERAL, value.charAt(Iso2709Constants.RECORD_STATUS_POS));
205+
processLeaderAsSubfields(Marc21EventNames.RECORD_TYPE_LITERAL, value.charAt(Iso2709Constants.IMPL_CODES_START));
206+
processLeaderAsSubfields(Marc21EventNames.BIBLIOGRAPHIC_LEVEL_LITERAL, value.charAt(Iso2709Constants.IMPL_CODES_START + 1));
207+
processLeaderAsSubfields(Marc21EventNames.TYPE_OF_CONTROL_LITERAL, value.charAt(Iso2709Constants.IMPL_CODES_START + 2));
208+
processLeaderAsSubfields(Marc21EventNames.CHARACTER_CODING_LITERAL, value.charAt(Iso2709Constants.RECORD_STATUS_POS + Iso2709Constants.IMPL_CODES_LENGTH));
209+
processLeaderAsSubfields(Marc21EventNames.ENCODING_LEVEL_LITERAL, value.charAt(Iso2709Constants.SYSTEM_CHARS_START));
210+
processLeaderAsSubfields(Marc21EventNames.CATALOGING_FORM_LITERAL, value.charAt(Iso2709Constants.SYSTEM_CHARS_START + 1));
211+
processLeaderAsSubfields(Marc21EventNames.MULTIPART_LEVEL_LITERAL, value.charAt(Iso2709Constants.SYSTEM_CHARS_START + 2));
212+
}
213+
214+
private void processLeaderAsSubfields(final String name, final String value) {
194215
if (value.length() != 1) {
195216
throw new FormatException(
196217
"literal must only contain a single character:" + name);
197218
}
198-
final char code = value.charAt(0);
219+
processLeaderAsSubfields(name, value.charAt(0));
220+
}
221+
222+
private void processLeaderAsSubfields(final String name, final char code) {
199223
switch (name) {
200224
case Marc21EventNames.RECORD_STATUS_LITERAL:
201225
requireValidCode(code, Marc21Constants.RECORD_STATUS_CODES);
@@ -251,7 +275,12 @@ private void processTopLevelLiteral(final String name, final String value) {
251275
// these literals here.
252276
return;
253277
}
254-
builder.appendReferenceField(name.toCharArray(), value);
278+
if (Marc21EventNames.LEADER_ENTITY.equals(name)) {
279+
processLeaderAsOneLiteral(value);
280+
}
281+
else {
282+
builder.appendReferenceField(name.toCharArray(), value);
283+
}
255284
}
256285

257286
@Override

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

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,4 +114,37 @@ public void issue278ShouldNotFailWhenProcessingLeaderEntity() {
114114
verify(receiver).process(any(String.class));
115115
}
116116

117+
@Test
118+
public void issue454ShouldNotFailWhenProcessingEntityLeaderAsOneString() {
119+
marc21Encoder.startRecord("");
120+
marc21Encoder.startEntity(LEADER_ENTITY);
121+
marc21Encoder.literal(LEADER_ENTITY, "02602pam a2200529 c 4500");
122+
marc21Encoder.endEntity();
123+
marc21Encoder.endRecord();
124+
125+
verify(receiver).process(matches("00026pam a2200025 c 4500\u001e\u001d"));
126+
}
127+
128+
@Test
129+
public void issue454ShouldNotFailWhenProcessingLeaderAsOneString() {
130+
marc21Encoder.startRecord("");
131+
marc21Encoder.literal(LEADER_ENTITY, "02602pam a2200529 c 4500");
132+
marc21Encoder.endRecord();
133+
134+
verify(receiver).process(matches("00026pam a2200025 c 4500\u001e\u001d"));
135+
}
136+
137+
@Test
138+
public void issue524ShouldComputeValidLeader() {
139+
marc21Encoder.startRecord("");
140+
marc21Encoder.literal(LEADER_ENTITY, "00000pam a7777777 c 4444");
141+
marc21Encoder.startEntity("021a ");
142+
marc21Encoder.literal("v", "Fritz");
143+
marc21Encoder.literal("n", "Bauer");
144+
marc21Encoder.endEntity();
145+
marc21Encoder.endRecord();
146+
147+
verify(receiver).process(matches("00055pam a2200037 c 4500021001700000\u001e.*\u001d"));
148+
}
149+
117150
}

0 commit comments

Comments
 (0)