Skip to content

Commit 2ab7a3c

Browse files
committed
Merge #405 from '402-encodeMarcXmlTypeLiteralAsAttribute' of https://github.com/metafacture/metafacture-core
2 parents 8184d8d + 8fc904e commit 2ab7a3c

File tree

2 files changed

+64
-5
lines changed

2 files changed

+64
-5
lines changed

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

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,15 @@
3939
@Out(String.class)
4040
@FluxCommand("encode-marcxml")
4141
public final class MarcXmlEncoder extends DefaultStreamPipe<ObjectReceiver<String>> {
42+
4243
private static final String ROOT_OPEN = "<marc:collection xmlns:marc=\"http://www.loc.gov/MARC21/slim\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd\">";
4344
private static final String ROOT_CLOSE = "</marc:collection>";
4445

4546
private static final String RECORD_OPEN = "<marc:record>";
4647
private static final String RECORD_CLOSE = "</marc:record>";
4748

49+
private static final String ATTRIBUTE_TEMPLATE = " %s=\"%s\"";
50+
4851
private static final String CONTROLFIELD_OPEN_TEMPLATE = "<marc:controlfield tag=\"%s\">";
4952
private static final String CONTROLFIELD_CLOSE = "</marc:controlfield>";
5053

@@ -81,6 +84,7 @@ public final class MarcXmlEncoder extends DefaultStreamPipe<ObjectReceiver<Strin
8184

8285
private String currentEntity;
8386
private int indentationLevel;
87+
private int recordAttributeOffset;
8488
private boolean formatted;
8589

8690
public MarcXmlEncoder() {
@@ -134,6 +138,7 @@ public void startRecord(final String identifier) {
134138

135139
prettyPrintIndentation();
136140
writeRaw(RECORD_OPEN);
141+
recordAttributeOffset = builder.length() - 1;
137142
prettyPrintNewLine();
138143

139144
incrementIndentationLevel();
@@ -182,7 +187,12 @@ public void endEntity() {
182187
@Override
183188
public void literal(final String name, final String value) {
184189
if ("".equals(currentEntity)) {
185-
if (!writeLeader(name, value)) {
190+
if (name.equals(Marc21EventNames.MARCXML_TYPE_LITERAL)) {
191+
if (value != null) {
192+
builder.insert(recordAttributeOffset, String.format(ATTRIBUTE_TEMPLATE, name, value));
193+
}
194+
}
195+
else if (!writeLeader(name, value)) {
186196
prettyPrintIndentation();
187197
writeRaw(String.format(CONTROLFIELD_OPEN_TEMPLATE, name));
188198
if (value != null) {
@@ -199,7 +209,6 @@ else if (!writeLeader(currentEntity, value)) {
199209
writeRaw(SUBFIELD_CLOSE);
200210
prettyPrintNewLine();
201211
}
202-
203212
}
204213

205214
@Override
@@ -276,5 +285,7 @@ private void prettyPrintNewLine() {
276285
private void sendAndClearData() {
277286
getReceiver().process(builder.toString());
278287
builder.delete(0, builder.length());
288+
recordAttributeOffset = 0;
279289
}
290+
280291
}

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

Lines changed: 51 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,7 @@
3434
*/
3535

3636
public class MarcXmlEncoderTest {
37-
private static StringBuilder resultCollector;
38-
private static MarcXmlEncoder encoder;
37+
3938
private static final String XML_DECLARATION = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
4039
private static final String XML_1_DECLARATION = "<?xml version=\"1.1\" encoding=\"UTF-8\"?>";
4140
private static final String XML_16_DECLARATION = "<?xml version=\"1.0\" encoding=\"UTF-16\"?>";
@@ -48,6 +47,9 @@ public class MarcXmlEncoderTest {
4847
private static final String XML_MARC_COLLECTION_END_TAG = "</marc:collection>";
4948
private static final String RECORD_ID = "92005291";
5049

50+
private static StringBuilder resultCollector;
51+
private static MarcXmlEncoder encoder;
52+
5153
@Before
5254
public void setUp() {
5355
encoder = new MarcXmlEncoder();
@@ -219,14 +221,60 @@ public void sendAndClearDataWhenOnResetStream() {
219221

220222
@Test
221223
public void shouldIgnoreNullValueOfLiteral() {
224+
encoder.startRecord(RECORD_ID);
225+
encoder.literal("data", null);
226+
encoder.endRecord();
227+
encoder.closeStream();
228+
String expected = XML_DECLARATION + XML_ROOT_OPEN
229+
+ "<marc:record><marc:controlfield tag=\"data\"></marc:controlfield></marc:record>"
230+
+ XML_MARC_COLLECTION_END_TAG;
231+
String actual = resultCollector.toString();
232+
assertEquals(expected, actual);
233+
}
234+
235+
@Test
236+
public void shouldIgnoreNullValueOfTypeLiteral() {
222237
encoder.startRecord(RECORD_ID);
223238
encoder.literal("type", null);
224239
encoder.endRecord();
225240
encoder.closeStream();
226241
String expected = XML_DECLARATION + XML_ROOT_OPEN
227-
+ "<marc:record><marc:controlfield tag=\"type\"></marc:controlfield></marc:record>"
242+
+ "<marc:record></marc:record>"
243+
+ XML_MARC_COLLECTION_END_TAG;
244+
String actual = resultCollector.toString();
245+
assertEquals(expected, actual);
246+
}
247+
248+
@Test
249+
public void issue402_shouldEncodeTypeLiteralAsAttribute() {
250+
encoder.startRecord(RECORD_ID);
251+
encoder.literal("type", "value");
252+
encoder.endRecord();
253+
encoder.closeStream();
254+
String expected = XML_DECLARATION + XML_ROOT_OPEN
255+
+ "<marc:record type=\"value\"></marc:record>"
228256
+ XML_MARC_COLLECTION_END_TAG;
229257
String actual = resultCollector.toString();
230258
assertEquals(expected, actual);
231259
}
260+
261+
@Test
262+
public void shouldNotEncodeNestedTypeLiteralAsAttribute() {
263+
encoder.startRecord(RECORD_ID);
264+
encoder.startEntity("tag12");
265+
encoder.literal("type", "value");
266+
encoder.endEntity();
267+
encoder.endRecord();
268+
encoder.closeStream();
269+
String expected = XML_DECLARATION + XML_ROOT_OPEN
270+
+ "<marc:record>"
271+
+ "<marc:datafield tag=\"tag\" ind1=\"1\" ind2=\"2\">"
272+
+ "<marc:subfield code=\"type\">value</marc:subfield>"
273+
+ "</marc:datafield>"
274+
+ "</marc:record>"
275+
+ XML_MARC_COLLECTION_END_TAG;
276+
String actual = resultCollector.toString();
277+
assertEquals(expected, actual);
278+
}
279+
232280
}

0 commit comments

Comments
 (0)