package org.atdl4j.data.validation;
import java.util.Map;
import org.atdl4j.data.ValidationRule;
import org.atdl4j.data.exception.FIXatdlFormatException;
import org.atdl4j.fixatdl.validation.EditRefT;
import org.atdl4j.fixatdl.validation.EditT;
import org.atdl4j.fixatdl.validation.LogicOperatorT;
import org.atdl4j.fixatdl.validation.OperatorT;
public abstract class ValidationRuleFactory
{
// TODO: refactor so outer method adds to refRules, not inner
public static ValidationRule createRule(EditT edit, Map<String, ValidationRule> refRules, Object parent) throws FIXatdlFormatException
{
if ( edit.getLogicOperator() != null )
{
// edit represents a logical operator [AND|OR|NOT|XOR]
LogicOperatorT operator = edit.getLogicOperator();
LogicalOperatorValidationRule rule = new LogicalOperatorValidationRule( operator, parent );
if ( edit.getId() != null )
refRules.put( edit.getId(), rule );
if ( edit.getEdit() != null )
{
for ( EditT innerEdit : edit.getEdit() )
{
ValidationRule innerRule = createRule( innerEdit, refRules, parent );
rule.addRule( innerRule );
}
}
if ( edit.getEditRef() != null )
{
for ( EditRefT innerRefEdit : edit.getEditRef() )
{
rule.addRule( createRule( innerRefEdit ) );
}
}
return rule;
}
else if ( edit.getOperator() != null )
{
// edit represents a simple operator [EX|NX|EQ|LT|GT|NE|LE|GE]
OperatorT operator = edit.getOperator();
if ( edit.getField() != null )
{
String field = edit.getField();
if ( edit.getValue() != null )
{
// validates against a constant value
String value = edit.getValue();
ValidationRule rule = new ValueOperatorValidationRule( field, operator, value, parent );
if ( edit.getId() != null )
refRules.put( edit.getId(), rule );
return rule;
}
else if ( edit.getField2() != null )
{
// validates against another field value
String field2 = edit.getField2();
ValidationRule rule = new Field2OperatorValidationRule( field, operator, field2, parent );
if ( edit.getId() != null )
refRules.put( edit.getId(), rule );
return rule;
}
else
{
// must be EX or NX
if ( operator == OperatorT.EX || operator == OperatorT.NX )
{
ValidationRule rule = new ValueOperatorValidationRule( field, operator, null, parent );
if ( edit.getId() != null )
refRules.put( edit.getId(), rule );
return rule;
}
else
{
throw new FIXatdlFormatException( "Operator must be EX or NX when there is no \"value\" of \"field2\" attribute" );
}
}
}
else
{
throw new FIXatdlFormatException( "No field set for edit \"" + edit.getId() + "\"" );
}
}
else
{
throw new FIXatdlFormatException( "No logic operator or operator set for edit \"" + edit.getId() + "\"" );
}
}
public static ValidationRule createRule(EditRefT editRef) throws FIXatdlFormatException
{
if ( editRef.getId() != null )
{
String id = editRef.getId();
return new ReferencedValidationRule( id );
}
else
{
throw new FIXatdlFormatException( "EditRef without an id" );
}
}
}