View Javadoc
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 }