/**
* 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 );
}
}
}