package br.com.caelum.stella.validation;
import java.util.ArrayList;
import java.util.List;
import br.com.caelum.stella.MessageProducer;
import br.com.caelum.stella.SimpleMessageProducer;
import br.com.caelum.stella.ValidationMessage;
/**
*
* @author leonardobessa
*/
public class AcceptAnyValidator implements Validator<String> {
private List<Validator<String>> validators = new ArrayList<Validator<String>>();
public static enum Documento {
CPF {
public Validator<String> getValidator(MessageProducer messageProducer, boolean isFormatted) {
return new CPFValidator(messageProducer, isFormatted);
}
},
CNPJ {
public Validator<String> getValidator(MessageProducer messageProducer, boolean isFormatted) {
return new CNPJValidator(messageProducer, isFormatted);
}
};
public abstract Validator<String> getValidator(MessageProducer messageProducer, boolean isFormatted);
}
public AcceptAnyValidator(Documento... documentos) {
this(true, documentos);
}
public AcceptAnyValidator(boolean isFormatted, Documento... documentos) {
this(new SimpleMessageProducer(), isFormatted, documentos);
}
public AcceptAnyValidator(MessageProducer messageProducer, boolean isFormatted, Documento... documentos) {
for (Documento documento : documentos) {
validators.add(documento.getValidator(messageProducer, isFormatted));
}
}
public void assertValid(String value) {
List<ValidationMessage> invalidMessages = invalidMessagesFor(value);
if (!invalidMessages.isEmpty()) {
throw new InvalidStateException(invalidMessages);
}
}
public List<ValidationMessage> invalidMessagesFor(String value) {
List<ValidationMessage> result = new ArrayList<ValidationMessage>();
for (Validator<String> validator : validators) {
List<ValidationMessage> messages = validator.invalidMessagesFor(value);
if (messages.isEmpty()) {
result.clear();
break;
} else {
result.addAll(messages);
}
}
return result;
}
public boolean isEligible(String object) {
boolean result = false;
for (Validator<String> validator : validators) {
result |= validator.isEligible(object);
}
return result;
}
/**
* @see Validator#generateRandomValid()
* @return um documento válido de acordo com as regras do primeiro documento passado como
* argumento na construção deste validador
*/
@Override
public String generateRandomValid() {
return validators.iterator().next().generateRandomValid();
}
}