boolean validate()

in grails-datastore-gorm-hibernate/src/main/groovy/org/grails/orm/hibernate/AbstractHibernateGormValidationApi.groovy [54:121]


    boolean validate(D instance, List validatedFieldsList, Map arguments = Collections.emptyMap()) {
        Errors errors = setupErrorsProperty(instance);

        Validator validator = getValidator()
        if(validator == null) return true

        Boolean valid = Boolean.TRUE
        // should evict?
        boolean evict = false
        boolean deepValidate = true
        Set validatedFields = null
        if(validatedFieldsList != null) {
            validatedFields = new HashSet(validatedFieldsList)
        }

        if (arguments?.containsKey(ARGUMENT_DEEP_VALIDATE)) {
            deepValidate = ClassUtils.getBooleanFromMap(ARGUMENT_DEEP_VALIDATE, arguments)
        }

        evict = ClassUtils.getBooleanFromMap(ARGUMENT_EVICT, arguments);

        fireEvent instance, validatedFieldsList


        hibernateTemplate.execute { Session session ->

            def previous = readPreviousFlushMode(session)
            applyManualFlush(session)
            try {
                if (validator instanceof CascadingValidator) {
                    ((CascadingValidator)validator).validate instance, errors, deepValidate
                } else if (validator instanceof grails.gorm.validation.CascadingValidator) {
                    ((grails.gorm.validation.CascadingValidator) validator).validate instance, errors, deepValidate
                } else {
                    validator.validate instance, errors
                }
            } finally {
                if(!errors.hasErrors()) {
                    restoreFlushMode(session, previous)
                }
            }

        }


        int oldErrorCount = errors.errorCount
        errors = filterErrors(errors, validatedFields, instance)

        if (errors.hasErrors()) {
            valid = Boolean.FALSE
            if (evict) {
                // if an boolean argument 'true' is passed to the method
                // and validation fails then the object will be evicted
                // from the session, ensuring it is not saved later when
                // flush is called
                if (hibernateTemplate.contains(instance)) {
                    hibernateTemplate.evict(instance)
                }
            }
        }

        // If the errors have been filtered, update the 'errors' object attached to the target.
        if (errors.errorCount != oldErrorCount) {
            setErrors(instance, errors)
        }

        return valid
    }