package org.atdl4j.data.validation; 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; /** * Validator that validates input against a constant value. * * @author renato.gallart */ public class ValueOperatorValidationRule extends AbstractOperatorValidationRule { private static final Logger logger = Logger.getLogger( ValueOperatorValidationRule.class ); private String field; private OperatorT operator; private String value; private Object parent; // Can be either StrategyEdit or StateRule public ValueOperatorValidationRule(String field, OperatorT operator, String value, Object parent) { this.field = field; this.operator = operator; this.value = value; this.parent = parent; String tempMsg = "ValueOperatorValidationRule constructor: field: " + field + " operator: " + operator + " value: " + value + " parent: " + parent; logger.debug( tempMsg ); logger.trace( tempMsg, new Exception( "Stack trace" ) ); } public void validate(Map<String, ValidationRule> refRules, Map<String, Atdl4jWidget<?>> targets) throws ValidationException { // get the widget from context using field name Atdl4jWidget<?> target = targets.get( field ); if ( target == null ) { // -- Handle "FIX_fieldname" of "NX" -- if ( ( field != null ) && ( field.startsWith( InputAndFilterData.FIX_DEFINED_FIELD_PREFIX ) )&& ( operator == OperatorT.NX ) ) { logger.debug( "Special handling to accept NOT EXISTS (\"NX\") check for FIX_DEFINED_FIELD_PREFIX field: " + field + " avoiding: \"No parameter defined for field\"."); return; } String tempMsg = "No parameter defined for field \"" + field + "\" in this context (ValueOperatorValidationRule) field: " + field + " operator: " + operator + " value: " + value + " parent: " + parent + " refRules: " + refRules; 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.getControlValueAsComparable() : * target.getParameterValueAsComparable(); // 2/1/2010 Scott Atwell * (handle StateRule specifying "0" vs. displayed "0.00") Object v = value * != null ? target.convertStringToComparable(value) : null; * * AbstractAtdl4jWidget had (thus returning Parameter value even when we are * comparing against Control's value for StateRuleT (divided it into two * methods): public Comparable<?> convertStringToComparable(String string) * throws JAXBException { if (parameterConverter != null) return * parameterConverter.convertValueToComparable(string); else return * controlConverter.convertValueToComparable(string); } **/ Object fieldValue; Object v; if ( parent instanceof StateRuleT ) // Uses Control "display" values { fieldValue = target.getControlValueAsComparable(); v = target.convertStringToControlComparable( value ); } else // StrategyEditT uses Parameter values { fieldValue = target.getParameterValueAsComparable(); v = target.convertParameterStringToParameterComparable( value ); } validateValues( target, fieldValue, operator, v ); } public String getField() { return field; } /** * @return the operator */ public OperatorT getOperator() { return this.operator; } /** * @return the value */ public String getValue() { return this.value; } }