CharacterCellConverterFactory.java

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

import java.util.Optional;

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

import com.gh.mygreen.xlsmapper.Configuration;
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.TypeBindException;
import com.gh.mygreen.xlsmapper.fieldaccessor.FieldAccessor;
import com.gh.mygreen.xlsmapper.textformatter.TextFormatter;
import com.gh.mygreen.xlsmapper.textformatter.TextParseException;

/**
 *  char/Character を処理する{@link CellConverter}を作成するためのファクトリクラス。
 * 
 * @since 2.0
 * @author T.TSUCHIE
 *
 */
public class CharacterCellConverterFactory extends CellConverterFactorySupport<Character>
        implements CellConverterFactory<Character> {
    
    private static final char DEFAULT_VALUE = '\u0000';;
    
    @Override
    public CharacterCellConverter create(final FieldAccessor field, final Configuration config) {
        
        final CharacterCellConverter cellConverter = new CharacterCellConverter(field, config);
        setupCellConverter(cellConverter, field, config);
        
        return cellConverter;
    }
    
    @Override
    protected void setupCustom(final BaseCellConverter<Character> cellConverter, final FieldAccessor field, final Configuration config) {
        // 何もしない
        
    }
    
    @Override
    protected TextFormatter<Character> createTextFormatter(final FieldAccessor field, final Configuration config) {
        
        return new TextFormatter<Character>() {
            
            @Override
            public Character parse(final String text) throws TextParseException {
                
                if(text.length() >= 1) {
                    return text.charAt(0);
                }
                
                // 値が空のとき
                if(field.getType().isPrimitive()) {
                    return DEFAULT_VALUE;
                    
                } else if(field.isComponentType() && field.getComponentType().isPrimitive()) {
                    return DEFAULT_VALUE;
                }
                
                return null;
            }
            
            @Override
            public String format(final Character value) {
                return value.toString();
            }
        };
    }
    
    public class CharacterCellConverter extends BaseCellConverter<Character> {
        
        private CharacterCellConverter(final FieldAccessor field, final Configuration config) {
            super(field, config);
        }
        
        @Override
        protected Character parseCell(final Cell evaluatedCell, final String formattedValue) throws TypeBindException {
            
            return this.textFormatter.parse(formattedValue);
        }
        
        @Override
        protected void setupCell(final Cell cell, final Optional<Character> cellValue) throws TypeBindException {
            
            // \u0000 は、初期値として空と判定する。
            if(cellValue.isPresent() && cellValue.get() != DEFAULT_VALUE) {
                cell.setCellValue(cellValue.get().toString());
                
            } else {
                cell.setBlank();
            }
        }
        
    }
    
}