
com.github.mygreen.supercsv.builder.BeanMappingFactory Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of super-csv-annotation Show documentation
Show all versions of super-csv-annotation Show documentation
CSVのJavaライブラリであるSuperCSVに、アノテーション機能を追加したライブラリです。
package com.github.mygreen.supercsv.builder;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.TreeSet;
import java.util.stream.Collectors;
import org.supercsv.cellprocessor.ift.CellProcessor;
import org.supercsv.exception.SuperCsvReflectionException;
import com.github.mygreen.supercsv.annotation.CsvBean;
import com.github.mygreen.supercsv.annotation.CsvColumn;
import com.github.mygreen.supercsv.annotation.CsvPartial;
import com.github.mygreen.supercsv.annotation.CsvPostRead;
import com.github.mygreen.supercsv.annotation.CsvPostWrite;
import com.github.mygreen.supercsv.annotation.CsvPreRead;
import com.github.mygreen.supercsv.annotation.CsvPreWrite;
import com.github.mygreen.supercsv.annotation.DefaultGroup;
import com.github.mygreen.supercsv.exception.SuperCsvInvalidAnnotationException;
import com.github.mygreen.supercsv.localization.MessageBuilder;
import com.github.mygreen.supercsv.validation.CsvValidator;
/**
* BeanからCSVのマッピング情報を作成するクラス。
*
* @version 2.0
* @author T.TSUCHIE
*
*/
public class BeanMappingFactory {
private Configuration configuration = new Configuration();
/**
* デフォルトコンストラクタ
*/
public BeanMappingFactory() {
}
/**
* Beanクラスから、CSVのマッピング情報を作成します。
*
* @param Beanのタイプ
* @param beanType 作成元のBeanクラス。
* @param groups グループ情報。
* アノテーションを指定したグループで切り替える際に指定します。
* 何も指定しない場合は、デフォルトグループの{@link DefaultGroup}のクラスが指定されたとして処理します。
* @return CSVのマッピング情報。
* @throws NullPointerException {@literal beanType == null.}
* @throws SuperCsvInvalidAnnotationException アノテーションの定義が不正な場合。
*/
@SuppressWarnings({"unchecked"})
public BeanMapping create(final Class beanType, final Class>... groups) {
Objects.requireNonNull(beanType);
final BeanMapping beanMapping = new BeanMapping<>(beanType);
// アノテーション @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());
}
beanMapping.setHeader(beanAnno.header());
beanMapping.setValidateHeader(beanAnno.validateHeader());
// CsvValidatorの取得
final List> validators = Arrays.stream(beanAnno.validators())
.map(v -> (CsvValidator)configuration.getBeanFactory().create(v))
.collect(Collectors.toList());
beanMapping.addAllValidators(validators);
// アノテーション @CsvColumn の取得
final List columnMappingList = new ArrayList<>();
for(Field field : beanType.getDeclaredFields()) {
final CsvColumn columnAnno = field.getAnnotation(CsvColumn.class);
if(columnAnno != null) {
columnMappingList.add(createColumnMapping(field, columnAnno, configuration, groups));
}
}
// カラムの位置順の並び変えと、位置のチェック
columnMappingList.sort(null);
validateColumnAndSupplyPartialColumn(beanType, columnMappingList, Optional.ofNullable(beanType.getAnnotation(CsvPartial.class)));
beanMapping.addAllColumns(columnMappingList);
// コールバック用のメソッドの取得
for(Method method : beanType.getDeclaredMethods()) {
if(method.getAnnotation(CsvPreRead.class) != null) {
beanMapping.addPreReadMethod(new CallbackMethod(method));
}
if(method.getAnnotation(CsvPostRead.class) != null) {
beanMapping.addPostReadMethod(new CallbackMethod(method));
}
if(method.getAnnotation(CsvPreWrite.class) != null) {
beanMapping.addPreWriteMethod(new CallbackMethod(method));
}
if(method.getAnnotation(CsvPostWrite.class) != null) {
beanMapping.addPostWriteMethod(new CallbackMethod(method));
}
}
// リスナークラスの取得
final List
© 2015 - 2025 Weber Informatics LLC | Privacy Policy