package org.nocket.gen.page.element.synchronizer; import java.text.MessageFormat; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.apache.wicket.validation.IErrorMessageSource; import org.apache.wicket.validation.IValidatable; import org.apache.wicket.validation.IValidationError; import org.apache.wicket.validation.IValidator; /** * Validates input by calling validate...() method. This is additional way to * perform validations besides of JSR validations. * <p/> * For example for string property "firstName" method should be like this: * <p/> * <code> * public String validateFirstName(String value) { ... } * </code> * * @author blaz02 * */ public class NocketValidateMethodValidator<T> implements IValidator<T> { private static final long serialVersionUID = 1L; private static final Logger log = Logger.getLogger(NocketValidateMethodValidator.class); private static final String LOG_ENTRY = "Nocket validation: method={0}. {2}."; private SynchronizerHelper helper; public NocketValidateMethodValidator(SynchronizerHelper helper) { this.helper = helper; } @Override public void validate(IValidatable<T> validatable) { String logResult = "No violation"; if (helper.getValidatorMethod() != null) { final String validationError = (String) helper.invokeValidatorMethod(validatable.getValue()); if (StringUtils.isNotBlank(validationError)) { validatable.error(new IValidationError() { private static final long serialVersionUID = 1L; @Override public String getErrorMessage(IErrorMessageSource messageSource) { String resourceMessage = messageSource.getMessage(validationError, null); if (resourceMessage != null) { return resourceMessage; } else { return validationError; } } }); logResult = "Violation " + validationError; } if (log.isDebugEnabled()) { log.debug(MessageFormat.format(LOG_ENTRY, helper.getValidatorMethod(), helper.getRef().getDomainClass(), logResult)); } } } }