Skip to content

Commit 3c0c1f4

Browse files
committed
Fix #249: emits closing tag without opening tag in SimpleXmlEncoder
Changes `SimpleXmlEncoder` to not emit a closing root tag if no records were processed. Additionally, the test cases are refactored.
1 parent 80397f5 commit 3c0c1f4

File tree

2 files changed

+57
-52
lines changed

2 files changed

+57
-52
lines changed

src/main/java/org/culturegraph/mf/stream/converter/xml/SimpleXmlEncoder.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,9 @@ protected void onResetStream() {
164164
@Override
165165
protected void onCloseStream() {
166166
if (!separateRoots) {
167-
writeFooter();
167+
if (!atStreamStart) {
168+
writeFooter();
169+
}
168170
sendAndClearData();
169171
}
170172
}

src/test/java/org/culturegraph/mf/stream/converter/xml/SimpleXmlEncoderTest.java

Lines changed: 54 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -17,88 +17,91 @@
1717

1818

1919

20+
21+
import static org.junit.Assert.assertEquals;
22+
import static org.junit.Assert.assertTrue;
23+
2024
import org.culturegraph.mf.framework.DefaultObjectReceiver;
21-
import org.culturegraph.mf.framework.StreamReceiver;
22-
import org.culturegraph.mf.stream.converter.xml.SimpleXmlEncoder;
23-
import org.junit.Assert;
25+
import org.junit.Before;
2426
import org.junit.Test;
2527

2628
/**
27-
* Tests {@link SimpleXmlEncoder}.
29+
* Tests for class {@link SimpleXmlEncoder}.
2830
*
2931
* @author Markus Geipel
32+
* @author Christoph Böhme
3033
*
3134
*/
3235
public final class SimpleXmlEncoderTest {
3336

34-
3537
private static final String TAG = "tag";
3638
private static final String VALUE = "value";
3739

38-
//TODO add more tests!
40+
private SimpleXmlEncoder simpleXmlEncoder;
41+
42+
private StringBuilder resultCollector;
43+
44+
@Before
45+
public void initSystemUnderTest() {
46+
simpleXmlEncoder = new SimpleXmlEncoder();
47+
simpleXmlEncoder.setReceiver(
48+
new DefaultObjectReceiver<String>() {
49+
@Override
50+
public void process(final String obj) {
51+
resultCollector.append(obj);
52+
}
53+
});
54+
resultCollector = new StringBuilder();
55+
}
3956

57+
@Test
58+
public void issue249_shouldNotEmitClosingRootTagOnCloseStreamIfNoOutputWasGenerated() {
59+
simpleXmlEncoder.closeStream();
60+
61+
assertTrue(getResultXml().isEmpty());
62+
}
4063

4164
@Test
42-
public void testShouldOnlyEscapeFiveChars() {
65+
public void shouldOnlyEscapeXmlReservedCharacters() {
4366
final StringBuilder builder = new StringBuilder();
4467

4568
SimpleXmlEncoder.writeEscaped(builder , "&<>'\" üäö");
4669

47-
Assert.assertEquals("&amp;&lt;&gt;&apos;&quot; üäö", builder.toString());
70+
assertEquals("&amp;&lt;&gt;&apos;&quot; üäö", builder.toString());
4871
}
4972

5073
@Test
51-
public void testShouldHandleSeparateRoots(){
52-
final SimpleXmlEncoder writer = new SimpleXmlEncoder();
53-
writer.setRootTag("root");
54-
writer.setRecordTag("record");
55-
writer.setWriteXmlHeader(false);
56-
57-
//separateRoots=false
58-
final StringBuilder builder1 = new StringBuilder();
59-
writer.setReceiver(new DefaultObjectReceiver<String>() {
60-
@Override
61-
public void process(final String obj) {
62-
builder1.append(obj);
63-
}
64-
});
65-
66-
writer.setSeparateRoots(false);
74+
public void shouldWrapEachRecordInRootTagIfSeparateRootsIsTrue() {
75+
simpleXmlEncoder.setSeparateRoots(true);
6776

77+
emitTwoRecords();
6878

69-
writeTwoRecords(writer);
70-
71-
Assert.assertEquals("<root><record><tag>value</tag></record><record><tag>value</tag></record></root>", builder1.toString().replaceAll("[\\n\\s]", ""));
72-
73-
//separateRoots=true
74-
final StringBuilder builder2 = new StringBuilder();
75-
writer.setReceiver(new DefaultObjectReceiver<String>() {
76-
@Override
77-
public void process(final String obj) {
78-
builder2.append(obj);
79-
}
80-
});
81-
82-
writer.setSeparateRoots(true);
83-
84-
writeTwoRecords(writer);
79+
assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\"?><records><record><tag>value</tag></record></records><?xml version=\"1.0\" encoding=\"UTF-8\"?><records><record><tag>value</tag></record></records>",
80+
getResultXml());
81+
}
8582

86-
Assert.assertEquals("<root><record><tag>value</tag></record></root><root><record><tag>value</tag></record></root>", builder2.toString().replaceAll("[\\n\\s]", ""));
83+
@Test
84+
public void shouldWrapAllRecordsInOneRootTagtIfSeparateRootsIsFalse() {
85+
simpleXmlEncoder.setSeparateRoots(false);
8786

87+
emitTwoRecords();
8888

89+
assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\"?><records><record><tag>value</tag></record><record><tag>value</tag></record></records>",
90+
getResultXml());
8991
}
9092

91-
92-
93-
private static void writeTwoRecords(final StreamReceiver writer) {
94-
writer.startRecord("X");
95-
writer.literal(TAG, VALUE);
96-
writer.endRecord();
97-
writer.startRecord("Y");
98-
writer.literal(TAG, VALUE);
99-
writer.endRecord();
100-
writer.closeStream();
93+
private void emitTwoRecords() {
94+
simpleXmlEncoder.startRecord("X");
95+
simpleXmlEncoder.literal(TAG, VALUE);
96+
simpleXmlEncoder.endRecord();
97+
simpleXmlEncoder.startRecord("Y");
98+
simpleXmlEncoder.literal(TAG, VALUE);
99+
simpleXmlEncoder.endRecord();
100+
simpleXmlEncoder.closeStream();
101101
}
102102

103+
private String getResultXml() {
104+
return resultCollector.toString().replaceAll("[\\n\\t]", "");
105+
}
103106

104107
}

0 commit comments

Comments
 (0)