package br.com.caelum.stella.bean.validation.logic; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import net.vidageek.mirror.dsl.Mirror; import br.com.caelum.stella.bean.validation.IE; import br.com.caelum.stella.type.Estado; /** * Valida a cadeia gerada através do método {@linkplain #toString()} para * verificar se ela está de acordo com o padrão de Inscricao Estadual, no estado * epecificado. * * @author Leonardo Bessa */ public class StellaIEValidator implements ConstraintValidator<IE, Object> { private br.com.caelum.stella.validation.Validator<String> stellaValidator; private IE ie; public boolean isValid(Object value, ConstraintValidatorContext context) { if (value != null) { String ieValue = getIEValue(value); String estadoValue = getEstadoValue(value); final AnnotationMessageProducer annotationMessageProducer = new AnnotationMessageProducer( ie); if (ieValue.trim().length() == 0) { return true; } else { try { final Estado estado = Estado.valueOf(estadoValue); stellaValidator = estado.getIEValidator( annotationMessageProducer, ie.formatted()); } catch (IllegalArgumentException e) { return false; } return stellaValidator.invalidMessagesFor(ieValue).isEmpty(); } } else { return true; } } public void initialize(IE ie) { this.ie = ie; } private String getEstadoValue(final Object obj) { return new Mirror().on(obj).invoke() .method(camelCaseGetFieldName(ie.estadoField())).withoutArgs() .toString(); } private String getIEValue(final Object obj) { return new Mirror().on(obj).invoke() .method(camelCaseGetFieldName(ie.ieField())).withoutArgs() .toString(); } private String camelCaseGetFieldName(final String fieldName) { return "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); } }