package com.tesora.dve.variables; /* * #%L * Tesora Inc. * Database Virtualization Engine * %% * Copyright (C) 2011 - 2014 Tesora Inc. * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License, version 3, * 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * #L% */ import java.sql.Types; import java.util.HashSet; import java.util.Set; import org.apache.commons.lang.BooleanUtils; import com.tesora.dve.errmap.AvailableErrors; import com.tesora.dve.errmap.ErrorInfo; import com.tesora.dve.exceptions.PEException; import com.tesora.dve.variables.ResultCollector.ResultCollectorFactory; import com.tesora.dve.sql.SchemaException; public class BooleanValueConverter extends ValueMetadata<Boolean> { public static enum BooleanToStringConverter { YES_NO_CONVERTER { @Override protected String convert(final boolean in) { return BooleanUtils.toStringYesNo(in); } }, ON_OFF_CONVERTER { @Override protected String convert(final boolean in) { return BooleanUtils.toStringOnOff(in); } }, BINARY_CONVERTER { @Override protected String convert(boolean in) { return String.valueOf(BooleanUtils.toInteger(in)); } }; public final String getStringValue(final Boolean in) { return convert(getNullSafeToBoolean(in)).toUpperCase(); } protected abstract String convert(final boolean in); private boolean getNullSafeToBoolean(final Boolean in) { return BooleanUtils.toBoolean(in); } } @SuppressWarnings("serial") private final static Set<String> trueMap = new HashSet<String>(){{ add("true"); add("yes"); add("on"); add("1"); }}; @SuppressWarnings("serial") private final static Set<String> falseMap = new HashSet<String>(){{ add("false"); add("no"); add("off"); add("0"); }}; private final BooleanToStringConverter toStringConverter; public BooleanValueConverter(final BooleanToStringConverter converter) { this.toStringConverter = converter; } @Override public Boolean convertToInternal(String varName, String in) throws PEException { String lc = in.trim().toLowerCase(); if (trueMap.contains(lc)) return true; if (falseMap.contains(lc)) return false; throw new SchemaException(new ErrorInfo(AvailableErrors.WRONG_VALUE_FOR_VARIABLE, varName, lc)); } @Override public String convertToExternal(Boolean in) { return BooleanToStringConverter.BINARY_CONVERTER.getStringValue(in); } @Override public ResultCollector getValueAsResult(Boolean in) throws PEException { return ResultCollectorFactory.getInstance(Types.BOOLEAN, in); } @Override public boolean isNumeric() { return false; } @Override public String getTypeName() { return "boolean"; } @Override public String toRow(Boolean in) { return toStringConverter.getStringValue(in); } }