-
-
Save dennysfredericci/1597599 to your computer and use it in GitHub Desktop.
| package br.com.fredericci.validation; | |
| import java.util.ArrayList; | |
| import java.util.Collection; | |
| import java.util.Collections; | |
| import java.util.List; | |
| import org.slf4j.Logger; | |
| import org.slf4j.LoggerFactory; | |
| import br.com.caelum.vraptor.Result; | |
| import br.com.caelum.vraptor.View; | |
| import br.com.caelum.vraptor.core.Localization; | |
| import br.com.caelum.vraptor.ioc.Component; | |
| import br.com.caelum.vraptor.ioc.RequestScoped; | |
| import br.com.caelum.vraptor.proxy.Proxifier; | |
| import br.com.caelum.vraptor.util.test.MockResult; | |
| import br.com.caelum.vraptor.validator.AbstractValidator; | |
| import br.com.caelum.vraptor.validator.BeanValidator; | |
| import br.com.caelum.vraptor.validator.DefaultValidator; | |
| import br.com.caelum.vraptor.validator.I18nMessage; | |
| import br.com.caelum.vraptor.validator.Message; | |
| import br.com.caelum.vraptor.validator.Outjector; | |
| import br.com.caelum.vraptor.validator.Validations; | |
| import br.com.caelum.vraptor.view.ValidationViewsFactory; | |
| import com.google.common.collect.HashMultimap; | |
| import com.google.common.collect.Multimap; | |
| /** | |
| * Implementacao alternativa do validator para adicionar um mapa com os erros | |
| * ocorridos no request | |
| * | |
| * @author dennys | |
| * | |
| */ | |
| @Component | |
| @RequestScoped | |
| public class Validator extends AbstractValidator { | |
| private static final Logger logger = LoggerFactory.getLogger(DefaultValidator.class); | |
| private final Result result; | |
| private final List<Message> errors = new ArrayList<Message>(); | |
| private final ValidationViewsFactory viewsFactory; | |
| private final List<BeanValidator> beanValidators; | |
| private final Outjector outjector; | |
| private final Proxifier proxifier; | |
| private final Localization localization; | |
| public Validator(Result result, ValidationViewsFactory factory, Outjector outjector, Proxifier proxifier, List<BeanValidator> beanValidators, Localization localization) { | |
| this.result = result; | |
| this.viewsFactory = factory; | |
| this.outjector = outjector; | |
| this.proxifier = proxifier; | |
| this.beanValidators = beanValidators; | |
| this.localization = localization; | |
| } | |
| public void checking(Validations validations) { | |
| addAll(validations.getErrors(localization.getBundle())); | |
| } | |
| public void validate(Object object) { | |
| if (beanValidators == null || beanValidators.isEmpty()) { | |
| logger.warn("has no validators registered"); | |
| } else { | |
| for (BeanValidator validator : beanValidators) { | |
| addAll(validator.validate(object)); | |
| } | |
| } | |
| } | |
| public <T extends View> T onErrorUse(Class<T> view) { | |
| if (!hasErrors()) { | |
| return new MockResult(proxifier).use(view); // ignore anything, no | |
| // errors occurred | |
| } | |
| result.include("errors", errors); | |
| result.include("errorsMap", toMap(errors)); | |
| outjector.outjectRequestMap(); | |
| return viewsFactory.instanceFor(view, errors); | |
| } | |
| private Multimap<String, String> toMap(List<Message> errorsList) { | |
| Multimap<String, String> errorsMap = HashMultimap.create(); | |
| for (Message message : errorsList) { | |
| errorsMap.put(message.getCategory(), message.getMessage()); | |
| } | |
| return errorsMap; | |
| } | |
| public void addAll(Collection<? extends Message> messages) { | |
| for (Message message : messages) { | |
| add(message); | |
| } | |
| } | |
| public void add(Message message) { | |
| if (message instanceof I18nMessage && !((I18nMessage) message).hasBundle()) { | |
| ((I18nMessage) message).setBundle(localization.getBundle()); | |
| } | |
| this.errors.add(message); | |
| } | |
| public boolean hasErrors() { | |
| return !errors.isEmpty(); | |
| } | |
| public List<Message> getErrors() { | |
| return Collections.unmodifiableList(this.errors); | |
| } | |
| } |
Hehehe nem tinha percebido a falta do link! que cabeça! Só fiquei curioso... como encontrou o link? hahaha
1 - os códigos atuais parariam de funcionar: Ok, isso eu ja estava prevendo.
2 - como as chaves são as categorias, eu não conseguiria mostrar dois erros pro mesmo campo: Não cheguei a pensar nisso... :( ... Humm.. talvez uma solucao seria ter uma lista ou um array de strings como valor no mapa....
Troquei a implementação padrão por mapa porque achei simples usar: ${errors['categoria']}
Digamos que (quase) tudo que o google indexa e tem a palavra VRaptor, eu recebo uma notificação ;)
dá uma olhada no Guava, a classe Multimap. Já é dependência do VRaptor e já faz o que vc quer.
Bacana a idéia do Multimap! Acho que para ficar bom só faltaria uma taglib ou algo do genero para deixar o jsp limpo...
algo do tipo:
<v:errors category="categoria" />
Bem legal!
mas com essa taglib, dá pra fazer usando a List mesmo, certo?
Hum! Verdade nem tinha pensado nisso!
A implementação vai ficar mais simples também! Acabei de atualizar la....
Agora sim =)
tweet?
manda lá pro vraptor-contrib, plz
https://github.com/caelum/vraptor-contrib
[]'s
vc tinha esquecido o link no tweet ;)
então, tem dois problemas com isso
talvez fosse legal ter algo como errors e errorMap no request, um com a lista atual e outra como esse mapa.