Package org.crank.validation.validators

Source Code of org.crank.validation.validators.CompositeValidator

package org.crank.validation.validators;


import java.util.ArrayList;
import java.util.List;


import org.crank.validation.FieldValidator;
import org.crank.validation.ValidatorMessage;
import org.crank.validation.ValidatorMessageHolder;
import org.crank.validation.ValidatorMessages;


/**
*
* <p>
* Combines a bunch of validators into one.
* </p>
* @author Rick Hightower
*/
public class CompositeValidator implements FieldValidator {
    private List<FieldValidator> validatorList = new ArrayList<FieldValidator>();
    private RequiredValidator requiredValidator = null;
    private List <String> detailArgs;
    private List <String> summaryArgs;
    private String stopOnRule = "";
    private boolean stopOnFirstRule = false;
    private boolean stopOnBlank = true;
   
    public void setValidatorList(List<FieldValidator> list) {
        this.validatorList = list;
        StopOnRuleValidator stopOnRuleValidator = null;
        for (FieldValidator validator : list) {
            if (validator instanceof RequiredValidator) {
                requiredValidator =  (RequiredValidator) validator;
            }
            if (validator instanceof StopOnRuleValidator) {
                stopOnRuleValidator = (StopOnRuleValidator) validator;
            }
        }
       
       
        if (stopOnRuleValidator !=null) {
            validatorList.remove( stopOnRule );
            String ruleName = stopOnRuleValidator.getRuleName();
            if ("first".equals( ruleName ) || ruleName == null) {
                stopOnFirstRule = true;
            } else {
                stopOnRule = ruleName;
            }
        }
        if (requiredValidator != null) {
            validatorList.remove( requiredValidator );
        }
    }

    public ValidatorMessageHolder validate(Object object, String fieldLabel) {
       
        ValidatorMessages messages = new ValidatorMessages(); //holds error messages.
       
        /* Validate with the requiredValidator if it is present. */
        ValidatorMessage requiredMessage = validateWithRequriedIfPresent( object, fieldLabel, messages );

        boolean proceed = !(stopOnBlank && (object == null || object.toString().trim().length() == 0));

        /* If the requiredMessage from the requiredValidator is null, then there was not a required validator present. */
        /* If the requiredMessage is present then check to see if it has errors, only validate further if
         * the requiredMessage has no error. */
        if (requiredMessage == null || !requiredMessage.hasError() ) {
            if (proceed ) {
                runValidationRules( object, fieldLabel, messages );
            }
        }

        return messages;
    }

    private void runValidationRules( Object object, String fieldLabel, ValidatorMessages messages ) {
        for (FieldValidator validator : validatorList) {
            putArgs(validator);
            ValidatorMessage message = (ValidatorMessage) validator.validate(object, fieldLabel);
            if (message.hasError()) {
                messages.add(message);
                if (this.stopOnFirstRule) {
                    break;
                } else if (validator.getClass().getSimpleName().equalsIgnoreCase( stopOnRule ) ){
                    break;
                }
            }
        }
    }

    private ValidatorMessage validateWithRequriedIfPresent( Object object, String fieldLabel, ValidatorMessages messages ) {
        ValidatorMessage requiredMessage = null;
        if (requiredValidator != null) {
            putArgs(requiredValidator);
            requiredMessage = (ValidatorMessage) requiredValidator.validate(object, fieldLabel);
            if (requiredMessage.hasError()) {
                messages.add( requiredMessage );
            }
        }
        return requiredMessage;
    }

    private void putArgs(FieldValidator validator) {
        if (validator instanceof AbstractValidator) {
            AbstractValidator aValidator = (AbstractValidator) validator;
            aValidator.setDetailArgs(this.detailArgs);
            aValidator.setSummaryArgs(this.summaryArgs);
        }
    }


    public void setDetailArgs(List<String> detailArgKeys) {
        this.detailArgs = detailArgKeys;
    }


    public void setSummaryArgs(List<String> summaryArgKeys) {
        this.summaryArgs = summaryArgKeys;
    }

    public void setStopOnBlank( boolean stopOnBlank ) {
        this.stopOnBlank = stopOnBlank;
    }

}
TOP

Related Classes of org.crank.validation.validators.CompositeValidator

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.