package org.supercsv.cellprocessor; import org.supercsv.cellprocessor.ift.BoolCellProcessor; import org.supercsv.cellprocessor.ift.StringCellProcessor; import org.supercsv.exception.NullInputException; import org.supercsv.exception.SuperCSVException; import org.supercsv.util.CSVContext; /** * Convert a string to a boolean. The strings "true", "false", "0", "1", "N", "Y", "F", "T" are the default accepted * strings. Other string values may be provided to represent true and false values. * * @author Kasper B. Graversen * @author Dominique De Vito * @since 1.0 */ public class ParseBool extends CellProcessorAdaptor implements StringCellProcessor { private static String[] DEFAULT_TRUE_VALUES = new String[] { "1", "true", "t", "y" }; private static String[] DEFAULT_FALSE_VALUES = new String[] { "0", "false", "f", "n" }; private final String[] trueValues; private final String[] falseValues; public ParseBool() { this(DEFAULT_TRUE_VALUES, DEFAULT_FALSE_VALUES); } public ParseBool(final BoolCellProcessor next) { this(DEFAULT_TRUE_VALUES, DEFAULT_FALSE_VALUES, next); } public ParseBool(final String trueValue, final String falseValue) { super(); this.trueValues = new String[] { trueValue }; this.falseValues = new String[] { falseValue }; } public ParseBool(final String[] trueValues, final String[] falseValues) { super(); this.trueValues = trueValues; this.falseValues = falseValues; } public ParseBool(final String trueValue, final String falseValue, final BoolCellProcessor next) { super(next); this.trueValues = new String[] { trueValue }; this.falseValues = new String[] { falseValue }; } public ParseBool(final String[] trueValues, final String[] falseValues, final BoolCellProcessor next) { super(next); this.trueValues = trueValues; this.falseValues = falseValues; } /** * {@inheritDoc} * * @throws SuperCSVException * when the value is some value that cannot be translated into a boolean value */ @Override public Object execute(final Object value, final CSVContext context) throws SuperCSVException { if( value == null ) { throw new NullInputException("Input cannot be null on line " + context.lineNumber + " column " + context.columnNumber, context, this); } Boolean result; final String sval = ((String) value).toLowerCase(); if( isFalseValue(sval) ) { result = Boolean.FALSE; } else if( isTrueValue(sval) ) { result = Boolean.TRUE; } else { throw new SuperCSVException("Cannot parse \"" + value + "\" to a boolean on line " + context.lineNumber + " column " + context.columnNumber, context, this); } return next.execute(result, context); } private boolean isTrueValue(final String sval) { return indexOf(sval, trueValues) >= 0; } private boolean isFalseValue(final String sval) { return indexOf(sval, falseValues) >= 0; } private static int indexOf(final String sval, final String[] possibleMatches) { if( possibleMatches == null ) { return -1; } for( int i = 0; i < possibleMatches.length; i++ ) { if( sval.equals(possibleMatches[i]) ) { return i; } } return -1; } }