View Javadoc
1   package com.github.mygreen.supercsv.io;
2   
3   import java.io.IOException;
4   import java.io.Reader;
5   import java.util.ArrayList;
6   import java.util.List;
7   
8   import org.supercsv.exception.SuperCsvException;
9   
10  import com.github.mygreen.supercsv.exception.SuperCsvBindingException;
11  import com.github.mygreen.supercsv.exception.SuperCsvFixedSizeException;
12  import com.github.mygreen.supercsv.exception.SuperCsvNoMatchColumnSizeException;
13  import com.github.mygreen.supercsv.exception.SuperCsvNoMatchHeaderException;
14  
15  /**
16   * アノテーションを元に固定長のCSVファイルを読み込むためのクラス。
17   *
18   * @since 2.5
19   * @param <T> マッピング対象のBeanのクラスタイプ
20   * @author T.TSUCHIE
21   *
22   */
23  public class FixedSizeCsvAnnotationBeanReader<T> extends AbstractCsvAnnotationBeanReader<T> {
24  
25      public FixedSizeCsvAnnotationBeanReader(final Reader reader, final FixedSizeCsvPreference<T> preference) {
26          super(preference.createTokenizer(reader), preference.getCsvPreference());
27  
28          this.beanMappingCache = preference.getBeanMappingCache();
29          this.validators.addAll(beanMappingCache.getOriginal().getValidators());
30      }
31      
32      @Override
33      protected boolean readRow() throws IOException {
34          try {
35              return super.readRow();
36          } catch(SuperCsvFixedSizeException e) {
37              /*
38               * FixedSizeTokenizer では行番号を取得できないので、ここで値を補完する。
39               * ただし、本来ならば行番号を+1加算する必要があるが、ここでは更新不可なのでそのまま設定する。
40               */
41              e.getCsvContext().setRowNumber(getRowNumber());
42              
43              errorMessages.addAll(exceptionConverter.convertAndFormat(e, beanMappingCache.getOriginal()));
44              throw e;
45          }
46      }
47      
48      /**
49       * レコードを全て読み込みます。
50       * <p>ヘッダー行も自動的に処理されます。</p>
51       * <p>レコード処理中に例外が発生した場合、その時点で処理を終了します。</p>
52       * 
53       * @return 読み込んだレコード情報。
54       * 
55       * @throws IOException レコードの読み込みに失敗した場合。
56       * @throws SuperCsvNoMatchColumnSizeException レコードのカラムサイズに問題がある場合
57       * @throws SuperCsvBindingException セルの値に問題がある場合
58       * @throws SuperCsvException 設定など、その他に問題がある場合
59       */
60      public List<T> readAll() throws IOException {
61          return readAll(false);
62      }
63      
64      /**
65       * レコードを全て読み込みます。
66       * <p>ヘッダー行も自動的に処理されます。</p>
67       * 
68       * @param continueOnError レコードの処理中に、
69       *        例外{@link SuperCsvNoMatchColumnSizeException}、{@link SuperCsvNoMatchColumnSizeException}、{@link SuperCsvBindingException}
70       *        が発生しても続行するかどう指定します。
71       *        trueの場合、例外が発生しても、次の処理を行います。
72       * @return 読み込んだレコード情報。
73       * 
74       * @throws IOException レコードの読み込みに失敗した場合。
75       * @throws SuperCsvNoMatchColumnSizeException レコードのカラムサイズに問題がある場合
76       * @throws SuperCsvBindingException セルの値に問題がある場合
77       * @throws SuperCsvException 設定など、その他に問題がある場合
78       */
79      public List<T> readAll(final boolean continueOnError) throws IOException {
80          
81          if(beanMappingCache.getOriginal().isHeader()) {
82              try {
83                  getHeader(true);
84              } catch(SuperCsvNoMatchColumnSizeException | SuperCsvNoMatchHeaderException e) {
85                  if(!continueOnError) {
86                      throw e;
87                  }
88              }
89          }
90          
91          final List<T> list = new ArrayList<>();
92          
93          while(true) {
94              try {
95                  final T record = read();
96                  if(record == null) {
97                      break;
98                  }
99                  list.add(record);
100                 
101             } catch(SuperCsvNoMatchColumnSizeException | SuperCsvBindingException e) {
102                 if(!continueOnError) {
103                     throw e;
104                 }
105             }
106         }
107         
108         return list;
109     }
110     
111 }