FieldProcessorRegistry.java
package com.gh.mygreen.xlsmapper.fieldprocessor;
import java.lang.annotation.Annotation;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import com.gh.mygreen.xlsmapper.annotation.XlsArrayCells;
import com.gh.mygreen.xlsmapper.annotation.XlsCell;
import com.gh.mygreen.xlsmapper.annotation.XlsComment;
import com.gh.mygreen.xlsmapper.annotation.XlsHorizontalRecords;
import com.gh.mygreen.xlsmapper.annotation.XlsIterateTables;
import com.gh.mygreen.xlsmapper.annotation.XlsLabelledArrayCells;
import com.gh.mygreen.xlsmapper.annotation.XlsLabelledCell;
import com.gh.mygreen.xlsmapper.annotation.XlsLabelledComment;
import com.gh.mygreen.xlsmapper.annotation.XlsSheetName;
import com.gh.mygreen.xlsmapper.annotation.XlsVerticalRecords;
import com.gh.mygreen.xlsmapper.fieldprocessor.impl.ArrayCellsProcessor;
import com.gh.mygreen.xlsmapper.fieldprocessor.impl.CellProcessor;
import com.gh.mygreen.xlsmapper.fieldprocessor.impl.CommentProcessor;
import com.gh.mygreen.xlsmapper.fieldprocessor.impl.HorizontalRecordsProcessor;
import com.gh.mygreen.xlsmapper.fieldprocessor.impl.IterateTablesProcessor;
import com.gh.mygreen.xlsmapper.fieldprocessor.impl.LabelledArrayCellsProcessor;
import com.gh.mygreen.xlsmapper.fieldprocessor.impl.LabelledCellProcessor;
import com.gh.mygreen.xlsmapper.fieldprocessor.impl.LabelledCommentProcessor;
import com.gh.mygreen.xlsmapper.fieldprocessor.impl.SheetNameProcessor;
import com.gh.mygreen.xlsmapper.fieldprocessor.impl.VerticalRecordsProcessor;
import com.gh.mygreen.xlsmapper.util.ArgUtils;
/**
* {@link FieldProcessor}を管理するクラス。
*
* @version 2.1
* @author Naoki Takezoe
* @author T.TSUCHIE
*
*/
public class FieldProcessorRegistry {
private Map<Class<? extends Annotation>, FieldProcessor<?>> pocessorMap = new ConcurrentHashMap<>();
public FieldProcessorRegistry() {
this.pocessorMap = new ConcurrentHashMap<>();
init();
}
/**
* {@link FieldProcessor}の登録状態を初期値に戻します。
*/
public void init() {
pocessorMap.clear();
//標準のフィールドプロセッサを登録する。
registerProcessor(XlsSheetName.class, new SheetNameProcessor());
registerProcessor(XlsCell.class, new CellProcessor());
registerProcessor(XlsLabelledCell.class, new LabelledCellProcessor());
registerProcessor(XlsHorizontalRecords.class, new HorizontalRecordsProcessor());
registerProcessor(XlsVerticalRecords.class, new VerticalRecordsProcessor());
registerProcessor(XlsIterateTables.class, new IterateTablesProcessor());
registerProcessor(XlsArrayCells.class, new ArrayCellsProcessor());
registerProcessor(XlsLabelledArrayCells.class, new LabelledArrayCellsProcessor());
registerProcessor(XlsComment.class, new CommentProcessor());
registerProcessor(XlsLabelledComment.class, new LabelledCommentProcessor());
}
/**
* アノテーションに対する{@link FieldProcessor}を取得する。
* @param annoClass 取得対象のアノテーションのクラスタイプ。
* @return 見つからない場合はnullを返す。
* @throws NullPointerException {@literal annoClass}
*/
@SuppressWarnings("unchecked")
public <A extends Annotation> FieldProcessor<A> getProcessor(final Class<A> annoClass) {
ArgUtils.notNull(annoClass, "annoClass");
return (FieldProcessor<A>) pocessorMap.get(annoClass);
}
/**
* アノテーションに対する{@link FieldProcessor}を登録する。
* @param annoClass 登録対象のアノテーションのクラスタイプ。
* @param processor フィールドプロセッサーのインスタンス。{@link FieldProcessor}を実装している必要がある。
* @throws NullPointerException {@literal annoClass == null or processor == null.}
*/
public <A extends Annotation> void registerProcessor(final Class<A> annoClass, final FieldProcessor<A> processor) {
ArgUtils.notNull(annoClass, "annoClass");
ArgUtils.notNull(processor, "processor");
pocessorMap.put(annoClass, processor);
}
}