1 package com.github.mygreen.supercsv.io;
2
3 import java.io.BufferedWriter;
4 import java.io.IOException;
5 import java.io.Writer;
6 import java.util.Collection;
7 import java.util.Objects;
8
9 import org.supercsv.exception.SuperCsvException;
10 import org.supercsv.prefs.CsvPreference;
11
12 import com.github.mygreen.supercsv.builder.BeanMapping;
13 import com.github.mygreen.supercsv.builder.BeanMappingFactory;
14 import com.github.mygreen.supercsv.exception.SuperCsvBindingException;
15
16 /**
17 * アノテーションを元にCSVファイルを出力するためのクラス。
18 *
19 * @param <T> マッピング対象のBeanのクラスタイプ
20 * @version 2.1
21 * @author T.TSUCHIE
22 *
23 */
24 public class CsvAnnotationBeanWriter<T> extends AbstractCsvAnnotationBeanWriter<T> {
25
26 /**
27 * Beanのクラスタイプを指定して、{@link CsvAnnotationBeanWriter}を作成するコンストラクタ。
28 * <p>{@link BufferedWriter}にラップして実行されるため、ラップする必要はありません。</p>
29 *
30 * @param beanType Beanのクラスタイプ。
31 * @param writer the writer
32 * @param preference CSV preferences.
33 * @param groups グループ情報。適用するアノテーションを切り替える際に指定します。
34 * @throws NullPointerException {@literal if beanType or writer or preferences are null.}
35 */
36 public CsvAnnotationBeanWriter(final Class<T> beanType, final Writer writer, final CsvPreference preference,
37 final Class<?>... groups) {
38 super(writer, preference);
39
40 Objects.requireNonNull(beanType, "beanType should not be null.");
41
42 BeanMappingFactoryanMappingFactory.html#BeanMappingFactory">BeanMappingFactory factory = new BeanMappingFactory();
43 this.beanMappingCache = BeanMappingCache.create(factory.create(beanType, groups));
44 this.validators.addAll(beanMappingCache.getOriginal().getValidators());
45
46 }
47
48 /**
49 * Beanのマッピング情報を指定して、{@link CsvAnnotationBeanWriter}を作成するコンストラクタ。
50 * <p>{@link BufferedWriter}にラップして実行されるため、ラップする必要はありません。</p>
51 * <p>Beanのマッピング情報を独自にカスタマイズして、{@link BeanMappingFactory}から作成する場合に利用します。</p>
52 *
53 * @param beanMapping Beanのマッピング情報。
54 * @param writer the writer
55 * @param preference the CSV preferences.
56 * @throws NullPointerException {@literal if beanMapping or writer or preferences are null.}
57 */
58 public CsvAnnotationBeanWriter(final BeanMapping<T> beanMapping, final Writer writer, final CsvPreference preference) {
59 super(writer, preference);
60
61 Objects.requireNonNull(beanMapping, "beanMapping should not be null.");
62
63 this.beanMappingCache = BeanMappingCache.create(beanMapping);
64 this.validators.addAll(beanMapping.getValidators());
65 }
66
67 /**
68 * ヘッダー情報を書き込みます。
69 * <p>ただし、列番号を省略され、定義がされていないカラムは、{@literal column[カラム番号]}の形式となります。</p>
70 * @throws IOException ファイルの出力に失敗した場合。
71 */
72 public void writeHeader() throws IOException {
73 super.writeHeader(getDefinedHeader());
74 }
75
76 /**
77 * レコードのデータを全て書き込みます。
78 * <p>ヘッダー行も自動的に処理されます。2回目以降に呼び出した場合、ヘッダー情報は書き込まれません。</p>
79 * <p>レコード処理中に例外が発生した場合、その時点で処理を終了します。</p>
80 *
81 * @param sources 書き込むレコードのデータ。
82 * @throws NullPointerException sources is null.
83 * @throws IOException レコードの出力に失敗した場合。
84 * @throws SuperCsvBindingException セルの値に問題がある場合
85 * @throws SuperCsvException 設定など、その他に問題がある場合
86 *
87 */
88 public void writeAll(final Collection<T> sources) throws IOException {
89 writeAll(sources, false);
90 }
91
92 /**
93 * レコードのデータを全て書き込みます。
94 * <p>ヘッダー行も自動的に処理されます。2回目以降に呼び出した場合、ヘッダー情報は書き込まれません。</p>
95 *
96 * @param sources 書き込むレコードのデータ。
97 * @param continueOnError continueOnError レコードの処理中に、
98 * 例外{@link SuperCsvBindingException}が発生しても、続行するかどうか指定します。
99 * trueの場合、例外が発生しても、次の処理を行います。
100 * @throws NullPointerException sources is null.
101 * @throws IOException レコードの出力に失敗した場合。
102 * @throws SuperCsvBindingException セルの値に問題がある場合
103 * @throws SuperCsvException 設定など、その他に問題がある場合
104 *
105 */
106 public void writeAll(final Collection<T> sources, final boolean continueOnError) throws IOException {
107
108 Objects.requireNonNull(sources, "sources should not be null.");
109
110 if(beanMappingCache.getOriginal().isHeader() && getLineNumber() == 0) {
111 writeHeader();
112 }
113
114 for(T record : sources) {
115 try {
116 write(record);
117 } catch(SuperCsvBindingException e) {
118 if(!continueOnError) {
119 throw e;
120 }
121 }
122 }
123
124 flush();
125
126 }
127
128 }