BooleanCellConverterFactory.java

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

  2. import java.util.Optional;

  3. import org.apache.poi.ss.usermodel.Cell;
  4. import org.apache.poi.ss.usermodel.CellType;

  5. import com.gh.mygreen.xlsmapper.Configuration;
  6. import com.gh.mygreen.xlsmapper.annotation.XlsBooleanConverter;
  7. import com.gh.mygreen.xlsmapper.cellconverter.BaseCellConverter;
  8. import com.gh.mygreen.xlsmapper.cellconverter.CellConverter;
  9. import com.gh.mygreen.xlsmapper.cellconverter.CellConverterFactory;
  10. import com.gh.mygreen.xlsmapper.cellconverter.CellConverterFactorySupport;
  11. import com.gh.mygreen.xlsmapper.cellconverter.TypeBindException;
  12. import com.gh.mygreen.xlsmapper.fieldaccessor.FieldAccessor;
  13. import com.gh.mygreen.xlsmapper.textformatter.BooleanFormatter;
  14. import com.gh.mygreen.xlsmapper.textformatter.TextFormatter;
  15. import com.gh.mygreen.xlsmapper.textformatter.TextParseException;

  16. /**
  17.  * {@link boolean}/{@link Boolean}型を処理する{@link CellConverter}を作成するためのファクトリクラス。
  18.  *
  19.  * @since 2.0
  20.  * @author T.TSUCHIE
  21.  *
  22.  */
  23. public class BooleanCellConverterFactory extends CellConverterFactorySupport<Boolean>
  24.         implements CellConverterFactory<Boolean> {
  25.    
  26.     @Override
  27.     public BooleanCellConverter create(final FieldAccessor field, final Configuration config) {
  28.        
  29.         final BooleanCellConverter cellConverter = new BooleanCellConverter(field, config);
  30.         setupCellConverter(cellConverter, field, config);
  31.        
  32.         return cellConverter;
  33.     }
  34.    
  35.     @Override
  36.     protected void setupCustom(final BaseCellConverter<Boolean> cellConverter, final FieldAccessor field,
  37.             final Configuration config) {
  38.         // 何もしない
  39.        
  40.     }
  41.    
  42.     @Override
  43.     protected TextFormatter<Boolean> createTextFormatter(final FieldAccessor field, final Configuration config) {
  44.        
  45.         Optional<XlsBooleanConverter> converterAnno = field.getAnnotation(XlsBooleanConverter.class);
  46.        
  47.         return converterAnno.map(anno -> new BooleanFormatter(anno.loadForTrue(), anno.loadForFalse(),
  48.                 anno.saveAsTrue(), anno.saveAsFalse(), anno.ignoreCase(), anno.failToFalse()))
  49.                 .orElseGet(() -> new BooleanFormatter());
  50.        
  51.     }
  52.    
  53.     public class BooleanCellConverter extends BaseCellConverter<Boolean> {
  54.        
  55.         private BooleanCellConverter(final FieldAccessor field, final Configuration config) {
  56.             super(field, config);
  57.         }
  58.        
  59.         @Override
  60.         protected Boolean parseCell(final Cell evaluatedCell, final String formattedValue) throws TypeBindException {
  61.            
  62.             if(evaluatedCell.getCellType().equals(CellType.BOOLEAN)) {
  63.                 return evaluatedCell.getBooleanCellValue();
  64.                
  65.             } else if(!formattedValue.isEmpty()) {
  66.                 try {
  67.                     return this.textFormatter.parse(formattedValue);
  68.                 } catch(TextParseException e) {
  69.                     throw newTypeBindExceptionOnParse(e, evaluatedCell, formattedValue);
  70.                 }
  71.                
  72.             }
  73.            
  74.             if(field.getType().isPrimitive()) {
  75.                 return false;
  76.                
  77.             } else if(field.isComponentType() && field.getComponentType().isPrimitive()) {
  78.                 return false;
  79.             }
  80.            
  81.             return null;
  82.         }
  83.        
  84.         @Override
  85.         protected void setupCell(final Cell cell, final Optional<Boolean> cellValue) throws TypeBindException {
  86.            
  87.             final BooleanFormatter formatter = (BooleanFormatter) textFormatter;
  88.            
  89.             if(cellValue.isPresent()) {
  90.                 if(formatter.getSaveTrueValue().equalsIgnoreCase("true")
  91.                         && formatter.getSaveFalseValue().equalsIgnoreCase("false")
  92.                         && cell.getCellType().equals(CellType.BOOLEAN)) {
  93.                     // テンプレートのセルの書式がbooleanの場合はそのまま設定する
  94.                     cell.setCellValue(cellValue.get());
  95.                    
  96.                 } else {
  97.                     cell.setCellValue(formatter.format(cellValue.get()));
  98.                 }
  99.                
  100.             } else {
  101.                 cell.setBlank();
  102.             }
  103.         }
  104.        
  105.     }
  106.    
  107. }