Problema com validações... herança

Bom pessoal. estou querendo fazer umas validações que não deverão ser permitidas, por exemplo: cidades destino consecutivas, incluindo validação com base na cidade de origem, ou seja, caso o usuário escolha a cidade inicial do roteiro como sendo Rio de Janeiro (RJ), a primeira cidade de destino não poderá ser a cidade Rio de Janeiro (RJ), outro exemplo, caso ele selecione a primeira cidade de destino igual a Belo Horizonte (MG) a próxima cidade de destino não poderá ser Belo Horizonte (MG). Essa validação deverá ser feita no momento que o usuário solicitar seguir para o próximo passo. Classe SelecionarDestinoForm no método validade().

ae esta as duas classe:

[code]package br.com.petrobras.roteirosonline.application.form;

import java.util.ArrayList;
import java.util.Collection;

import br.com.petrobras.roteirosonline.support.exception.BusinessException;
import br.com.petrobras.roteirosonline.support.form.Form;

/**

  • Classe do tipo formulário usada para a seleção das cidades de destino

  • do usuário.
    */
    public class SelecionarDestinoForm extends Form {

    private String[] estadosSelecionados = null;
    private String[] cidadesSelecionadas = null;
    private Collection estados = new ArrayList();
    private Collection[] cidades = null;
    private Integer[] totalDias = null;
    private Integer numCidadesVisitar = new Integer(0);

    /**

    • Construtor da classe.
      */
      public SelecionarDestinoForm() {
      }

    /**

    • Retorna um vetor contendo a lista das cidades para cada estado selecionado.
    • @return the cidades
      */
      public Collection[] getCidades() {
      return cidades;
      }

    /**

    • Informa um vetor contendo a lista das cidades para cada estado selecionado.
    • @param cidades the cidades to set
      */
      public void setCidades(Collection[] cidades) {
      this.cidades = cidades;
      }

    /**

    • Informa uma lista de cidades para uma determinada posiçao do vetor de cidades.
    • @param cidades
    • @param posicao
      */
      public void setCidades(Collection cidades, int posicao) {
      this.cidades[posicao] = cidades;
      }

    /**

    • Retorna um vetor contendo os IDs das cidades selecionadas.
    • @return the cidadesSelecionadas
      */
      public String[] getCidadesSelecionadas() {
      return cidadesSelecionadas;
      }

    /**

    • Informa um vetor contendo os IDs das cidades selecionadas.
    • @param cidadesSelecionadas the cidadesSelecionadas to set
      */
      public void setCidadesSelecionadas(String[] cidadesSelecionadas) {
      this.cidadesSelecionadas = cidadesSelecionadas;
      }

    /**

    • Retorna a lista de estados.
    • @return the estados
      */
      public Collection getEstados() {
      return estados;
      }

    /**

    • Informa a lista de estados.
    • @param estados the estados to set
      */
      public void setEstados(Collection estados) {
      this.estados = estados;
      }

    /**

    • Retorna um vetor contendo as siglas dos estados selecionados.
    • @return the estadosSelecionados
      */
      public String[] getEstadosSelecionados() {
      return estadosSelecionados;
      }

    /**

    • Informa um vetor contendo as siglas dos estados selecionados.
    • @param estadosSelecionados the estadosSelecionados to set
      */
      public void setEstadosSelecionados(String[] estadosSelecionados) {
      this.estadosSelecionados = estadosSelecionados;
      }

    /**

    • Retorna o total de ciades que o usuário deseja visitar.
    • @return the numCidades
      */
      public Integer getNumCidadesVisitar() {
      return numCidadesVisitar;
      }

    /**

    • Informa o total de ciades que o usuário deseja visitar.
    • @param numCidades the numCidades to set
      */
      public void setNumCidadesVisitar(Integer numCidades) {
      this.numCidadesVisitar = numCidades;
      }

    /**

    • Retorna um vetor com o total em dias que o usuário deseja passar em cada
    • cidade.
    • @return the totalDias
      */
      public Integer[] getTotalDias() {
      return totalDias;
      }

    /**

    • Informa um vetor com o total em dias que o usuário deseja passar em cada
    • cidade.
    • @param totalDias the totalDias to set
      */
      public void setTotalDias(Integer[] totalDias) {
      this.totalDias = totalDias;
      }

    /**

    • Método para validação dos dados
    • Esse método deverá ser complementado para não permitir que cidades
    • iguais e consecutivas sejam selecionadas.
      */
      public void validate() throws BusinessException {
      if (estadosSelecionados == null || estadosSelecionados.length < numCidadesVisitar.intValue()) {
      throw new BusinessException("Todos os estados devem ser informados.");
      }
      for (int i=0; i < estadosSelecionados.length; i++) {
      if (estadosSelecionados[i] == null || estadosSelecionados[i].trim().length() == 0) {
      throw new BusinessException("O estado na posição " + (i + 1) + " deve ser informado.");
      }
      }
      if (cidadesSelecionadas == null || cidadesSelecionadas.length < numCidadesVisitar.intValue()) {
      throw new BusinessException("Todas as cidades devem ser informadas.");
      }
      for (int i=0; i < cidadesSelecionadas.length; i++) {
      if (cidadesSelecionadas[i] == null || cidadesSelecionadas[i].trim().length() == 0) {
      throw new BusinessException("A cidade na posição " + (i + 1) + " deve ser informada.");
      }
      }
      if (totalDias == null || totalDias.length < numCidadesVisitar.intValue()) {
      throw new BusinessException("Todos os números de dias devem ser informados.");
      }
      for (int i=0; i < totalDias.length; i++) {
      if (totalDias[i] == null || totalDias[i].intValue() <= 0) {
      throw new BusinessException("O total de dias na posição " + (i + 1) + " deve ser informado e deve ser maior do que zero.");
      }
      }
      }
      }[/code]

