package org.atdl4j.data.converter;
import org.apache.log4j.Logger;
import org.atdl4j.data.ControlTypeConverter;
import org.atdl4j.data.ParameterHelper;
import org.atdl4j.data.ParameterTypeConverter;
import org.atdl4j.data.TypeConverterFactory;
import org.atdl4j.data.TypeConverterFactoryConfig;
import org.atdl4j.fixatdl.core.EnumPairT;
import org.atdl4j.fixatdl.core.ParameterT;
import org.atdl4j.fixatdl.core.PercentageT;
import org.atdl4j.fixatdl.layout.CheckBoxT;
import org.atdl4j.fixatdl.layout.ControlT;
/**
* Base class for ParameterTypeConverter and ControlTypeConverter interfaces
*
* @author john.shields
*/
public abstract class AbstractTypeConverter<E extends Comparable<?>>
implements ParameterTypeConverter<E>, ControlTypeConverter<E>
{
private ParameterT parameter; // used by ParameterTypeConverter
private ParameterTypeConverter<?> parameterTypeConverter; // used by ControlTypeConverter
private static final Logger logger = Logger.getLogger(ParameterTypeConverter.class);
/**
* Used to construct instances of ControlTypeConverter.
* @param aParameter
*/
public AbstractTypeConverter(ParameterT aParameter)
{
setParameter( aParameter );
}
/**
* Used to construct instances of ControlTypeConverter.
* @param aParameterTypeConverter
*/
public AbstractTypeConverter(ParameterTypeConverter<?> aParameterTypeConverter)
{
setParameterTypeConverter( aParameterTypeConverter );
}
protected void setParameter( ParameterT aParameter )
{
this.parameter = aParameter;
}
public ParameterT getParameter()
{
return parameter;
}
protected String getParameterName()
{
if ( getParameter() != null )
{
return getParameter().getName();
}
else if ( ( getParameterTypeConverter() != null ) && ( getParameter() != null ) )
{
return getParameterTypeConverter().getParameter().getName();
}
else
{
return null;
}
}
/**
* Returns the value of Parameter.getMultiplyBy100() for PercentageT assuming
* it has been set, otherwise returns false.
*
* @return
*/
public boolean isParameterMultiplyBy100()
{
if ( getParameter() instanceof PercentageT )
{
return ( (PercentageT) getParameter() ).isMultiplyBy100();
}
else
{
// -- Return null if Parameter does not have this value set --
return false;
}
}
/**
* Returns true if Parameter instanceof PercentageT otherwise returns false.
*
* @return
*/
public boolean isControlMultiplyBy100()
{
if ( getParameter() instanceof PercentageT )
{
return true;
}
else if ( ( getParameterTypeConverter() != null ) &&
( getParameterTypeConverter().getParameter() instanceof PercentageT ) )
{
return true;
}
else
{
return false;
}
}
/* (non-Javadoc)
* @see org.atdl4j.data.ParameterTypeConverter#convertParameterValueToComparisonString(java.lang.Object)
*/
@Override
public String convertParameterValueToComparisonString(Object aParameterValue)
{
E tempComparable = convertParameterValueToParameterComparable( aParameterValue );
if ( tempComparable != null )
{
return tempComparable.toString();
}
else
{
return null;
}
}
/**
* @param parameterTypeConverter the parameterTypeConverter to set
*/
protected void setParameterTypeConverter(ParameterTypeConverter<?> parameterTypeConverter)
{
this.parameterTypeConverter = parameterTypeConverter;
}
/**
* @return the parameterTypeConverter
*/
public ParameterTypeConverter<?> getParameterTypeConverter()
{
return parameterTypeConverter;
}
/**
* Part of ControlTypeConverter (if using ParameterTypeConverter use no-arg method).
* Returns an Object that is an instanceof the Parameter's base data type (eg String, BigDecimal, DateTime, etc)
* Returns aDatatypeIfNull if Parameter is null
* @param classIfNull
* @return
*/
public Class<?> getParameterDatatype( Class<?> classIfNull )
{
if ( getParameterTypeConverter() != null )
{
return getParameterTypeConverter().getParameterDatatype();
}
else
{
return classIfNull;
}
}
/**
* Part of ParameterTypeConverter, also supported by ControlTypeConverter.
* Returns an Object that is an instanceof the Parameter's base data type (eg String, BigDecimal, DateTime, etc)
*/
public Class<?> getParameterDatatype()
{
ParameterT tempParameter = getParameter();
if ( ( tempParameter == null ) && ( getParameterTypeConverter() != null ) )
{
tempParameter = getParameterTypeConverter().getParameter();;
}
if ( tempParameter != null )
{
return TypeConverterFactoryConfig.getTypeConverterFactory().getParameterDatatype( tempParameter );
}
else
{
return null;
}
}
/* No conversion applicable for this type. Returns aValue.
* @see org.atdl4j.data.ControlTypeConverter#convertParameterValueToControlValue(java.lang.Object)
*/
@Override
public E convertParameterValueToControlValue(Object aValue, ControlT aControl)
{
Object tempValue = adjustParameterValueForEnumRefValue( aValue, getParameterTypeConverter().getParameter(), aControl );
return convertParameterValueToControlValue( tempValue );
}
public abstract E convertParameterValueToControlValue(Object aValue);
public Object adjustParameterValueForEnumRefValue( Object aParameterValue, ParameterT aParameter, ControlT aControl )
{
logger.debug("aParameterValue: " + aParameterValue + " aParameter: " + aParameter + " aControl: " + aControl );
if ( ( aParameterValue != null ) && ( aParameter != null ) && ( aControl != null ) )
{
if ( aControl instanceof CheckBoxT )
{
CheckBoxT tempCheckBox = (CheckBoxT) aControl;
EnumPairT tempCheckedEnumPair = ParameterHelper.getEnumPairForEnumID( aParameter, tempCheckBox.getCheckedEnumRef() );
EnumPairT tempUncheckedEnumPair = ParameterHelper.getEnumPairForEnumID( aParameter, tempCheckBox.getUncheckedEnumRef() );
String tempParameterValueString = aParameterValue.toString();
logger.debug("tempParameterValueString: " + tempParameterValueString + " tempCheckedEnumPair: " + tempCheckedEnumPair + " tempUncheckedEnumPair: " + tempUncheckedEnumPair );
if ( ( tempCheckedEnumPair != null ) && ( tempParameterValueString.equals( tempCheckedEnumPair.getWireValue() ) ) )
{
return Boolean.TRUE.toString();
}
else if ( ( tempUncheckedEnumPair != null ) && ( tempParameterValueString.equals( tempUncheckedEnumPair.getWireValue() ) ) )
{
return Boolean.FALSE.toString();
}
}
}
return aParameterValue;
}
}