ch.sdi.core.impl.data.converter.ConverterBoolean.java Source code

Java tutorial

Introduction

Here is the source code for ch.sdi.core.impl.data.converter.ConverterBoolean.java

Source

/**
 * Copyright (c) 2015 by the original author or authors.
 *
 * This code is free software; you can redistribute it and/or modify it under the terms of the
 * GNU Lesser General Public License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * The above copyright notice and this permission notice shall be included in all copies or
 * substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

package ch.sdi.core.impl.data.converter;

import java.util.HashSet;
import java.util.Set;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.convert.ConversionService;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import ch.sdi.core.annotations.SdiConverter;
import ch.sdi.core.exc.SdiException;
import ch.sdi.core.intf.FieldConverter;
import ch.sdi.core.intf.SdiMainProperties;

/**
 * Converter for converting parsed strings into a Boolean object.
 * <p>
 * This converter has optional parameters;
 * <pre>
 *    sdi.converter.toBoolean.trueValues =
 *    or
 *    sdi.converter.toBoolean.falseValues =
 * </pre>
 * Both are comma separated lists of additional true/false values.
 * <p>
 * The converter uses springs ConversionService for the built in values:
 * True values: true, on, yes, 1
 * False values: false, off, no, 0
 * <p>
 * The parsed additional parameters are truncated and converted to lower case. This is also done for the
 * values passed to the convert method.
 *
 * @version 1.0 (23.01.2015)
 * @author  Heri
 */
@SdiConverter(ConverterBoolean.CONVERTER_NAME)
@Component
public class ConverterBoolean implements FieldConverter<Boolean> {

    /** logger for this class */
    private Logger myLog = LogManager.getLogger(ConverterBoolean.class);

    public static final String CONVERTER_NAME = "toBoolean";
    public static final String KEY_TRUE_VALUES = "trueValues";
    public static final String KEY_FALSE_VALUES = "falseValues";

    @Autowired
    private ConversionService myConversionService;
    private static final Set<String> trueValues = new HashSet<String>(4);
    private static final Set<String> falseValues = new HashSet<String>(4);

    /**
     * @see ch.sdi.core.intf.FieldConverter#init(org.springframework.core.env.Environment, java.lang.String)
     */
    @Override
    public FieldConverter<Boolean> init(Environment aEnv, String aFieldname) throws SdiException {
        resolveConfiguredValues(aEnv, trueValues, KEY_TRUE_VALUES);
        resolveConfiguredValues(aEnv, falseValues, KEY_FALSE_VALUES);
        return this;
    }

    /**
     * Clears the given list and fills it with found configured values according the given key
     * <p>
     * @param aEnv
     * @param aValuesToFill
     * @param aKey
     *        either "trueValues" or "falseValues"
     */
    private void resolveConfiguredValues(Environment aEnv, Set<String> aValuesToFill, String aKey) {
        aValuesToFill.clear();
        String key = SdiMainProperties.KEY_PREFIX_CONVERTER + CONVERTER_NAME + "." + aKey;
        String values = aEnv.getProperty(key);
        if (!StringUtils.hasText(values)) {
            myLog.debug("No configured values found for key " + key);
            return;
        } // if !StringUtils.hasText( values )

        String[] split = values.split(",");
        for (String value : split) {
            if (!StringUtils.hasText(value)) {
                continue;
            } // if !StringUtils.hasText( value )

            value = value.trim().toLowerCase();
            myLog.debug("Found configured value (aKey): " + value);
            aValuesToFill.add(value);
        }
    }

    /**
     * @see ch.sdi.core.intf.FieldConverter#convert(java.lang.String)
     */
    @Override
    public Boolean convert(String aValue) throws SdiException {
        if (!StringUtils.hasText(aValue)) {
            myLog.debug("Given value is null");
            return null;
        }

        String value = aValue.trim().toLowerCase();

        if (trueValues.contains(value)) {
            return Boolean.TRUE;
        } // if

        if (falseValues.contains(value)) {
            return Boolean.FALSE;
        } // if

        try {
            return myConversionService.convert(value, Boolean.class);
        } catch (Throwable t) {
            throw new SdiException("Problems converting boolean value " + aValue, t,
                    SdiException.EXIT_CODE_CONFIG_ERROR);
        }
    }

}