All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.supercsv.ext.builder.impl.BooleanCellProcessorBuilder Maven / Gradle / Ivy

Go to download

CSVのJavaライブラリであるSuperCSVに、アノテーション機能を追加したライブラリです。

There is a newer version: 2.3
Show newest version
package org.supercsv.ext.builder.impl;

import java.lang.annotation.Annotation;
import java.util.Optional;

import org.supercsv.cellprocessor.FmtBool;
import org.supercsv.cellprocessor.ift.BoolCellProcessor;
import org.supercsv.cellprocessor.ift.CellProcessor;
import org.supercsv.cellprocessor.ift.StringCellProcessor;
import org.supercsv.ext.annotation.CsvBooleanConverter;
import org.supercsv.ext.annotation.CsvColumn;
import org.supercsv.ext.builder.AbstractCellProcessorBuilder;
import org.supercsv.ext.cellprocessor.ParseBoolean;
import org.supercsv.ext.exception.SuperCsvInvalidAnnotationException;
import org.supercsv.ext.util.Utils;


/**
 * boolean/Boolean型を{@link CellProcessor}を組み立てるためのクラス。
 * 
 * @version 1.2
 * @author T.TSUCHIE
 *
 */
public class BooleanCellProcessorBuilder extends AbstractCellProcessorBuilder {
    
    @Override
    protected CellProcessor buildInputCellProcessorWithConvertNullTo(final Class type, final Annotation[] annos,
            final CellProcessor cellProcessor, final CsvColumn csvColumnAnno) {
        
        // プリミティブ型の場合、オプションかつ初期値が与えられていない場合、falseに変換する。
        if(type.isPrimitive() && csvColumnAnno.optional() && csvColumnAnno.inputDefaultValue().isEmpty()) {
            return prependConvertNullToProcessor(type, annos, cellProcessor, false);
            
        } else if(!csvColumnAnno.inputDefaultValue().isEmpty()) {
            Optional value = parseValue(type, annos, csvColumnAnno.inputDefaultValue());
            return prependConvertNullToProcessor(type, annos, cellProcessor, value.get());
        }
        
        return cellProcessor;
    }
    
    /**
     * アノテーション{@link CsvBooleanConverter} を取得する。
     * @param annos アノテーションの一覧
     * @return アノテーションがない場合は空を返す。
     */
    protected Optional getBooleanConverterAnnotation(final Annotation[] annos) {
        
        return getAnnotation(annos, CsvBooleanConverter.class);
        
    }
    
    /**
     * trueの値を出力するときの文字列を取得する。
     * @param converterAnno 変換規則を定義したアノテーション。
     * @return アノテーションがない場合は、デフォルト値を返す。
     */
    protected String getOutputTrueValue(final Optional converterAnno) {
        
        return converterAnno.map(a -> a.outputTrueValue())
                .orElse("true");
    }
    
    /**
     * falseの値を出力するときの文字列を取得する。
     * @param converterAnno 変換規則を定義したアノテーション。
     * @return アノテーションがない場合は、デフォルト値を返す。
     */
    protected String getOutputFalseValue(final Optional converterAnno) {
        
        return converterAnno.map(a -> a.outputFalseValue())
                .orElse("false");
        
    }
    
    /**
     * trueの値として読み込む文字列の候補を取得する。
     * @param converterAnno 変換規則を定義したアノテーション。
     * @return アノテーションがない場合は、デフォルト値を返す。
     */
    protected String[] getInputTrueValue(final Optional converterAnno) {
        
        return converterAnno.map(a -> a.inputTrueValue())
                .orElse(new String[]{"true", "1", "yes", "on", "y", "t"});
        
    }
    
    /**
     * falseの値として読み込む文字列の候補を取得する。
     * @param converterAnno 変換規則を定義したアノテーション。
     * @return アノテーションがない場合は、デフォルト値を返す。
     */
    protected String[] getInputFalseValue(final Optional converterAnno) {
        
        return converterAnno.map(a -> a.inputFalseValue())
                .orElse(new String[]{"false", "0", "no", "off", "f", "n"});
        
    }
    
