package org.javabuilders.handler.validation; import java.util.LinkedList; import java.util.List; import org.javabuilders.BuildException; import org.javabuilders.BuildResult; import org.javabuilders.handler.validation.validator.DateFormatValidator; import org.javabuilders.handler.validation.validator.EmailAddressValidator; import org.javabuilders.handler.validation.validator.MandatoryValidator; import org.javabuilders.handler.validation.validator.MaxLengthValidator; import org.javabuilders.handler.validation.validator.MaxValueValidator; import org.javabuilders.handler.validation.validator.MinLengthValidator; import org.javabuilders.handler.validation.validator.MinValueValidator; import org.javabuilders.handler.validation.validator.RegexValidator; import org.javabuilders.handler.validation.validator.TypeValidator; import org.javabuilders.util.PropertyUtils; /** * A collection of validators for a build file * @author Jacek Furmankiewicz */ @SuppressWarnings("serial") public class BuilderValidators extends LinkedList<PropertyValidations> { private BuildResult result; private static String defaultMandatoryMessage = "message.error.mandatory"; private static String defaultMinLengthMessage = "message.error.minLength"; private static String defaultMaxLengthMessage = "message.error.maxLength"; private static String defaultDateFormatMessage = "message.error.dateFormat"; private static String defaultMinValueMessage = "message.error.minValue"; private static String defaultMaxValueMessage = "message.error.maxValue"; private static String defaultNumericMessage = "message.error.numeric"; private static String defaultEmailAddressMessage = "message.error.emailAddress"; private static String defaultRegexMessage = "message.error.regex"; private String mandatoryMessage = defaultMandatoryMessage; private String minLengthMessage = defaultMinLengthMessage; private String maxLengthMessage = defaultMaxLengthMessage; private String dateFormatMessage = defaultDateFormatMessage; private String minValueMessage = defaultMinValueMessage; private String maxValueMessage = defaultMaxValueMessage; private String numericMessage = defaultNumericMessage; private String emailAddressMessage = defaultEmailAddressMessage; private String regexMessage = defaultRegexMessage; private List<IValidator> validators = new LinkedList<IValidator>(); private boolean validatorsCreated = false; /** * @param result Current build result */ public BuilderValidators(BuildResult result) { this.result = result; } /** * Validates the properties as per the property validators * @param validationMessageHandler Current validation message handler */ public ValidationMessageList getValidationMessages(IValidationMessageHandler validationMessageHandler) { ValidationMessageList list = new ValidationMessageList(); createValidators(validationMessageHandler); for(PropertyValidations validator : this) { Object namedObject = result.get(validator.getProperty().getName()); Object value; boolean isEmptyValue = false; try { value = PropertyUtils.getNestedProperty(namedObject, validator.getProperty().getPropertyExpression()); if (value == null || String.valueOf(value).trim().length() == 0) { isEmptyValue = true; } } catch (Exception e) { throw new BuildException("Error while processing validator for \"{0}\": {1}", namedObject, e); } //validate standard validators first boolean isMandatory = (getValidator(validator.getProperty().getName(), validator.getProperty().getPropertyExpression(),MandatoryValidator.class) != null); //do not run the validatons if value is empty and mandatory validation is not activated if (isMandatory || !isEmptyValue) { for(IValidator routine : getValidators()) { if (routine instanceof IPropertyValidator) { IPropertyValidator pRoutine = (IPropertyValidator) routine; if (pRoutine.getProperty().equals(validator.getProperty())) { pRoutine.validate(value, list); } } } } } //execute the custom validator routines last for(IValidator routine : getValidators()) { if (routine instanceof ICustomValidator) { ((ICustomValidator)routine).validate(list); } } return list; } /** * @return the default Mandatory Message */ public static String getDefaultMandatoryMessage() { return defaultMandatoryMessage; } /** * @param defaultMandatoryMessage the default Mandatory Message to set */ public static void setDefaultMandatoryMessage(String defaultMandatoryMessage) { BuilderValidators.defaultMandatoryMessage = defaultMandatoryMessage; } /** * @return the mandatory Message */ public String getMandatoryMessage() { return mandatoryMessage; } /** * @param mandatoryMessage the mandatory message to set (must have a {0} parameter for the field label) */ public BuilderValidators setMandatoryMessage(String mandatoryMessage) { this.mandatoryMessage = mandatoryMessage; return this; } /** * @return the minLength message */ public String getMinLengthMessage() { return minLengthMessage; } /** * @param minLengthMessage the minLength message to set (must have {0} for field label and {1} for min length value) */ public BuilderValidators setMinLengthMessage(String minLengthMessage) { this.minLengthMessage = minLengthMessage; return this; } /** * @return the max length message */ public String getMaxLengthMessage() { return maxLengthMessage; } /** * @param maxLengthMessage the maxLength message to set (must have {0} for field label and {1} for min length value) */ public BuilderValidators setMaxLengthMessage(String maxLengthMessage) { this.maxLengthMessage = maxLengthMessage; return this; } /** * @return the default Min Length Message */ public static String getDefaultMinLengthMessage() { return defaultMinLengthMessage; } /** * @param defaultMinLengthMessage the default Min Length Message to set */ public static void setDefaultMinLengthMessage(String defaultMinLengthMessage) { BuilderValidators.defaultMinLengthMessage = defaultMinLengthMessage; } /** * @return the default Max Length Message */ public static String getDefaultMaxLengthMessage() { return defaultMaxLengthMessage; } /** * @param defaultMaxLengthMessage the default Max Length Message to set */ public static void setDefaultMaxLengthMessage(String defaultMaxLengthMessage) { BuilderValidators.defaultMaxLengthMessage = defaultMaxLengthMessage; } /** * @return the defaultDateFormatMessage */ public static String getDefaultDateFormatMessage() { return defaultDateFormatMessage; } /** * @param defaultDateFormatMessage the defaultDateFormatMessage to set */ public static void setDefaultDateFormatMessage(String defaultDateFormatMessage) { BuilderValidators.defaultDateFormatMessage = defaultDateFormatMessage; } /** * @return the dateFormatMessage */ public String getDateFormatMessage() { return dateFormatMessage; } /** * @param dateFormatMessage the dateFormatMessage to set */ public BuilderValidators setDateFormatMessage(String dateFormatMessage) { this.dateFormatMessage = dateFormatMessage; return this; } /** * @return the defaultNumericMessage */ public static String getDefaultNumericMessage() { return defaultNumericMessage; } /** * @param defaultNumericMessage the defaultNumericMessage to set */ public static void setDefaultNumericMessage(String defaultNumericMessage) { BuilderValidators.defaultNumericMessage = defaultNumericMessage; } /** * @return the numericMessage */ public String getNumericMessage() { return numericMessage; } /** * @param numericMessage the numericMessage to set */ public BuilderValidators setNumericMessage(String numericMessage) { this.numericMessage = numericMessage; return this; } /** * @return List of custom validators */ public List<IValidator> getValidators() { return validators; } /** * Adds a custom validator * @param validator Custom validator * @return This */ public BuilderValidators add(ICustomValidator validator) { getValidators().add(validator); return this; } /** * Adds a standard property validator * @param validator Property validator * @return This */ public BuilderValidators add(IPropertyValidator validator) { getValidators().add(validator); return this; } //creates the validators private void createValidators(IValidationMessageHandler validationMessageHandler) { if (!validatorsCreated) { for(PropertyValidations validator : this) { Object namedObject = result.get(validator.getProperty().getName()); String parsedLabel = validator.getLabel(); if (parsedLabel == null || parsedLabel.length() == 0) { //no label defined .... try to get it in a domain-specific way parsedLabel = validationMessageHandler.getNamedObjectLabel(namedObject); } else { //attempt to localize it parsedLabel = result.getResource(parsedLabel); } if (validator.isMandatory()) { MandatoryValidator v = new MandatoryValidator(validator.getProperty(),parsedLabel, getMandatoryMessage(),result); validators.add(v); } if (validator.getType() != null) { TypeValidator v = new TypeValidator(validator.getProperty(),parsedLabel, null, result, validator.getType()); validators.add(v); } if (validator.getMinLength() != null) { MinLengthValidator v = new MinLengthValidator(validator.getProperty(),parsedLabel, getMinLengthMessage(),result, validator.getMinLength()); validators.add(v); } if (validator.getMaxLength() != null) { MaxLengthValidator v = new MaxLengthValidator(validator.getProperty(),parsedLabel, getMaxLengthMessage(),result, validator.getMaxLength()); validators.add(v); } if (validator.getDateFormat() != null) { DateFormatValidator v = new DateFormatValidator(validator.getProperty(),parsedLabel, getDateFormatMessage(),result, validator.getDateFormat(), validator.getLocaleInstance()); validators.add(v); } if (validator.isEmailAddress()) { EmailAddressValidator v = new EmailAddressValidator(validator.getProperty(), parsedLabel, getEmailAddressMessage(),result); validators.add(v); } if (validator.getRegex() != null) { String msgFormat = (validator.getRegexMessage() == null) ? getRegexMessage() : validator.getRegexMessage(); RegexValidator v = new RegexValidator(validator.getProperty(),parsedLabel, msgFormat, result, validator.getRegex()); validators.add(v); } if (validator.getMinValue() != null) { MinValueValidator v = new MinValueValidator(validator.getProperty(),parsedLabel, getMinValueMessage(),result,validator.getMinValue()); validators.add(v); } if (validator.getMaxValue() != null) { MaxValueValidator v = new MaxValueValidator(validator.getProperty(),parsedLabel, getMaxValueMessage(),result,validator.getMaxValue()); validators.add(v); } } //create validators only one validatorsCreated = true; } } /** * @return the defaultEmailAddressMessage */ public static String getDefaultEmailAddressMessage() { return defaultEmailAddressMessage; } /** * @param defaultEmailAddressMessage the defaultEmailAddressMessage to set */ public static void setDefaultEmailAddressMessage( String defaultEmailAddressMessage) { BuilderValidators.defaultEmailAddressMessage = defaultEmailAddressMessage; } /** * @return the emailAddress message */ public String getEmailAddressMessage() { return emailAddressMessage; } /** * @param emailAddress the emailAddress message to set */ public void setEmailAddress(String emailAddressMessage) { this.emailAddressMessage = emailAddressMessage; } /** * @return the defaultRegexMessage */ public static String getDefaultRegexMessage() { return defaultRegexMessage; } /** * @param defaultRegexMessage the defaultRegexMessage to set */ public static void setDefaultRegexMessage(String defaultRegexMessage) { BuilderValidators.defaultRegexMessage = defaultRegexMessage; } /** * @return the regexMessage */ public String getRegexMessage() { return regexMessage; } /** * @param regexMessage the regexMessage to set */ public void setRegexMessage(String regexMessage) { this.regexMessage = regexMessage; } /** * @return the defaultMaxValueMessage */ public static String getDefaultMaxValueMessage() { return defaultMaxValueMessage; } /** * @param defaultMaxValueMessage the defaultMaxValueMessage to set */ public static void setDefaultMaxValueMessage(String defaultMaxValueMessage) { BuilderValidators.defaultMaxValueMessage = defaultMaxValueMessage; } /** * @return the defaultMinValueMessage */ public static String getDefaultMinValueMessage() { return defaultMinValueMessage; } /** * @param defaultMinValueMessage the defaultMinValueMessage to set */ public static void setDefaultMinValueMessage(String defaultMinValueMessage) { BuilderValidators.defaultMinValueMessage = defaultMinValueMessage; } /** * @return the minValueMessage */ public String getMinValueMessage() { return minValueMessage; } /** * @param minValueMessage the minValueMessage to set */ public void setMinValueMessage(String minValueMessage) { this.minValueMessage = minValueMessage; } /** * @return the maxValueMessage */ public String getMaxValueMessage() { return maxValueMessage; } /** * @param maxValueMessage the maxValueMessage to set */ public void setMaxValueMessage(String maxValueMessage) { this.maxValueMessage = maxValueMessage; } /** * Looks for a particular validator in the list * @param propertyName Property name * @param validatorType Exact class of validator * @return Found validator or null */ public IValidator getValidator(String objectName, String propertyExpression, Class<?> validatorType ) { IValidator v = null; for(IValidator validator : getValidators()) { if (validator instanceof IPropertyValidator) { IPropertyValidator pv = (IPropertyValidator) validator; if (objectName.equals(pv.getProperty().getName()) && propertyExpression.equals(pv.getProperty().getPropertyExpression()) && validator.getClass().equals(validatorType)) { v = validator; break; } } } return v; } }