Skip to content

Commit d2b0bdc

Browse files
committed
Make MARC21 XML handler attribute marker configurable.
Related to: #336, #379
1 parent 70fefd5 commit d2b0bdc

File tree

3 files changed

+57
-4
lines changed

3 files changed

+57
-4
lines changed

metafacture-biblio/build.gradle

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,10 @@ dependencies {
3131
testImplementation 'junit:junit:4.12'
3232
testImplementation 'org.mockito:mockito-core:2.5.5'
3333
}
34+
35+
test {
36+
testLogging {
37+
showStandardStreams = true
38+
exceptionFormat = 'full'
39+
}
40+
}

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

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,17 @@
3838
@FluxCommand("handle-marcxml")
3939
public final class MarcXmlHandler extends DefaultXmlPipe<StreamReceiver> {
4040

41+
public static final String DEFAULT_ATTRIBUTE_MARKER = "";
42+
4143
private static final String SUBFIELD = "subfield";
4244
private static final String DATAFIELD = "datafield";
4345
private static final String CONTROLFIELD = "controlfield";
4446
private static final String RECORD = "record";
4547
private static final String NAMESPACE = "http://www.loc.gov/MARC21/slim";
4648
private static final String LEADER = "leader";
4749
private static final String TYPE = "type";
50+
51+
private String attributeMarker = DEFAULT_ATTRIBUTE_MARKER;
4852
private String currentTag = "";
4953
private String namespace = NAMESPACE;
5054
private StringBuilder builder = new StringBuilder();
@@ -60,6 +64,14 @@ private boolean checkNamespace(final String uri) {
6064
return namespace == null || namespace.equals(uri);
6165
}
6266

67+
public void setAttributeMarker(final String attributeMarker) {
68+
this.attributeMarker = attributeMarker;
69+
}
70+
71+
public String getAttributeMarker() {
72+
return attributeMarker;
73+
}
74+
6375
@Override
6476
public void startElement(final String uri, final String localName, final String qName, final Attributes attributes) throws SAXException {
6577
if (SUBFIELD.equals(localName)) {
@@ -75,7 +87,7 @@ else if (CONTROLFIELD.equals(localName)) {
7587
}
7688
else if (RECORD.equals(localName) && checkNamespace(uri)) {
7789
getReceiver().startRecord("");
78-
getReceiver().literal(TYPE, attributes.getValue(TYPE));
90+
getReceiver().literal(attributeMarker + TYPE, attributes.getValue(TYPE));
7991
}
8092
else if (LEADER.equals(localName)) {
8193
builder = new StringBuilder();
@@ -87,18 +99,15 @@ else if (LEADER.equals(localName)) {
8799
public void endElement(final String uri, final String localName, final String qName) throws SAXException {
88100
if (SUBFIELD.equals(localName)) {
89101
getReceiver().literal(currentTag, builder.toString().trim());
90-
91102
}
92103
else if (DATAFIELD.equals(localName)) {
93104
getReceiver().endEntity();
94105
}
95106
else if (CONTROLFIELD.equals(localName)) {
96107
getReceiver().literal(currentTag, builder.toString().trim());
97-
98108
}
99109
else if (RECORD.equals(localName) && checkNamespace(uri)) {
100110
getReceiver().endRecord();
101-
102111
}
103112
else if (LEADER.equals(localName)) {
104113
getReceiver().literal(currentTag, builder.toString());

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

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@
2323
import org.junit.Before;
2424
import org.junit.Test;
2525
import org.metafacture.framework.StreamReceiver;
26+
import org.mockito.InOrder;
2627
import org.mockito.Mock;
28+
import org.mockito.Mockito;
2729
import org.mockito.MockitoAnnotations;
2830
import org.xml.sax.SAXException;
2931
import org.xml.sax.helpers.AttributesImpl;
@@ -130,4 +132,39 @@ public void issue330ShouldOptionallyRecognizeRecordsWithoutNamespace()
130132
verifyNoMoreInteractions(receiver);
131133
}
132134

135+
@Test
136+
public void shouldNotEncodeTypeAttributeAsMarkedLiteral() throws SAXException {
137+
final AttributesImpl attributes = new AttributesImpl();
138+
attributes.addAttribute(NAMESPACE, "type", "type", "CDATA", "bibliographic");
139+
140+
marcXmlHandler.startElement(NAMESPACE, RECORD, "", attributes);
141+
marcXmlHandler.endElement(NAMESPACE, RECORD, "");
142+
143+
final InOrder ordered = Mockito.inOrder(receiver);
144+
ordered.verify(receiver).startRecord("");
145+
ordered.verify(receiver).literal(TYPE, "bibliographic");
146+
ordered.verify(receiver).endRecord();
147+
ordered.verifyNoMoreInteractions();
148+
verifyNoMoreInteractions(receiver);
149+
}
150+
151+
@Test
152+
public void issue336_shouldEncodeTypeAttributeAsLiteralWithConfiguredMarker() throws SAXException {
153+
final String marker = "~";
154+
marcXmlHandler.setAttributeMarker(marker);
155+
156+
final AttributesImpl attributes = new AttributesImpl();
157+
attributes.addAttribute(NAMESPACE, "type", "type", "CDATA", "bibliographic");
158+
159+
marcXmlHandler.startElement(NAMESPACE, RECORD, "", attributes);
160+
marcXmlHandler.endElement(NAMESPACE, RECORD, "");
161+
162+
final InOrder ordered = Mockito.inOrder(receiver);
163+
ordered.verify(receiver).startRecord("");
164+
ordered.verify(receiver).literal(marker + TYPE, "bibliographic");
165+
ordered.verify(receiver).endRecord();
166+
ordered.verifyNoMoreInteractions();
167+
verifyNoMoreInteractions(receiver);
168+
}
169+
133170
}

0 commit comments

Comments
 (0)