1 package com.github.mygreen.supercsv.io;
2
3 import java.io.IOException;
4 import java.io.Writer;
5 import java.util.Collection;
6 import java.util.Objects;
7
8 import org.supercsv.encoder.CsvEncoder;
9 import org.supercsv.exception.SuperCsvException;
10 import org.supercsv.prefs.CsvPreference;
11 import org.supercsv.util.CsvContext;
12
13 import com.github.mygreen.supercsv.exception.SuperCsvBindingException;
14
15
16
17
18
19
20
21
22
23 public class FixedSizeCsvAnnotationBeanWriter<T> extends AbstractCsvAnnotationBeanWriter<T> {
24
25 private final Writer writer;
26
27 private final CsvPreference preference;
28
29 private final CsvEncoder encoder;
30
31
32
33
34
35
36 private int lineNumber = 0;
37
38
39
40
41
42
43 private int rowNumber = 0;
44
45
46
47
48
49
50 private int columnNumber = 0;
51
52 public FixedSizeCsvAnnotationBeanWriter(final Writer writer, final FixedSizeCsvPreference<T> preference) {
53 super(writer, preference.getCsvPreference());
54
55 this.writer = writer;
56 this.preference = preference.getCsvPreference();
57 this.encoder = this.preference.getEncoder();
58
59 this.beanMappingCache = preference.getBeanMappingCache();
60 this.validators.addAll(beanMappingCache.getOriginal().getValidators());
61 }
62
63
64
65
66
67
68 public void writeHeader() throws IOException {
69 writeHeader(getDefinedHeader());
70 }
71
72 @Override
73 protected void writeRow(final String... columns) throws IOException {
74
75 if( columns == null ) {
76 throw new NullPointerException(String.format("columns to write should not be null on line %d", lineNumber));
77 } else if( columns.length == 0 ) {
78 throw new IllegalArgumentException(String.format("columns to write should not be empty on line %d", lineNumber));
79 }
80
81 StringBuilder builder = new StringBuilder();
82 for( int i = 0; i < columns.length; i++ ) {
83
84 this.columnNumber = i + 1;
85
86
87 final String csvElement = columns[i];
88 if (csvElement != null) {
89 try {
90 final CsvContext context = new CsvContext(lineNumber, rowNumber, columnNumber);
91 final String escapedCsv = encoder.encode(csvElement, context, preference);
92 builder.append(escapedCsv);
93 this.lineNumber = context.getLineNumber();
94 } catch(SuperCsvException e) {
95 errorMessages.addAll(exceptionConverter.convertAndFormat(e, beanMappingCache.getOriginal()));
96 throw e;
97 }
98 }
99
100 }
101
102 builder.append(preference.getEndOfLineSymbols());
103 writer.write(builder.toString());
104 }
105
106
107
108
109 @Override
110 protected void incrementRowAndLineNo() {
111 lineNumber++;
112 rowNumber++;
113 }
114
115
116
117
118 @Override
119 public int getLineNumber() {
120 return lineNumber;
121 }
122
123
124
125
126 @Override
127 public int getRowNumber() {
128 return rowNumber;
129 }
130
131
132
133
134
135
136
137
138
139
140
141
142
143 public void writeAll(final Collection<T> sources) throws IOException {
144 writeAll(sources, false);
145 }
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161 public void writeAll(final Collection<T> sources, final boolean continueOnError) throws IOException {
162
163 Objects.requireNonNull(sources, "sources should not be null.");
164
165 if(beanMappingCache.getOriginal().isHeader() && getLineNumber() == 0) {
166 writeHeader();
167 }
168
169 for(T record : sources) {
170 try {
171 write(record);
172 } catch(SuperCsvBindingException e) {
173 if(!continueOnError) {
174 throw e;
175 }
176 }
177 }
178
179 flush();
180
181 }
182 }