/** * AnalyzerBeans * Copyright (C) 2014 Neopost - Customer Information Management * * This copyrighted material is made available to anyone wishing to use, modify, * copy, or redistribute it subject to the terms and conditions of the GNU * Lesser General Public License, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution; if not, write to: * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ package org.eobjects.analyzer.beans.convert; import javax.inject.Inject; import org.eobjects.analyzer.beans.api.Alias; import org.eobjects.analyzer.beans.api.Categorized; import org.eobjects.analyzer.beans.api.Configured; import org.eobjects.analyzer.beans.api.Description; import org.eobjects.analyzer.beans.api.OutputColumns; import org.eobjects.analyzer.beans.api.Transformer; import org.eobjects.analyzer.beans.api.TransformerBean; import org.eobjects.analyzer.beans.categories.ConversionCategory; import org.eobjects.analyzer.data.InputColumn; import org.eobjects.analyzer.data.InputRow; /** * Attempts to convert anything to a Boolean value */ @TransformerBean("Convert to boolean") @Description("Converts anything to a boolean (or null).") @Categorized({ ConversionCategory.class }) public class ConvertToBooleanTransformer implements Transformer<Boolean> { public static final String[] DEFAULT_TRUE_TOKENS = new String[] { "true", "yes", "1", "x" }; public static final String[] DEFAULT_FALSE_TOKENS = new String[] { "false", "no", "0", "-" }; @Inject @Configured @Alias("Column") InputColumn<?>[] input; @Configured(required = false) Boolean nullReplacement; @Configured @Description("Text tokens that will translate to 'true'") String[] _trueTokens = DEFAULT_TRUE_TOKENS; @Configured @Description("Text tokens that will translate to 'false'") String[] _falseTokens = DEFAULT_FALSE_TOKENS; public ConvertToBooleanTransformer(InputColumn<?>[] input) { this.input = input; } public ConvertToBooleanTransformer() { this(null); } @Override public OutputColumns getOutputColumns() { String[] names = new String[input.length]; for (int i = 0; i < names.length; i++) { names[i] = input[i].getName() + " (as boolean)"; } return new OutputColumns(names); } @Override public Boolean[] transform(InputRow inputRow) { Boolean[] result = new Boolean[input.length]; for (int i = 0; i < input.length; i++) { Object value = inputRow.getValue(input[i]); Boolean b = transformValue(value, _trueTokens, _falseTokens); if (b == null) { b = nullReplacement; } result[i] = b; } return result; } public static Boolean transformValue(final Object value) { return transformValue(value, DEFAULT_TRUE_TOKENS, DEFAULT_FALSE_TOKENS); } public static Boolean transformValue(final Object value, final String[] trueTokens, final String[] falseTokens) { Boolean b = null; if (value != null) { if (value instanceof String) { String stringValue = (String) value; stringValue = stringValue.trim(); for (String token : trueTokens) { if (token.equalsIgnoreCase(stringValue)) { b = true; break; } } if (b == null) { for (String token : falseTokens) { if (token.equalsIgnoreCase(stringValue)) { b = false; break; } } } } else if (value instanceof Number) { Number numberValue = (Number) value; if (numberValue.intValue() == 1) { b = true; } else if (numberValue.intValue() == 0) { b = false; } } else if (value instanceof Boolean) { b = (Boolean) value; } } return b; } public void setFalseTokens(String[] falseTokens) { _falseTokens = falseTokens; } public String[] getFalseTokens() { return _falseTokens; } public void setInput(InputColumn<?>... input) { this.input = input; } public InputColumn<?>[] getInput() { return input; } public void setNullReplacement(Boolean nullReplacement) { this.nullReplacement = nullReplacement; } public Boolean getNullReplacement() { return nullReplacement; } public void setTrueTokens(String[] trueTokens) { _trueTokens = trueTokens; } public String[] getTrueTokens() { return _trueTokens; } }