Skip to content

Commit 70fefd5

Browse files
committed
Make generic XML handler attribute marker configurable.
Fixes #379.
1 parent 7576665 commit 70fefd5

File tree

2 files changed

+55
-2
lines changed

2 files changed

+55
-2
lines changed

metafacture-xml/src/main/java/org/metafacture/xml/GenericXmlHandler.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,15 @@
4040
@FluxCommand("handle-generic-xml")
4141
public final class GenericXmlHandler extends DefaultXmlPipe<StreamReceiver> {
4242

43+
public static final String DEFAULT_ATTRIBUTE_MARKER = "";
44+
4345
public static final String DEFAULT_RECORD_TAG = "record";
4446

4547
public static final boolean EMIT_NAMESPACE = false;
4648

4749
private static final Pattern TABS = Pattern.compile("\t+");
4850

51+
private String attributeMarker = DEFAULT_ATTRIBUTE_MARKER;
4952
private String recordTagName = DEFAULT_RECORD_TAG;
5053

5154
private boolean inRecord;
@@ -110,6 +113,14 @@ public boolean getEmitNamespace() {
110113
return this.emitNamespace;
111114
}
112115

116+
public void setAttributeMarker(final String attributeMarker) {
117+
this.attributeMarker = attributeMarker;
118+
}
119+
120+
public String getAttributeMarker() {
121+
return attributeMarker;
122+
}
123+
113124
@Override
114125
public void startElement(final String uri, final String localName, final String qName, final Attributes attributes) {
115126
if (inRecord) {
@@ -170,7 +181,7 @@ private void writeAttributes(final Attributes attributes) {
170181
for (int i = 0; i < length; ++i) {
171182
final String name = emitNamespace ? attributes.getQName(i) : attributes.getLocalName(i);
172183
final String value = attributes.getValue(i);
173-
getReceiver().literal(name, value);
184+
getReceiver().literal(attributeMarker + name, value);
174185
}
175186
}
176187

metafacture-xml/src/test/java/org/metafacture/xml/GenericXMLHandlerTest.java

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.metafacture.framework.StreamReceiver;
2626
import org.mockito.InOrder;
2727
import org.mockito.Mock;
28+
import org.mockito.Mockito;
2829
import org.mockito.MockitoAnnotations;
2930
import org.xml.sax.helpers.AttributesImpl;
3031

@@ -141,6 +142,47 @@ public void shouldEmitNamespaceOnEntityElementAndAttribute() {
141142

142143
final InOrder ordered = inOrder(receiver);
143144
ordered.verify(receiver).startEntity("ns:entity");
144-
ordered.verify(receiver).literal("ns:attr","attr-value");
145+
ordered.verify(receiver).literal("ns:attr", "attr-value");
145146
}
147+
148+
@Test
149+
public void shouldNotEncodeAttributesAsMarkedLiterals() {
150+
attributes.addAttribute("", "attr", "attr", "CDATA", "attr-value");
151+
genericXmlHandler.startElement("", "record", "record", attributes);
152+
genericXmlHandler.endElement("", "record", "record");
153+
154+
final InOrder ordered = inOrder(receiver);
155+
ordered.verify(receiver).startRecord("");
156+
ordered.verify(receiver).literal("attr", "attr-value");
157+
ordered.verify(receiver).endRecord();
158+
ordered.verifyNoMoreInteractions();
159+
Mockito.verifyNoMoreInteractions(receiver);
160+
}
161+
162+
@Test
163+
public void issue379_shouldEncodeAttributesAsLiteralsWithConfiguredMarker() {
164+
final String marker = "~";
165+
genericXmlHandler.setAttributeMarker(marker);
166+
167+
genericXmlHandler.startElement("", "record", "record", attributes);
168+
attributes.addAttribute("", "authority", "authority", "CDATA", "marcrelator");
169+
attributes.addAttribute("", "type", "type", "CDATA", "text");
170+
genericXmlHandler.startElement("", "roleTerm", "roleTerm", attributes);
171+
final char[] charData = "Author".toCharArray();
172+
genericXmlHandler.characters(charData, 0, charData.length);
173+
genericXmlHandler.endElement("", "roleTerm", "roleTerm");
174+
genericXmlHandler.endElement("", "record", "record");
175+
176+
final InOrder ordered = inOrder(receiver);
177+
ordered.verify(receiver).startRecord("");
178+
ordered.verify(receiver).startEntity("roleTerm");
179+
ordered.verify(receiver).literal(marker + "authority", "marcrelator");
180+
ordered.verify(receiver).literal(marker + "type", "text");
181+
ordered.verify(receiver).literal("value", "Author");
182+
ordered.verify(receiver).endEntity();
183+
ordered.verify(receiver).endRecord();
184+
ordered.verifyNoMoreInteractions();
185+
Mockito.verifyNoMoreInteractions(receiver);
186+
}
187+
146188
}

0 commit comments

Comments
 (0)