[code]package br.com.petrobras.roteirosonline.application.form;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;

import br.com.petrobras.roteirosonline.support.exception.BusinessException;
import br.com.petrobras.roteirosonline.support.form.Form;

/**

  • Classe do tipo formulário usada para selecionar a cidade de origem do usuário.
    */
    public class SelecionarOrigemForm extends Form {

    private SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    private String estadoSelecionado = "";
    private Collection estados = new ArrayList();
    private String cidadeSelecionada = "";
    private Collection cidades = new ArrayList();
    private String dataViagem = sdf.format(Calendar.getInstance().getTime());
    private Integer numCidades = new Integer(0);

    /**

    • Construtor da classe.
      */
      public SelecionarOrigemForm() {
      }

    /**

    • Retorna o número de cidades que o usuário deseja visitar.
    • @return the numCidades
      */
      public Integer getNumCidades() {
      return numCidades;
      }

    /**

    • Informa o número de cidades que o usuário deseja visitar.
    • @param numCidades the numCidades to set
      */
      public void setNumCidades(Integer numCidades) {
      this.numCidades = numCidades;
      }

    /**

    • Retorna a coleção de cidades do estado selecionado.
    • @return the cidades
      */
      public Collection getCidades() {
      return cidades;
      }

    /**

    • Informa a coleção de cidades do estado selecionado.
    • @param cidades the cidades to set
      */
      public void setCidades(Collection cidades) {
      this.cidades = cidades;
      }

    /**

    • Retorna a cidade selecionada.
    • @return the cidadeSelecionada
      */
      public String getCidadeSelecionada() {
      return cidadeSelecionada;
      }

    /**

    • Informa a cidade selecionada.
    • @param cidadeSelecionada the cidadeSelecionada to set
      */
      public void setCidadeSelecionada(String cidadeSelecionada) {
      this.cidadeSelecionada = cidadeSelecionada;
      }

    /**

    • Retorna a data pretendida para a viagem.
    • @return the dataViagem
      */
      public String getDataViagem() {
      return dataViagem;
      }

    /**

    • Informa a data pretendida para a viagem.
    • @param dataViagem the dataViagem to set
      */
      public void setDataViagem(String dataViagem) {
      this.dataViagem = dataViagem;
      }

    /**

    • Retorna a coleção de estados.
    • @return the estados
      */
      public Collection getEstados() {
      return estados;
      }

    /**

    • Informa a coleção de estados.
    • @param estados the estados to set
      */
      public void setEstados(Collection estados) {
      this.estados = estados;
      }

    /**

    • Retorna a sigla do estado selecionado.
    • @return the estadoSelecionado
      */
      public String getEstadoSelecionado() {
      return estadoSelecionado;
      }

    /**

    • Informa a sigla do estado selecionado.
    • @param estadoSelecionado the estadoSelecionado to set
      */
      public void setEstadoSelecionado(String estadoSelecionado) {
      this.estadoSelecionado = estadoSelecionado;
      }

    /**

    • Método para validação dos dados.
      /
      public void validate() throws BusinessException {
      //Validar o estado
      if (estadoSelecionado == null || estadoSelecionado.trim().length() == 0) {
      throw new BusinessException(“Um estado deve ser selecionado.”);
      }
      //Validar a cidade
      if (cidadeSelecionada == null || cidadeSelecionada.trim().length() == 0) {
      throw new BusinessException(“Uma cidade deve ser selecionada.”);
      }
      //Validar a data
      if (dataViagem == null || dataViagem.trim().length() != 10) {
      throw new BusinessException(“A data prevista para sua viagem deve ser informada.”);
      }
      Calendar data = Calendar.getInstance();
      try {
      data.setTime(sdf.parse(dataViagem));
      } catch (Exception e) {
      throw new BusinessException(“Formato da data prevista para viagem não é válida.”);
      }
      if (data.before(Calendar.getInstance())) {
      throw new BusinessException(“A data prevista para viagem deve ser maior do que a data atual.”);
      }
      //Validar o numero de cidades a visitar
      if (numCidades == null || numCidades.intValue() <= 0) {
      throw new BusinessException(“Informe quantas cidades você deseja visitar.”);
      }
      }
      }[/code]
      SE ALGUEM PUDER ME AJUDAR AGRADEÇO
      [size=“11”][color=“red”]
      Editado: Lembre-se de utilizar BBCode em seus códigos - Cassolato[/color][/size] :joia:

Tah, não entendi, vc ja disse onde deve ser feita a alteração, como validar, tudo… qual o problema então?! E Por acaso vc vai ter um array de cidades selecionadas, que estarão na ordem de visita?! tipo c[0] -> c[1] -> c[2] -> c[3] … -> c[n], significa que vai da cidade 1 para 2 para 3 … para n?!

e posta seu código com com tag “code”, senão da preguiça de ler ele assim logo de cara :wink:

para n, mas definido no passo 1 a qtde de cidades a visitar…
sei onde deve mudar, ams meu problema é que não consigo herdar o metodo “cidadeselecionada” da class SelecionarOrigemForm , pois ja estou erdando a class Form.
sei que nao pode se fazer herança multipla, e não entendo de interfaces. entendeu??

obrigado

tah, então… muita calma nessa hora :stuck_out_tongue:

Olha soh, let’s keep it simple… eu copiei aqui suas duas classes, e como vc quer saber cidade, tirei tudo relativo a estado e data ok?! para ficar soh o que interessa… bem a principio notei umas coisas estranhas ali, no SelecionarDestinoForm vc realmente quer um Array de um Collection?! isso eh estranho hehe.

Ai tah, então pelo que entendi, vc vai la no form de origem e seleciona uma cidade, aquela que vc vai sair, por exemplo rio de janeiro. Ai depois vai no form de destino e seleciona um conjunto de cidades, que vão ser seu destino, e vc não quer que nenhuma ou a primeira cidade de destino, seja a cidade que vc colocou na origem, que esta gravado la no form de origem?! então basicamente o que vc quer é pegar uma informação a partir da form de destino la da form de origem?! isso?

Vc pode usar agregação (agregar um objeto form origem na form de destino) ou pattern singleton para form origem (não sei se eh uma boa ideia hehe) ou passar por parametro na form de destino quem eh a cidade de origem (isso que eu faria acho), etc. Como vc faz o meio campo entre essas telas?! o cara saiu da tela de escolher a origem, então volta para uma tela anterior e ai vai para a tela de escolha do destino?!

diz ai se eh isso mesmo que depois eu te respondo de novo, isso se ninguem te ajudar dai

vamos la então…
1º - eu não quero que a PRIMEIRA cidade de destisno seja igual a cidade de origem. beleza
2º - e resumindo então eu realmente quero pegar a informação a partir da form de destino la da form de origem.
3º - primeiro seleciono o estado e a cidade de origem, deopois especifico quantas cidades eu irei visitar(exemplo: se eu colocar 3, eira aparecer na proxima tela q é de destino, 3 opcoes de estados e cidades) ai clico em proximo passo e vai para teal de destino.

ps.: depois que ja estou na tela de destino, caso a primeira cidade seja a mesma cidade de origem, teria q aperecer uma tela infomando que não pode entende??? é isso que eu quero fazer!! pq no caso no layout atual, se eu clicar a mesma cidade de origem no primeira opcao, eu passo para o 3 passo, oq não poderia acontecer…

ve oq pode me ajudar

Tah, eu criaria um atributo no form de destino dizendo qual era a cidade de origem (no seu caso um String com o nome da cidade de origem), e qdo chamasse essa tela (de destino), eu passaria para ela, e na validação comparava:

if&#40;cidadesSelecionadas&#91;i&#93;.equals&#40;cidadeOrigem&#41;&#41;

dava erro… vc vai passar essa atributo no mesmo lugar que vc cria, seta as cidades, mostra a tela de destino, etc, e naquele next que vc falou, no lugar do meio campo ali entre uma tela e outra.

Se não quizer fazer isso, transforma essa sua tela de origem em um singleton que ai vc tem acesso a tela em qq lugar do sistema, inclusive dentro do seu form de destino (aqui no forum não é dificil achar como funciona esse Pattern, ele eh o mais simples de todos). Mas eu acho que essa não é a melhor das formas heheh é que não sou muito de fazer telas :stuck_out_tongue: mas, vai saber neh.

Agora outra alternativa, eu imagino que vc nunca pode ter a proxima cidade identica a cidade que vc esta, então podia iniciar a lista de selecionados colocando na posicao 0 a cidade de origem, e então faria algo do tipo

      String&#91;&#93; x = new String&#91;5&#93;;
      x&#91;0&#93; = &quot;1&quot;;
      x&#91;1&#93; = &quot;2&quot;;
      x&#91;2&#93; = &quot;3&quot;;
      x&#91;3&#93; = &quot;4&quot;;
      x&#91;4&#93; = &quot;4&quot;;
      for &#40;int i = 0; i &lt; &#40;x.length - 1&#41;; i++&#41;
      &#123;
         if &#40;x&#91;i&#93;.equals&#40;x&#91;i + 1&#93;&#41;&#41;
         &#123;
            System.out.println&#40;&quot;erro&quot;&#41;;
         &#125;
      &#125;

Validando se a cidade anterior eh igual a proxima na lista, e ai ja valida tudo, desde a primeira ateh a ultima cidade qualquer cidade consecutiva selecionada ele pegaria…

Boa sorte… eu vou sair agora, soh volto a ver um pc no domingo, espero que tenha ajudado e que consigue