Skip to content

Commit 7576665

Browse files
committed
Make simple XML encoder attribute marker configurable.
1 parent 8af6c69 commit 7576665

File tree

3 files changed

+97
-2
lines changed

3 files changed

+97
-2
lines changed

metafacture-xml/build.gradle

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,10 @@ dependencies {
2626
testImplementation 'org.mockito:mockito-core:2.5.5'
2727
testRuntimeOnly 'org.slf4j:slf4j-simple:1.7.21'
2828
}
29+
30+
test {
31+
testLogging {
32+
showStandardStreams = true
33+
exceptionFormat = 'full'
34+
}
35+
}

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

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ public final class SimpleXmlEncoder extends DefaultStreamPipe<ObjectReceiver<Str
7272

7373
private final StringBuilder builder = new StringBuilder();
7474

75+
private String attributeMarker = ATTRIBUTE_MARKER;
7576
private String rootTag = DEFAULT_ROOT_TAG;
7677
private String recordTag = DEFAULT_RECORD_TAG;
7778
private Map<String, String> namespaces = new HashMap<String, String>();
@@ -146,6 +147,14 @@ public void setNamespaces(final Map<String, String> namespaces) {
146147
this.namespaces = namespaces;
147148
}
148149

150+
public void setAttributeMarker(final String attributeMarker) {
151+
this.attributeMarker = attributeMarker;
152+
}
153+
154+
public String getAttributeMarker() {
155+
return attributeMarker;
156+
}
157+
149158
@Override
150159
public void startRecord(final String identifier) {
151160
if (separateRoots) {
@@ -195,8 +204,8 @@ public void literal(final String name, final String value) {
195204
if (name.isEmpty()) {
196205
element.setText(value);
197206
}
198-
else if (name.startsWith(ATTRIBUTE_MARKER)) {
199-
element.addAttribute(name.substring(1), value);
207+
else if (name.startsWith(attributeMarker)) {
208+
element.addAttribute(name.substring(attributeMarker.length()), value);
200209
}
201210
else {
202211
element.createChild(name).setText(value);

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

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,85 @@ public void shouldAddNamespaceWithEmptyKeyFromPropertiesFileAsDefaultNamespaceTo
179179
getResultXml());
180180
}
181181

182+
@Test
183+
public void testShouldEncodeMarkedLiteralsAsAttributes() {
184+
simpleXmlEncoder.startRecord("");
185+
simpleXmlEncoder.literal(TAG, VALUE);
186+
simpleXmlEncoder.literal("~attr", VALUE);
187+
simpleXmlEncoder.endRecord();
188+
simpleXmlEncoder.closeStream();
189+
190+
assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
191+
"<records>" +
192+
"<record attr=\"value\">" +
193+
"<tag>value</tag>" +
194+
"</record>" +
195+
"</records>",
196+
getResultXml());
197+
}
198+
199+
@Test
200+
public void testShouldNotEncodeMarkedEntitiesAsAttributes() {
201+
simpleXmlEncoder.setAttributeMarker("*");
202+
203+
simpleXmlEncoder.startRecord("");
204+
simpleXmlEncoder.startEntity("~entity");
205+
simpleXmlEncoder.literal(TAG, VALUE);
206+
simpleXmlEncoder.endEntity();
207+
simpleXmlEncoder.endRecord();
208+
simpleXmlEncoder.closeStream();
209+
210+
assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
211+
"<records>" +
212+
"<record>" +
213+
"<~entity>" +
214+
"<tag>value</tag>" +
215+
"</~entity>" +
216+
"</record>" +
217+
"</records>",
218+
getResultXml());
219+
}
220+
221+
@Test
222+
public void testShouldNotEncodeLiteralsWithDifferentMarkerAsAttributes() {
223+
simpleXmlEncoder.setAttributeMarker("*");
224+
225+
simpleXmlEncoder.startRecord("");
226+
simpleXmlEncoder.literal(TAG, VALUE);
227+
simpleXmlEncoder.literal("~attr", VALUE);
228+
simpleXmlEncoder.endRecord();
229+
simpleXmlEncoder.closeStream();
230+
231+
assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
232+
"<records>" +
233+
"<record>" +
234+
"<tag>value</tag>" +
235+
"<~attr>value</~attr>" +
236+
"</record>" +
237+
"</records>",
238+
getResultXml());
239+
}
240+
241+
@Test
242+
public void testShouldEncodeMarkedLiteralsWithConfiguredMarkerAsAttributes() {
243+
final String marker = "**";
244+
simpleXmlEncoder.setAttributeMarker(marker);
245+
246+
simpleXmlEncoder.startRecord("");
247+
simpleXmlEncoder.literal(TAG, VALUE);
248+
simpleXmlEncoder.literal(marker + "attr", VALUE);
249+
simpleXmlEncoder.endRecord();
250+
simpleXmlEncoder.closeStream();
251+
252+
assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
253+
"<records>" +
254+
"<record attr=\"value\">" +
255+
"<tag>value</tag>" +
256+
"</record>" +
257+
"</records>",
258+
getResultXml());
259+
}
260+
182261
private void emitTwoRecords() {
183262
simpleXmlEncoder.startRecord("X");
184263
simpleXmlEncoder.literal(TAG, VALUE);

0 commit comments

Comments
 (0)