CalendarCellConverterFactory.java

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

import java.util.Calendar;
import java.util.Date;
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.CellConverterFactorySupport;
import com.gh.mygreen.xlsmapper.cellconverter.CellConverter;
import com.gh.mygreen.xlsmapper.cellconverter.CellConverterFactory;
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;

/**
 * {@link Calendar}を処理する{@link CellConverter}を作成するためのファクトリクラス。
 * 
 * @since 2.0
 * @author T.TSUCHIE
 *
 */
public class CalendarCellConverterFactory extends CellConverterFactorySupport<Calendar>
        implements CellConverterFactory<Calendar> {
    
    private DateCellConverterFactory dateCellConverterFactory = new DateCellConverterFactory();
    
    @Override
    public CalendarCellConverter create(final FieldAccessor field, final Configuration config) {
        
        final DateCellConverterFactory.DateCellConverter dateCellConverter = dateCellConverterFactory.create(field, config);
        
        final CalendarCellConverter cellConverter = new CalendarCellConverter(field, config, dateCellConverter);
        setupCellConverter(cellConverter, field, config);
        
        return cellConverter;
    }
    
    @Override
    protected void setupCustom(final BaseCellConverter<Calendar> cellConverter, final FieldAccessor field, final Configuration config) {
        
        // 何もなし
        
    }
    
    @Override
    protected TextFormatter<Calendar> createTextFormatter(final FieldAccessor field, final Configuration config) {
        
        final TextFormatter<Date> dateTextFormatter = dateCellConverterFactory.createTextFormatter(field, config);
        
        return new TextFormatter<Calendar>() {
            
            @Override
            public Calendar parse(final String text) throws TextParseException {
                
                Date date = dateTextFormatter.parse(text);
                Calendar cal= Calendar.getInstance();
                cal.setTime(date);
                
                return cal;
            }
            
            @Override
            public String format(final Calendar value) {
                
                return dateTextFormatter.format(value.getTime());
            }
        };
    }
    
    public class CalendarCellConverter extends BaseCellConverter<Calendar> {
        
        private final  DateCellConverterFactory.DateCellConverter dateCellConverter;
        
        private CalendarCellConverter(final FieldAccessor field, final Configuration config,
                final DateCellConverterFactory.DateCellConverter dateCellConverter) {
            super(field, config);
            this.dateCellConverter = dateCellConverter;
        }
        
        @Override
        protected Calendar parseCell(final Cell evaluatedCell, final String formattedValue) throws TypeBindException {
            
            Date date = dateCellConverter.parseCell(evaluatedCell, formattedValue);
            if(date != null) {
                Calendar cal= Calendar.getInstance();
                cal.setTime(date);
                
                return cal;
            }
            
            return null;
        }
        
        @Override
        protected void setupCell(final Cell cell, final Optional<Calendar> cellValue) throws TypeBindException {
            
            Optional<Date> dateCellValue = cellValue.map(c -> c.getTime());
            dateCellConverter.setupCell(cell, dateCellValue);
        }
        
    }
}