View Javadoc
1   package com.github.mygreen.supercsv.builder;
2   
3   import java.lang.reflect.Field;
4   import java.util.ArrayList;
5   import java.util.List;
6   import java.util.Objects;
7   
8   import com.github.mygreen.supercsv.annotation.CsvBean;
9   import com.github.mygreen.supercsv.annotation.CsvColumn;
10  import com.github.mygreen.supercsv.annotation.DefaultGroup;
11  import com.github.mygreen.supercsv.exception.SuperCsvInvalidAnnotationException;
12  import com.github.mygreen.supercsv.localization.MessageBuilder;
13  
14  /**
15   * カラム番号の設定、チェックを行わないで、BeanからCSVのマッピング情報を作成するクラス。
16   *
17   * @since 2.1
18   * @author T.TSUCHIE
19   *
20   */
21  public class LazyBeanMappingFactory extends BeanMappingFactory {
22      
23      /**
24       * デフォルトコンストラクタ
25       */
26      public LazyBeanMappingFactory() {
27          
28      }
29      
30      /**
31       * Beanクラスから、CSVのマッピング情報を作成します。
32       * 
33       * @param <T> Beanのタイプ
34       * @param beanType 作成元のBeanクラス。
35       * @param groups グループ情報。
36       *              アノテーションを指定したグループで切り替える際に指定します。
37       *              何も指定しない場合は、デフォルトグループの{@link DefaultGroup}のクラスが指定されたとして処理します。
38       * @return CSVのマッピング情報。
39       * @throws NullPointerException {@literal beanType == null.}
40       * @throws SuperCsvInvalidAnnotationException アノテーションの定義が不正な場合。
41       */
42      @Override
43      public <T> BeanMapping<T> create(final Class<T> beanType, final Class<?>... groups) {
44          
45          Objects.requireNonNull(beanType);
46          
47          final Configuration configuration = getConfiguration();
48          final BeanMapping<T> beanMapping = new BeanMapping<>(beanType);
49          beanMapping.setConfiguration(configuration);
50          
51          // アノテーション @CsvBeanの取得
52          final CsvBean beanAnno = beanType.getAnnotation(CsvBean.class);
53          if(beanAnno == null) {
54              throw new SuperCsvInvalidAnnotationException(beanAnno, MessageBuilder.create("anno.notFound")
55                          .varWithClass("property", beanType)
56                          .varWithAnno("anno", CsvBean.class)
57                          .format());
58          }
59          
60          // ヘッダーの設定情報の組み立て
61          buildHeaderMapper(beanMapping, beanAnno);
62          
63          // 入力値検証の設定を組み立てます。
64          buildValidators(beanMapping, beanAnno, groups);
65          
66          // アノテーション @CsvColumn を元にしたカラム情報の組み立て
67          buildColumnMappingList(beanMapping, beanType, groups);
68          
69          // コールバックメソッドの設定
70          buildCallbackMethods(beanMapping, beanType, beanAnno);
71          
72          return beanMapping;
73      }
74      
75      /**
76       * アノテーション{@link CsvColumn}を元に、カラムのマッピング情報を組み立てる。
77       * <p>カラム番号の検証や、部分的なカラムのカラムの組み立てはスキップ。</p>
78       * @param beanMapping Beanのマッピング情報
79       * @param beanType  Beanのクラスタイプ
80       * @param groups グループ情報
81       */
82      @Override
83      protected <T> void buildColumnMappingList(final BeanMapping<T> beanMapping, final Class<T> beanType, final Class<?>[] groups) {
84          
85          final List<ColumnMapping> columnMappingList = new ArrayList<>();
86          for(Field field : beanType.getDeclaredFields()) {
87              
88              final CsvColumn columnAnno = field.getAnnotation(CsvColumn.class);
89              if(columnAnno != null) {
90                  columnMappingList.add(createColumnMapping(field, columnAnno, groups));
91              }
92              
93          }
94          
95          beanMapping.addAllColumns(columnMappingList);
96          
97      }
98      
99      
100 }