ListCellConverterFactory.java

  1. package com.gh.mygreen.xlsmapper.cellconverter.impl;

  2. import java.util.Collections;
  3. import java.util.List;
  4. import java.util.Optional;

  5. import org.apache.poi.ss.usermodel.Cell;

  6. import com.gh.mygreen.xlsmapper.Configuration;
  7. import com.gh.mygreen.xlsmapper.annotation.XlsArrayConverter;
  8. import com.gh.mygreen.xlsmapper.annotation.XlsTrim;
  9. import com.gh.mygreen.xlsmapper.cellconverter.BaseCellConverter;
  10. import com.gh.mygreen.xlsmapper.cellconverter.CellConverter;
  11. import com.gh.mygreen.xlsmapper.cellconverter.CellConverterFactory;
  12. import com.gh.mygreen.xlsmapper.cellconverter.CellConverterFactorySupport;
  13. import com.gh.mygreen.xlsmapper.cellconverter.DefaultElementConverter;
  14. import com.gh.mygreen.xlsmapper.cellconverter.ElementConverter;
  15. import com.gh.mygreen.xlsmapper.cellconverter.TypeBindException;
  16. import com.gh.mygreen.xlsmapper.fieldaccessor.FieldAccessor;
  17. import com.gh.mygreen.xlsmapper.textformatter.ListFormatter;
  18. import com.gh.mygreen.xlsmapper.textformatter.TextFormatter;
  19. import com.gh.mygreen.xlsmapper.textformatter.TextParseException;

  20. /**
  21.  * {@link List}型を処理する{@link CellConverter}を作成するためのファクトリクラス。
  22.  *
  23.  * @since 2.0
  24.  * @author T.TSUCHIE
  25.  *
  26.  */
  27. @SuppressWarnings("rawtypes")
  28. public class ListCellConverterFactory extends CellConverterFactorySupport<List>
  29.         implements CellConverterFactory<List>{

  30.     @Override
  31.     public ListCellConverter create(final FieldAccessor field, final Configuration config) {
  32.        
  33.         final ListCellConverter cellConverter = new ListCellConverter(field, config);
  34.         setupCellConverter(cellConverter, field, config);
  35.        
  36.         return cellConverter;
  37.     }
  38.    
  39.     @Override
  40.     protected void setupCustom(final BaseCellConverter<List> cellConverter, final FieldAccessor field,
  41.             final Configuration config) {
  42.         // 何もしない
  43.     }
  44.    
  45.     @Override
  46.     protected TextFormatter<List> createTextFormatter(final FieldAccessor field, final Configuration config) {
  47.        
  48.         Optional<XlsArrayConverter> converterAnno = field.getAnnotation(XlsArrayConverter.class);
  49.         Optional<XlsTrim> trimAnno = field.getAnnotation(XlsTrim.class);
  50.        
  51.         final ListFormatter formatter = new ListFormatter(field.getComponentType());
  52.         converterAnno.ifPresent(anno -> {
  53.             formatter.setSeparator(anno.separator());
  54.             formatter.setIgnoreEmptyElement(anno.ignoreEmptyElement());
  55.            
  56.             final ElementConverter elementConverter;
  57.             if(anno.elementConverter().equals(DefaultElementConverter.class)) {
  58.                 elementConverter = new DefaultElementConverter();
  59.             } else {
  60.                 elementConverter = (ElementConverter)config.getBeanFactory().create(anno.elementConverter());
  61.             }
  62.             formatter.setElementConverter(elementConverter);
  63.         });
  64.         trimAnno.ifPresent(a -> formatter.setTrimmed(true));
  65.        
  66.         return formatter;
  67.     }
  68.    
  69.     public class ListCellConverter extends BaseCellConverter<List> {
  70.        
  71.         private ListCellConverter(final FieldAccessor field, final Configuration config) {
  72.             super(field, config);
  73.         }
  74.        
  75.         @Override
  76.         protected List parseCell(final Cell evaluatedCell, final String formattedValue) throws TypeBindException {
  77.             if(formattedValue.isEmpty()) {
  78.                 return Collections.emptyList();
  79.             }
  80.            
  81.             try {
  82.                 return this.textFormatter.parse(formattedValue);
  83.             } catch(TextParseException e) {
  84.                 throw newTypeBindExceptionOnParse(e, evaluatedCell, formattedValue);
  85.             }
  86.         }
  87.        
  88.         @Override
  89.         protected void setupCell(final Cell cell, final Optional<List> cellValue) throws TypeBindException {
  90.            
  91.             final ListFormatter formatter = (ListFormatter) textFormatter;
  92.             if(cellValue.isPresent()) {
  93.                 cell.setCellValue(formatter.format(cellValue.get()));
  94.             } else {
  95.                 cell.setBlank();
  96.             }
  97.            
  98.         }
  99.        
  100.     }
  101.    
  102. }