    /**
     * 大文字・小文字を無視して読み込むかの設定を取得する。
     * @param converterAnno 変換規則を定義したアノテーション。
     * @return trueの場合、大文字・小文字を無視して読み込む。
     */
    protected boolean getIgnoreCase(final Optional converterAnno) {
        
        return converterAnno.map(a -> a.ignoreCase())
                .orElse(false);
    }
    
    /**
     * 読み込み時に候補値に一致しない場合に、falseとして読み込むかの設定を取得する。
     * @param converterAnno 変換規則を定義したアノテーション。
     * @return trueの場合、大文字・小文字を無視して読み込む。
     */
    protected boolean getFailToFalse(final Optional converterAnno) {
        
        return converterAnno.map(a -> a.failToFalse())
                .orElse(false);
    }
    
    @Override
    public CellProcessor buildOutputCellProcessor(final Class type, final Annotation[] annos,
            final CellProcessor processor, final boolean ignoreValidationProcessor) {
        
        final Optional converterAnno = getBooleanConverterAnnotation(annos);
        final String trueValue = getOutputTrueValue(converterAnno);
        final String falseValue = getOutputFalseValue(converterAnno);
        
        CellProcessor cp = processor;
        cp = (cp == null 
                ? new FmtBool(trueValue, falseValue) : new FmtBool(trueValue, falseValue, (StringCellProcessor) cp));
        return cp;
        
    }
    
    @Override
    public CellProcessor buildInputCellProcessor(final Class type, final Annotation[] annos,
            final CellProcessor processor) {
        
        final Optional converterAnno = getBooleanConverterAnnotation(annos);
        final String[] trueValue = getInputTrueValue(converterAnno);
        final String[] falseValue = getInputFalseValue(converterAnno);
        final boolean ignoreCase = getIgnoreCase(converterAnno);
        final boolean failToFalse = getFailToFalse(converterAnno);
        
        CellProcessor cp = processor;
        cp = (cp == null
                ? new ParseBoolean(trueValue, falseValue, ignoreCase).setFailToFalse(failToFalse) :
                    new ParseBoolean(trueValue, falseValue, ignoreCase, (BoolCellProcessor) cp).setFailToFalse(failToFalse));
        
        return cp;
    }
    
    @Override
    public Optional parseValue(final Class type, final Annotation[] annos, final String strValue) {
        
        final Optional converterAnno = getBooleanConverterAnnotation(annos);
        final String[] trueValue = getInputTrueValue(converterAnno);
        final String[] falseValue = getInputFalseValue(converterAnno);
        final boolean ignoreCase = getIgnoreCase(converterAnno);
        final boolean failToFalse = getFailToFalse(converterAnno);
        
        for(String trueStr : trueValue) {
            if(ignoreCase && trueStr.equalsIgnoreCase(strValue)) {
                return Optional.of(Boolean.TRUE);
            } else if(!ignoreCase && trueStr.equals(strValue)) {
                return Optional.of(Boolean.TRUE);
            }
        }
        
        for(String falseStr : falseValue) {
            if(ignoreCase && falseStr.equalsIgnoreCase(strValue)) {
                return Optional.of(Boolean.FALSE);
            } else if(!ignoreCase && falseStr.equals(strValue)) {
                return Optional.of(Boolean.FALSE);
            }
        }
        
        if(Utils.isEmpty(strValue) && type.isAssignableFrom(Boolean.class)) {
            return Optional.empty();
        }
        
        if(failToFalse) {
            return Optional.of(Boolean.FALSE);
        }
        
        throw new SuperCsvInvalidAnnotationException(String.format("defaultValue '%s' cannot parse.", strValue));
    }
    
    
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy