Skip to content

Commit f9d0213

Browse files
committed
Merge #539 from branch '527-emitMarcXmlLeaderAsWhole' of github.com:metafacture/metafacture-core
2 parents 0e8a00c + 5776707 commit f9d0213

File tree

2 files changed

+68
-21
lines changed

2 files changed

+68
-21
lines changed

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

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ public String close(final Object[] args) {
105105
private static final int TAG_END = 3;
106106

107107
private final StringBuilder builder = new StringBuilder();
108+
private final StringBuilder leaderBuilder = new StringBuilder();
108109

109110
private boolean atStreamStart = true;
110111

@@ -206,6 +207,7 @@ public void startRecord(final String identifier) {
206207

207208
@Override
208209
public void endRecord() {
210+
writeLeader();
209211
decrementIndentationLevel();
210212
prettyPrintIndentation();
211213
writeTag(Tag.record::close);
@@ -252,7 +254,7 @@ public void literal(final String name, final String value) {
252254
builder.insert(recordAttributeOffset, String.format(ATTRIBUTE_TEMPLATE, name, value));
253255
}
254256
}
255-
else if (!writeLeader(name, value)) {
257+
else if (!appendLeader(name, value)) {
256258
prettyPrintIndentation();
257259
writeTag(Tag.controlfield::open, name);
258260
if (value != null) {
@@ -262,7 +264,7 @@ else if (!writeLeader(name, value)) {
262264
prettyPrintNewLine();
263265
}
264266
}
265-
else if (!writeLeader(currentEntity, value)) {
267+
else if (!appendLeader(currentEntity, value)) {
266268
prettyPrintIndentation();
267269
writeTag(Tag.subfield::open, name);
268270
writeEscaped(value.trim());
@@ -316,6 +318,16 @@ private void writeRaw(final String str) {
316318
builder.append(str);
317319
}
318320

321+
private boolean appendLeader(final String name, final String value) {
322+
if (name.equals(Marc21EventNames.LEADER_ENTITY)) {
323+
leaderBuilder.append(value);
324+
return true;
325+
}
326+
else {
327+
return false;
328+
}
329+
}
330+
319331
/**
320332
* Writes an escaped sequence.
321333
*
@@ -325,18 +337,14 @@ private void writeEscaped(final String str) {
325337
builder.append(XmlUtil.escape(str, false));
326338
}
327339

328-
private boolean writeLeader(final String name, final String value) {
329-
if (name.equals(Marc21EventNames.LEADER_ENTITY)) {
340+
private void writeLeader() {
341+
final String leader = leaderBuilder.toString();
342+
if (!leader.isEmpty()) {
330343
prettyPrintIndentation();
331344
writeTag(Tag.leader::open);
332-
writeRaw(value);
345+
writeRaw(leader);
333346
writeTag(Tag.leader::close);
334347
prettyPrintNewLine();
335-
336-
return true;
337-
}
338-
else {
339-
return false;
340348
}
341349
}
342350

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

Lines changed: 50 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@
1616

1717
package org.metafacture.biblio.marc21;
1818

19-
import static org.junit.Assert.assertEquals;
20-
import static org.junit.Assert.assertTrue;
19+
import org.metafacture.framework.MetafactureException;
20+
import org.metafacture.framework.helpers.DefaultObjectReceiver;
2121

22-
import org.junit.After;
2322
import org.junit.Before;
2423
import org.junit.Test;
25-
import org.metafacture.framework.MetafactureException;
26-
import org.metafacture.framework.helpers.DefaultObjectReceiver;
24+
25+
import static org.junit.Assert.assertEquals;
26+
import static org.junit.Assert.assertTrue;
2727

2828
/**
2929
* Tests for class {@link MarcXmlEncoder}.
@@ -63,11 +63,7 @@ public void process(final String obj) {
6363
resultCollector = new StringBuilder();
6464
}
6565

66-
@After
67-
public void tearDown() {
68-
}
69-
70-
private void addOneRecord(MarcXmlEncoder encoder) {
66+
private void addOneRecord(final MarcXmlEncoder encoder) {
7167
encoder.startRecord(RECORD_ID);
7268
encoder.literal("001", RECORD_ID);
7369
encoder.startEntity("010 ");
@@ -201,7 +197,7 @@ public void createAnRecordWithLeader() {
201197
}
202198

203199
@Test
204-
public void issue336_createRecordWithTopLevelLeader() {
200+
public void issue336_createRecordWithTopLevelLeader_dummy() {
205201
encoder.startRecord("1");
206202
encoder.literal(Marc21EventNames.LEADER_ENTITY, "dummy");
207203
encoder.endRecord();
@@ -212,6 +208,49 @@ public void issue336_createRecordWithTopLevelLeader() {
212208
assertEquals(expected, actual);
213209
}
214210

211+
@Test
212+
public void issue336_createRecordWithTopLevelLeader_defaultMarc21Xml() {
213+
issue336_createRecordWithTopLevelLeader(encoder, "00000naa a2200000uc 4500");
214+
}
215+
216+
private void issue336_createRecordWithTopLevelLeader(final MarcXmlEncoder encoder, final String expectedLeader) {
217+
encoder.startRecord("1");
218+
encoder.literal("001", "8u3287432");
219+
encoder.literal(Marc21EventNames.LEADER_ENTITY, "00000naa a2200000uc 4500");
220+
encoder.endRecord();
221+
encoder.closeStream();
222+
String expected = XML_DECLARATION + XML_ROOT_OPEN
223+
+ "<marc:record><marc:controlfield tag=\"001\">8u3287432</marc:controlfield>" +
224+
"<marc:leader>" + expectedLeader + "</marc:leader></marc:record>" + XML_MARC_COLLECTION_END_TAG;
225+
String actual = resultCollector.toString();
226+
assertEquals(expected, actual);
227+
}
228+
229+
@Test
230+
public void issue527_shouldEmitLeaderAlwaysAsWholeString() {
231+
issue527_shouldEmitLeaderAlwaysAsWholeString(encoder);
232+
}
233+
234+
private void issue527_shouldEmitLeaderAlwaysAsWholeString(final MarcXmlEncoder encoder) {
235+
encoder.startRecord("1");
236+
encoder.startEntity(Marc21EventNames.LEADER_ENTITY);
237+
encoder.literal(Marc21EventNames.RECORD_STATUS_LITERAL, "a");
238+
encoder.literal(Marc21EventNames.RECORD_TYPE_LITERAL, "o");
239+
encoder.literal(Marc21EventNames.BIBLIOGRAPHIC_LEVEL_LITERAL, "a");
240+
encoder.literal(Marc21EventNames.TYPE_OF_CONTROL_LITERAL, " ");
241+
encoder.literal(Marc21EventNames.CHARACTER_CODING_LITERAL, "a");
242+
encoder.literal(Marc21EventNames.ENCODING_LEVEL_LITERAL, "z");
243+
encoder.literal(Marc21EventNames.CATALOGING_FORM_LITERAL, "u");
244+
encoder.literal(Marc21EventNames.MULTIPART_LEVEL_LITERAL, " ");
245+
encoder.endEntity();
246+
encoder.endRecord();
247+
encoder.closeStream();
248+
String expected = XML_DECLARATION + XML_ROOT_OPEN
249+
+ "<marc:record><marc:leader>aoa azu </marc:leader></marc:record>" + XML_MARC_COLLECTION_END_TAG;
250+
String actual = resultCollector.toString();
251+
assertEquals(expected, actual);
252+
}
253+
215254
@Test
216255
public void sendDataAndClearWhenRecordStartedAndStreamResets() {
217256
encoder.startRecord("1");

0 commit comments

Comments
 (0)