@Post
  @Path("/sessao/{sessaoId}/reserva")
  public void reserva(Long sessaoId, final Integer quantidade) {
    Sessao sessao = agenda.sessao(sessaoId);
    if (sessao == null) {
      result.notFound();
      return;
    }

    if (quantidade < 1) {
      validator.add(new SimpleMessage("", "Você deve escolher um lugar ou mais"));
    }

    if (!sessao.podeReservar(quantidade)) {
      validator.add(new SimpleMessage("", "Não existem ingressos disponíveis"));
    }

    // em caso de erro, redireciona para a lista de sessao
    validator.onErrorRedirectTo(this).sessao(sessao.getId());

    BigDecimal precoTotal = CalculadoraDePrecos.calcula(sessao, quantidade);

    sessao.reserva(quantidade);

    result.include("message", "Sessão reservada com sucesso por " + CURRENCY.format(precoTotal));

    result.redirectTo(IndexController.class).index();
  }
  public boolean validate(String email) {
    if (users.existsWithEmail(email)) {
      validator.add(messageFactory.build("error", "user.errors.email.used"));
    }
    if (email == null) {
      validator.add(messageFactory.build("error", "user.errors.email.required"));
    }

    return !validator.hasErrors();
  }
  @Post("/espetaculos")
  public void adiciona(Espetaculo espetaculo) {
    // aqui eh onde fazemos as varias validacoes
    // se nao tiver nome, avisa o usuario
    // se nao tiver descricao, avisa o usuario
    if (Strings.isNullOrEmpty(espetaculo.getNome())) {
      validator.add(new SimpleMessage("", "Nome do espetáculo não pode estar em branco"));
    }
    if (Strings.isNullOrEmpty(espetaculo.getDescricao())) {
      validator.add(new SimpleMessage("", "Descrição do espetáculo não pode estar em branco"));
    }
    validator.onErrorRedirectTo(this).lista();

    agenda.cadastra(espetaculo);
    result.redirectTo(this).lista();
  }
 protected void reportFileUploadException(FileUploadException e, Validator validator) {
   validator.add(new I18nMessage("upload", "file.upload.exception"));
   logger.warn(
       "There was some problem parsing this multipart request, "
           + "or someone is not sending a RFC1867 compatible multipart request.",
       e);
 }
 private Espetaculo carregaEspetaculo(Long espetaculoId) {
   Espetaculo espetaculo = agenda.espetaculo(espetaculoId);
   if (espetaculo == null) {
     validator.add(new SimpleMessage("", ""));
   }
   validator.onErrorUse(status()).notFound();
   return espetaculo;
 }
 /** This method is called when the {@link SizeLimitExceededException} was thrown. */
 protected void reportSizeLimitExceeded(final SizeLimitExceededException e, Validator validator) {
   validator.add(
       new I18nMessage("upload", "file.limit.exceeded", e.getActualSize(), e.getPermittedSize()));
   logger.warn(
       "The file size limit was exceeded. Actual {} permitted {}",
       e.getActualSize(),
       e.getPermittedSize());
 }
 @Log
 @Public
 @Post
 public void autentica(Usuario usuario) {
   if (!dao.existe(usuario)) {
     validator.add(new I18nMessage("login", "login.invalido"));
     validator.onErrorUsePageOf(this).formulario();
   }
   usuarioLogado.setUsuario(usuario);
   result.redirectTo(ProdutoController.class).lista();
 }