ListCellConverterFactory.java
- package com.gh.mygreen.xlsmapper.cellconverter.impl;
- import java.util.Collections;
- import java.util.List;
- import java.util.Optional;
- import org.apache.poi.ss.usermodel.Cell;
- import com.gh.mygreen.xlsmapper.Configuration;
- import com.gh.mygreen.xlsmapper.annotation.XlsArrayConverter;
- import com.gh.mygreen.xlsmapper.annotation.XlsTrim;
- import com.gh.mygreen.xlsmapper.cellconverter.BaseCellConverter;
- import com.gh.mygreen.xlsmapper.cellconverter.CellConverter;
- import com.gh.mygreen.xlsmapper.cellconverter.CellConverterFactory;
- import com.gh.mygreen.xlsmapper.cellconverter.CellConverterFactorySupport;
- import com.gh.mygreen.xlsmapper.cellconverter.DefaultElementConverter;
- import com.gh.mygreen.xlsmapper.cellconverter.ElementConverter;
- import com.gh.mygreen.xlsmapper.cellconverter.TypeBindException;
- import com.gh.mygreen.xlsmapper.fieldaccessor.FieldAccessor;
- import com.gh.mygreen.xlsmapper.textformatter.ListFormatter;
- import com.gh.mygreen.xlsmapper.textformatter.TextFormatter;
- import com.gh.mygreen.xlsmapper.textformatter.TextParseException;
- /**
- * {@link List}型を処理する{@link CellConverter}を作成するためのファクトリクラス。
- *
- * @since 2.0
- * @author T.TSUCHIE
- *
- */
- @SuppressWarnings("rawtypes")
- public class ListCellConverterFactory extends CellConverterFactorySupport<List>
- implements CellConverterFactory<List>{
- @Override
- public ListCellConverter create(final FieldAccessor field, final Configuration config) {
-
- final ListCellConverter cellConverter = new ListCellConverter(field, config);
- setupCellConverter(cellConverter, field, config);
-
- return cellConverter;
- }
-
- @Override
- protected void setupCustom(final BaseCellConverter<List> cellConverter, final FieldAccessor field,
- final Configuration config) {
- // 何もしない
- }
-
- @Override
- protected TextFormatter<List> createTextFormatter(final FieldAccessor field, final Configuration config) {
-
- Optional<XlsArrayConverter> converterAnno = field.getAnnotation(XlsArrayConverter.class);
- Optional<XlsTrim> trimAnno = field.getAnnotation(XlsTrim.class);
-
- final ListFormatter formatter = new ListFormatter(field.getComponentType());
- converterAnno.ifPresent(anno -> {
- formatter.setSeparator(anno.separator());
- formatter.setIgnoreEmptyElement(anno.ignoreEmptyElement());
-
- final ElementConverter elementConverter;
- if(anno.elementConverter().equals(DefaultElementConverter.class)) {
- elementConverter = new DefaultElementConverter();
- } else {
- elementConverter = (ElementConverter)config.getBeanFactory().create(anno.elementConverter());
- }
- formatter.setElementConverter(elementConverter);
- });
- trimAnno.ifPresent(a -> formatter.setTrimmed(true));
-
- return formatter;
- }
-
- public class ListCellConverter extends BaseCellConverter<List> {
-
- private ListCellConverter(final FieldAccessor field, final Configuration config) {
- super(field, config);
- }
-
- @Override
- protected List parseCell(final Cell evaluatedCell, final String formattedValue) throws TypeBindException {
- if(formattedValue.isEmpty()) {
- return Collections.emptyList();
- }
-
- try {
- return this.textFormatter.parse(formattedValue);
- } catch(TextParseException e) {
- throw newTypeBindExceptionOnParse(e, evaluatedCell, formattedValue);
- }
- }
-
- @Override
- protected void setupCell(final Cell cell, final Optional<List> cellValue) throws TypeBindException {
-
- final ListFormatter formatter = (ListFormatter) textFormatter;
- if(cellValue.isPresent()) {
- cell.setCellValue(formatter.format(cellValue.get()));
- } else {
- cell.setBlank();
- }
-
- }
-
- }
-
- }