package org.atdl4j.data.validation; import java.math.BigDecimal; import java.math.BigInteger; import java.util.Map; import org.apache.log4j.Logger; import org.atdl4j.config.InputAndFilterData; import org.atdl4j.data.ValidationRule; import org.atdl4j.data.exception.ValidationException; import org.atdl4j.fixatdl.flow.StateRuleT; import org.atdl4j.fixatdl.validation.OperatorT; import org.atdl4j.ui.Atdl4jWidget; import org.atdl4j.ui.impl.AbstractHiddenFieldWidget; /** * Validator that validates input against another existing field. * * @author renato.gallart * @author john.shields */ public class Field2OperatorValidationRule extends AbstractOperatorValidationRule { private static final Logger logger = Logger.getLogger(Field2OperatorValidationRule.class); private String field; private OperatorT operator; private String field2; private Object parent; // Can be either StrategyEdit or StateRule public Field2OperatorValidationRule(String field, OperatorT operator, String field2, Object parent) { this.field = field; this.operator = operator; this.field2 = field2; this.parent = parent; String tempMsg = "Field2OperatorValidationRule constructor: field: " + field + " operator: " + operator + " field2: " + field2 + " parent: " + parent; logger.debug( tempMsg ); logger.trace( tempMsg, new Exception("Stack trace") ); } public void validate(Map<String, ValidationRule> rules, Map<String, Atdl4jWidget<?>> targets) throws ValidationException { // get the widget from context using field name Atdl4jWidget<?> target = targets.get(field); if (target == null) { String tempMsg = "No parameter defined for field \"" + field + "\" in this context (Field2OperatorValidationRule) field: " + field + " operator: " + operator + " field2: " + field2 + " parent: " + parent; String tempMsg2 = tempMsg + " targets: " + targets; logger.debug( tempMsg2 ); logger.trace( tempMsg2, new Exception("Stack trace") ); throw new ValidationException( null, tempMsg ); } Object fieldValue = parent instanceof StateRuleT ? target.getControlValue() : target.getParameterValue(); // get the widget from context using field2 name Atdl4jWidget<?> target2 = targets.get(field2); if (target2 == null) { String tempMsg = "No parameter defined for field \"" + field2 + "\" in this context (Field2OperatorValidationRule) field: " + field + " operator: " + operator + " field2: " + field2 + " parent: " + parent; String tempMsg2 = tempMsg + " targets: " + targets; logger.debug( tempMsg2 ); logger.trace( tempMsg2, new Exception("Stack trace") ); throw new ValidationException( null, tempMsg ); } Object fieldValue2 = parent instanceof StateRuleT ? target2.getControlValue() : target2.getParameterValue(); // -- handles converting data type to "expected" for FIX_ "standard" input values -- if ( ( fieldValue != null ) && ( fieldValue2 != null ) && ( fieldValue.getClass() != fieldValue2.getClass() ) ) { if ( field.startsWith( InputAndFilterData.FIX_DEFINED_FIELD_PREFIX ) ) { fieldValue = convertFieldValueToDesiredType( fieldValue2, fieldValue ); } else if ( field2.startsWith( InputAndFilterData.FIX_DEFINED_FIELD_PREFIX ) ) { fieldValue2 = convertFieldValueToDesiredType( fieldValue, fieldValue2 ); } else if ( ( target != null ) && ( target instanceof AbstractHiddenFieldWidget ) ) { fieldValue = convertFieldValueToDesiredType( fieldValue2, fieldValue ); } else if ( ( target2 != null ) && ( target2 instanceof AbstractHiddenFieldWidget ) ) { fieldValue2 = convertFieldValueToDesiredType( fieldValue, fieldValue2 ); } } // compare both values validateValues(target, fieldValue, operator, fieldValue2); } public String getField() { return field; } public String getField2() { return field2; } public static Object convertFieldValueToDesiredType( Object aFieldWithDesiredType, Object aFieldValue ) { if ( aFieldWithDesiredType instanceof String ) { return aFieldValue.toString(); } else if( aFieldWithDesiredType instanceof BigDecimal ) { return new BigDecimal( aFieldValue.toString() ); } else if( aFieldWithDesiredType instanceof BigInteger ) { return new BigInteger( aFieldValue.toString() ); } else if( aFieldWithDesiredType instanceof Double ) { return new Double( aFieldValue.toString() ); } else if( aFieldWithDesiredType instanceof Integer ) { return new Integer( aFieldValue.toString() ); } else { logger.warn( "convertFieldValueToDesiredType() unhandled Class type: " + aFieldWithDesiredType.getClass().getName() ); return aFieldValue; } } }