Skip to content
This repository was archived by the owner on Jan 22, 2019. It is now read-only.

Commit 8c7213a

Browse files
authored
Merge pull request #129 from ansell/issue-128-headers
Fix issue #128 headers are not written if no rows are written
2 parents f0e663e + fa79ad4 commit 8c7213a

File tree

2 files changed

+67
-0
lines changed

2 files changed

+67
-0
lines changed

src/main/java/com/fasterxml/jackson/dataformat/csv/CsvGenerator.java

+6
Original file line numberDiff line numberDiff line change
@@ -428,6 +428,12 @@ public void close() throws IOException
428428

429429
// Let's mark row as closed, if we had any...
430430
finishRow();
431+
432+
// Write the header if necessary, occurs when no rows written
433+
if (_handleFirstLine) {
434+
_handleFirstLine();
435+
}
436+
431437
_writer.close(_ioContext.isResourceManaged() || isEnabled(JsonGenerator.Feature.AUTO_CLOSE_TARGET));
432438
}
433439

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package com.fasterxml.jackson.dataformat.csv.ser;
2+
3+
import java.io.IOException;
4+
import java.io.StringWriter;
5+
import java.util.Arrays;
6+
import java.util.List;
7+
8+
import com.fasterxml.jackson.databind.SequenceWriter;
9+
import com.fasterxml.jackson.dataformat.csv.*;
10+
11+
// Tests for verifying that headers are emitted
12+
public class HeaderWriteTest extends ModuleTestBase
13+
{
14+
/*
15+
/**********************************************************************
16+
/* Test methods
17+
/**********************************************************************
18+
*/
19+
20+
private final CsvMapper MAPPER = mapperForCsv();
21+
22+
public void testNoLines() throws Exception
23+
{
24+
List<String> headers = Arrays.asList("TestHeader1", "TestHeader2");
25+
List<List<String>> dataSource = Arrays.asList();
26+
String result = runTest(headers, dataSource);
27+
28+
assertEquals("Headers should have been written even with no other data", "TestHeader1,TestHeader2\n", result);
29+
}
30+
31+
public void testOneLine() throws Exception
32+
{
33+
List<String> headers = Arrays.asList("TestHeader1", "TestHeader2");
34+
List<List<String>> dataSource = Arrays.asList(Arrays.asList("TestValue1", "TestValue2"));
35+
String result = runTest(headers, dataSource);
36+
37+
assertEquals("Headers should have been written before line", "TestHeader1,TestHeader2\nTestValue1,TestValue2\n", result);
38+
}
39+
40+
private String runTest(List<String> headers, List<List<String>> dataSource) throws IOException
41+
{
42+
StringWriter writer = new StringWriter();
43+
44+
CsvSchema.Builder builder = CsvSchema.builder();
45+
for (String nextHeader : headers) {
46+
builder = builder.addColumn(nextHeader);
47+
}
48+
49+
CsvSchema schema = builder.setUseHeader(true).build();
50+
try (SequenceWriter csvWriter = MAPPER.writerWithDefaultPrettyPrinter()
51+
.with(schema)
52+
.forType(List.class)
53+
.writeValues(writer);) {
54+
for(List<String> nextRow : dataSource) {
55+
csvWriter.write(nextRow);
56+
}
57+
}
58+
59+
return writer.toString();
60+
}
61+
}

0 commit comments

Comments
 (0)