2323import java .util .Date ;
2424import java .util .HashMap ;
2525import java .util .Map ;
26+ import java .util .MissingResourceException ;
2627import java .util .ResourceBundle ;
2728import java .util .function .Function ;
2829
3233 * Encodes CSV content.
3334 */
3435public class CSVEncoder extends Encoder <Iterable <?>> {
35- private Collection <String > keys ;
36+ private Collection <? > keys ;
3637
3738 private Map <Class <?>, Function <Object , String >> formatters = new HashMap <>();
3839
@@ -46,7 +47,7 @@ public class CSVEncoder extends Encoder<Iterable<?>> {
4647 * @param keys
4748 * The column keys.
4849 */
49- public CSVEncoder (Collection <String > keys ) {
50+ public CSVEncoder (Collection <? > keys ) {
5051 if (keys == null ) {
5152 throw new IllegalArgumentException ();
5253 }
@@ -120,18 +121,21 @@ private void encode(Iterable<?> rows, Writer writer) throws IOException {
120121
121122 for (var key : keys ) {
122123 if (key == null ) {
123- throw new IllegalStateException ();
124+ throw new IllegalStateException ("Missing key." );
124125 }
125126
126127 if (i > 0 ) {
127128 writer .write (DELIMITER );
128129 }
129130
130- String heading ;
131- if (resourceBundle == null ) {
132- heading = key ;
133- } else {
134- heading = resourceBundle .getObject (key ).toString ();
131+ var heading = key ;
132+
133+ if (resourceBundle != null ) {
134+ try {
135+ heading = resourceBundle .getObject (key .toString ());
136+ } catch (MissingResourceException exception ) {
137+ // No-op
138+ }
135139 }
136140
137141 encode (heading , writer );
@@ -151,31 +155,35 @@ private void encode(Iterable<?> rows, Writer writer) throws IOException {
151155 writer .write (DELIMITER );
152156 }
153157
154- var value = map .get (key );
158+ encode (map .get (key ), writer );
159+
160+ i ++;
161+ }
155162
156- if (value != null ) {
157- if (value instanceof Date date ) {
158- value = date .toInstant ();
159- }
163+ writer .write ("\r \n " );
164+ }
165+ }
160166
161- var formatter = formatters .get (value .getClass ());
167+ private void encode (Object value , Writer writer ) throws IOException {
168+ if (value == null ) {
169+ return ;
170+ }
162171
163- if (formatter != null ) {
164- value = formatter . apply ( value );
165- }
172+ if (value instanceof Date date ) {
173+ value = date . toInstant ( );
174+ }
166175
167- switch (value ) {
168- case CharSequence text -> encode (text , writer );
169- case Number number -> encode (number , writer );
170- case Boolean flag -> encode (flag , writer );
171- default -> encode (value .toString (), writer );
172- }
173- }
176+ var formatter = formatters .get (value .getClass ());
174177
175- i ++;
176- }
178+ if (formatter != null ) {
179+ value = formatter .apply (value );
180+ }
177181
178- writer .write ("\r \n " );
182+ switch (value ) {
183+ case CharSequence text -> encode (text , writer );
184+ case Number number -> encode (number , writer );
185+ case Boolean flag -> encode (flag , writer );
186+ default -> encode (value .toString (), writer );
179187 }
180188 }
181189
0 commit comments