package com.gh.mygreen.xlsmapper.fieldprocessor;
import java.lang.annotation.Annotation;
import com.gh.mygreen.xlsmapper.XlsMapperConfig;
import com.gh.mygreen.xlsmapper.XlsMapperException;
import com.gh.mygreen.xlsmapper.annotation.XlsConverter;
import com.gh.mygreen.xlsmapper.cellconvert.CellConverter;
import com.gh.mygreen.xlsmapper.cellconvert.CellConverterRegistry;
import com.gh.mygreen.xlsmapper.cellconvert.ConversionException;
import com.gh.mygreen.xlsmapper.cellconvert.DefaultCellConverter;
/**
* 各種アノテーションを処理するためのクラスの抽象クラス。
* <p>通常はこのクラスを継承して作成する。
*
* @version 1.0
* @author T.TSUCHIE
*
*/
public abstract class AbstractFieldProcessor<A extends Annotation> implements LoadingFieldProcessor<A>, SavingFieldProcessor<A> {
/**
* 該当するタイプのConverterが見つからないときの例外のインスタンスを作成する。
* @param targetType クラスタイプ
* @return
*/
protected ConversionException newNotFoundConverterExpcetion(final Class<?> targetType) {
return new ConversionException(
String.format("not found CellConverter for type '%s'.", targetType.getName()),
targetType);
}
/**
* 読み込み時用のConveterを取得する。
* <p>アノテーション「{@link XlsConverter#converterClass()}」が設定されていた場合を考慮した、個別のConverterを考慮する。
*
* @param adaptor フィールド情報
* @param converterResolver Converterを登録しているクラス。
* @param config XlsMapperの設定クラス。Converterクラスのインスタンスを生成する際に利用する。
* @return
* @throws XlsMapperException Converterが見つからない場合。
*/
protected CellConverter<?> getLoadingCellConverter(final FieldAdaptor adaptor, final CellConverterRegistry converterResolver,
final XlsMapperConfig config) throws XlsMapperException {
final XlsConverter converterAnno = adaptor.getLoadingAnnotation(XlsConverter.class);
final CellConverter<?> converter;
if(converterAnno != null && !converterAnno.converterClass().equals(DefaultCellConverter.class)) {
converter = config.createBean(converterAnno.converterClass());
} else {
converter = converterResolver.getConverter(adaptor.getTargetClass());
if(converter == null) {
throw newNotFoundConverterExpcetion(adaptor.getTargetClass());
}
}
return converter;
}
/**
* 書き込み時用のConveterを取得する。
* <p>アノテーション「{@link XlsConverter#converterClass()}」が設定されていた場合を考慮した、個別のConverterを考慮する。
*
* @param adaptor フィールド情報
* @param converterResolver Converterを登録しているクラス。
* @param config XlsMapperの設定クラス。Converterクラスのインスタンスを生成する際に利用する。
* @return
* @throws XlsMapperException Converterが見つからない場合。
*/
protected CellConverter<?> getSavingCellConverter(final FieldAdaptor adaptor, final CellConverterRegistry converterResolver,
final XlsMapperConfig config) throws XlsMapperException {
final XlsConverter converterAnno = adaptor.getSavingAnnotation(XlsConverter.class);
final CellConverter<?> converter;
if(converterAnno != null && !converterAnno.converterClass().equals(DefaultCellConverter.class)) {
converter = config.createBean(converterAnno.converterClass());
} else {
converter = converterResolver.getConverter(adaptor.getTargetClass());
if(converter == null) {
throw newNotFoundConverterExpcetion(adaptor.getTargetClass());
}
}
return converter;
}
}