package org.atdl4j.data.converter;
import java.math.BigDecimal;
import org.atdl4j.data.ParameterTypeConverter;
import org.atdl4j.fixatdl.core.MultipleCharValueT;
import org.atdl4j.fixatdl.core.MultipleStringValueT;
import org.atdl4j.fixatdl.core.ParameterT;
public class StringConverter
extends AbstractTypeConverter<String>
{
public StringConverter(ParameterT aParameter)
{
super( aParameter );
}
public StringConverter(ParameterTypeConverter<?> aParameterTypeConverter)
{
super( aParameterTypeConverter );
}
private static String invertOnWire(String text)
{
StringBuffer invertedString = new StringBuffer();
int startIndex = text.lastIndexOf( " " );
int endIndex = text.length();
do
{
invertedString.append( text.substring( startIndex + 1, endIndex ) );
if ( startIndex == -1 )
{
return invertedString.toString();
}
else
{
invertedString.append( " " );
}
endIndex = startIndex;
startIndex = ( text.substring( 0, endIndex ) ).lastIndexOf( " " );
}
while ( endIndex != -1 );
return invertedString.toString();
}
protected String convertValueToComparable(Object value)
{
return ( value == null || "".equals( value ) ) ? null : value.toString();
}
/* Handles de-inverting FixWireValue for Parameter value if applicable.
* @see org.atdl4j.data.ParameterTypeConverter#convertFixWireValueToParameterValue(java.lang.String)
*/
@Override
public Object convertFixWireValueToParameterValue(String aFixWireValue)
{
String str = convertStringToParameterValue( aFixWireValue );
if ( getParameter() instanceof MultipleCharValueT && ( (MultipleCharValueT) getParameter() ).isInvertOnWire() )
{
return invertOnWire( str );
}
else if ( getParameter() instanceof MultipleStringValueT && ( (MultipleStringValueT) getParameter() ).isInvertOnWire() )
{
return invertOnWire( str );
}
return str;
}
/* (non-Javadoc)
* @see org.atdl4j.data.ParameterTypeConverter#convertParameterStringToParameterValue(java.lang.String)
*/
@Override
public Object convertParameterStringToParameterValue(String aParameterString)
{
return convertStringToParameterValue( aParameterString );
}
/**
* Supports either FixWireValue or ParameterString values
* @param aValue
* @return
*/
protected String convertStringToParameterValue(String aValue)
{
if ( ( aValue != null ) && ( ! "".equals( aValue ) ) )
{
return aValue.toString();
}
else
{
return null;
}
}
/* Handles inverting ParameterValue when building FixWireValue if applicable.
* @see org.atdl4j.data.ParameterTypeConverter#convertParameterValueToFixWireValue(java.lang.Object)
*/
@Override
public String convertParameterValueToFixWireValue(Object aParameterValue)
{
String str = convertParameterValueToParameterComparable( aParameterValue );
if ( str != null )
{
if ( getParameter() instanceof MultipleCharValueT && ( (MultipleCharValueT) getParameter() ).isInvertOnWire() )
{
return invertOnWire( str );
}
else if ( getParameter() instanceof MultipleStringValueT && ( (MultipleStringValueT) getParameter() ).isInvertOnWire() )
{
return invertOnWire( str );
}
else
{
return str;
}
}
else
{
return null;
}
}
/* (non-Javadoc)
* @see org.atdl4j.data.ParameterTypeConverter#convertParameterValueToParameterComparable(java.lang.Object)
*/
@Override
public String convertParameterValueToParameterComparable(Object aParameterValue)
{
return convertValueToComparable( aParameterValue );
}
/* (non-Javadoc)
* @see org.atdl4j.data.ControlTypeConverter#convertControlValueToControlComparable(java.lang.Object)
*/
@Override
public String convertControlValueToControlComparable(Object aValue)
{
return convertValueToComparable( aValue );
}
/*
* Special handling for isControlMultiplyBy100() as aValue is converted to
* BigDecimal and divided by 100, otherwise returns aValue.
* @see org.atdl4j.data.ControlTypeConverter#convertControlValueToParameterValue(java.lang.Object)
*/
@Override
public Object convertControlValueToParameterValue(Object aValue)
{
// -- handle PercentageT getParameter() coming through as String (eg minValue, maxValue) --
if ( ( aValue != null ) && ( isControlMultiplyBy100() ) )
{
BigDecimal tempBigDecimal;
try
{
tempBigDecimal = DatatypeConverter.convertValueToBigDecimalDatatype( aValue );
}
catch (NumberFormatException e)
{
throw new NumberFormatException( "Invalid Decimal Number Format: [" + aValue + "] for Parameter: " + getParameterName() );
}
// -- Divide Control's value by 100 --
tempBigDecimal = tempBigDecimal.scaleByPowerOfTen( -2 );
return tempBigDecimal;
}
else
{
// -- aDatatypeIfNull=DatatypeConverter.DATATYPE_STRING --
return DatatypeConverter.convertValueToDatatype( aValue, getParameterDatatype( String.class ) );
}
}
/* (non-Javadoc)
* @see org.atdl4j.data.ControlTypeConverter#convertParameterValueToControlValue(java.lang.Object)
*/
@Override
public String convertParameterValueToControlValue(Object aValue)
{
if ( ( aValue == null ) || ( "".equals( aValue ) ) )
{
return null;
}
// -- handle PercentageT getParameter() coming through with BigDecial (eg from Load FIX Message) --
else if ( ( aValue != null ) && ( isControlMultiplyBy100() ) )
{
BigDecimal tempBigDecimal;
try
{
if ( aValue instanceof BigDecimal )
{
tempBigDecimal = (BigDecimal) aValue;
}
else
{
tempBigDecimal = new BigDecimal( (String) aValue );
}
}
catch (NumberFormatException e)
{
throw new NumberFormatException( "Invalid Decimal Number Format: [" + aValue + "] for Parameter: " + getParameterName() );
}
// -- Multiply Control's value by 100 --
tempBigDecimal = tempBigDecimal.scaleByPowerOfTen( 2 );
return tempBigDecimal.toString();
}
else
{
return DatatypeConverter.convertValueToStringDatatype( aValue );
}
}
/* (non-Javadoc)
* @see org.atdl4j.data.ControlTypeConverter#convertStringToControlValue(java.lang.String)
*/
@Override
public String convertStringToControlValue(String aString)
{
return convertControlValueToControlComparable( aString );
}
}