AbstractFieldProcessor.java

package com.gh.mygreen.xlsmapper.fieldprocessor;

import java.lang.annotation.Annotation;

import com.gh.mygreen.xlsmapper.Configuration;
import com.gh.mygreen.xlsmapper.annotation.XlsConverter;
import com.gh.mygreen.xlsmapper.cellconverter.CellConverter;
import com.gh.mygreen.xlsmapper.cellconverter.CellConverterFactory;
import com.gh.mygreen.xlsmapper.cellconverter.ConversionException;
import com.gh.mygreen.xlsmapper.fieldaccessor.FieldAccessor;
import com.gh.mygreen.xlsmapper.localization.MessageBuilder;


/**
 * 各種アノテーションを処理するためのクラスの抽象クラス。
 * <p>通常はこのクラスを継承して作成します。</p>
 *
 * @param <A> サポートするアノテーション
 * @version 2.0
 * @author T.TSUCHIE
 *
 */
public abstract class AbstractFieldProcessor<A extends Annotation> implements FieldProcessor<A> {

    /**
     * 該当するタイプのConverterが見つからないときの例外のインスタンスを作成する。
     * @param targetType クラスタイプ
     * @return {@link ConversionException} のインスタンス
     */
    protected ConversionException newNotFoundCellConverterExpcetion(final Class<?> targetType) {
        return new ConversionException(
                MessageBuilder.create("cellConverter.notFound")
                    .varWithClass("classType", targetType)
                    .format(),
                targetType);
    }

    /**
     * 指定したタイプに対する{@link CellConverter}を取得します。
     * <p>アノテーション「{@link XlsConverter}」が付与されている場合、そちらの設定値を優先します。</p>
     *
     * @param accessor フィールド情報
     * @param config システム情報設定。
     * @return {@link CellConverter}のインスタンス
     * @throws ConversionException {@link CellConverter}が見つからない場合。
     */
    protected CellConverter<?> getCellConverter(final FieldAccessor accessor, final Configuration config) throws ConversionException {

        final CellConverter<?> converter;

        if(accessor.hasAnnotation(XlsConverter.class)) {
            XlsConverter converterAnno = accessor.getAnnotationNullable(XlsConverter.class);
            converter = config.createBean(converterAnno.value()).create(accessor, config);

        } else {
            CellConverterFactory<?> converterFactory = config.getConverterRegistry().getConverterFactory(accessor.getType());
            if(converterFactory == null) {
                throw newNotFoundCellConverterExpcetion(accessor.getType());
            }
            converter = converterFactory.create(accessor, config);
        }

        return converter;
    }

    /**
     * コンポーネントタイプを指定して、指定したタイプに対する{@link CellConverter}を取得します。
     * <p>アノテーション「{@link XlsConverter}」が付与されている場合、そちらの設定値を優先します。</p>
     *
     * @param componentType コンポーネントのクラスタイプ
     * @param accessor フィールド情報
     * @param config システム情報設定。
     * @return {@link CellConverter}のインスタンス
     * @throws ConversionException {@link CellConverter}が見つからない場合。
     */
    protected CellConverter<?> getCellConverter(final Class<?> componentType, final FieldAccessor accessor, final Configuration config)
            throws ConversionException {

        final CellConverter<?> converter;

        if(accessor.hasAnnotation(XlsConverter.class)) {
            XlsConverter converterAnno = accessor.getAnnotationNullable(XlsConverter.class);
            converter = config.createBean(converterAnno.value()).create(accessor, config);

        } else {
            CellConverterFactory<?> converterFactory = config.getConverterRegistry().getConverterFactory(componentType);
            if(converterFactory == null) {
                throw newNotFoundCellConverterExpcetion(componentType);
            }
            converter = converterFactory.create(accessor, config);
        }

        return converter;
    }

}