LazyBeanMappingFactory.java
package com.github.mygreen.supercsv.builder;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import com.github.mygreen.supercsv.annotation.CsvBean;
import com.github.mygreen.supercsv.annotation.CsvColumn;
import com.github.mygreen.supercsv.annotation.DefaultGroup;
import com.github.mygreen.supercsv.exception.SuperCsvInvalidAnnotationException;
import com.github.mygreen.supercsv.localization.MessageBuilder;
/**
* カラム番号の設定、チェックを行わないで、BeanからCSVのマッピング情報を作成するクラス。
*
* @since 2.1
* @author T.TSUCHIE
*
*/
public class LazyBeanMappingFactory extends BeanMappingFactory {
/**
* デフォルトコンストラクタ
*/
public LazyBeanMappingFactory() {
}
/**
* Beanクラスから、CSVのマッピング情報を作成します。
*
* @param <T> Beanのタイプ
* @param beanType 作成元のBeanクラス。
* @param groups グループ情報。
* アノテーションを指定したグループで切り替える際に指定します。
* 何も指定しない場合は、デフォルトグループの{@link DefaultGroup}のクラスが指定されたとして処理します。
* @return CSVのマッピング情報。
* @throws NullPointerException {@literal beanType == null.}
* @throws SuperCsvInvalidAnnotationException アノテーションの定義が不正な場合。
*/
@Override
public <T> BeanMapping<T> create(final Class<T> beanType, final Class<?>... groups) {
Objects.requireNonNull(beanType);
final Configuration configuration = getConfiguration();
final BeanMapping<T> beanMapping = new BeanMapping<>(beanType);
beanMapping.setConfiguration(configuration);
// アノテーション @CsvBeanの取得
final CsvBean beanAnno = beanType.getAnnotation(CsvBean.class);
if(beanAnno == null) {
throw new SuperCsvInvalidAnnotationException(beanAnno, MessageBuilder.create("anno.notFound")
.varWithClass("property", beanType)
.varWithAnno("anno", CsvBean.class)
.format());
}
// ヘッダーの設定情報の組み立て
buildHeaderMapper(beanMapping, beanAnno);
// 入力値検証の設定を組み立てます。
buildValidators(beanMapping, beanAnno, groups);
// アノテーション @CsvColumn を元にしたカラム情報の組み立て
buildColumnMappingList(beanMapping, beanType, groups);
// コールバックメソッドの設定
buildCallbackMethods(beanMapping, beanType, beanAnno);
return beanMapping;
}
/**
* アノテーション{@link CsvColumn}を元に、カラムのマッピング情報を組み立てる。
* <p>カラム番号の検証や、部分的なカラムのカラムの組み立てはスキップ。</p>
* @param beanMapping Beanのマッピング情報
* @param beanType Beanのクラスタイプ
* @param groups グループ情報
*/
@Override
protected <T> void buildColumnMappingList(final BeanMapping<T> beanMapping, final Class<T> beanType, final Class<?>[] groups) {
final List<ColumnMapping> columnMappingList = new ArrayList<>();
for(Field field : beanType.getDeclaredFields()) {
final CsvColumn columnAnno = field.getAnnotation(CsvColumn.class);
if(columnAnno != null) {
columnMappingList.add(createColumnMapping(field, columnAnno, groups));
}
}
beanMapping.addAllColumns(columnMappingList);
}
}