View Javadoc

1   /*
2    * Criado em 05/11/2004 Classe para tratar dos grupos de locais e hierarquia de
3    * grupos de locais. A hierarquia de grupos de locais eh implicita pois
4    * representa um conjunto dentro de cada objeto local. Um grupo pode ter muitos
5    * pais(grupos) diferentes. Um grupo também pode ter muitos filhos diferentes.
6    * Relacionamentos cíclicos não são permitidos. Sejam os seguintes grupos: Pais,
7    * Regiao, Estado, Municipio e as respectivas associacoes: Municipio é filho de
8    * Estado Municipio é filho de Regiao Estado é filho de Regiao Regiao é filho de
9    * Pais Ao selecionarmos um grupo de local quem podem ser seus filhos válidos?
10   * R.O conjunto de todos os grupos "G" menos o proprio grupo "g" e seus
11   * ascendentes. G - {{g} U Ascendentes{g}} Ao selecionarmos o grupo Municipio,
12   * quem pode ser seus filhos? R. ninguém, pois: {P, R, E, M} - {M, E, R, P} =
13   * {conjunto vazio} Quem podem ser os filhos de Regiao? R. {P, R, E, M} - {R, P}
14   * = {E, M}
15   */
16  package ecar.dao;
17  
18  import java.util.ArrayList;
19  import java.util.Collections;
20  import java.util.Comparator;
21  import java.util.Iterator;
22  import java.util.List;
23  
24  import javax.servlet.http.HttpServletRequest;
25  
26  import org.hibernate.HibernateException;
27  
28  import comum.database.Dao;
29  
30  import ecar.exception.ECARException;
31  import ecar.pojo.LocalGrupoLgp;
32  
33  /**
34   * @author felipev
35   */
36  public class LocalGrupoDao extends Dao {
37    /**
38     * Construtor. Chama o Session factory do Hibernate
39     */
40    public LocalGrupoDao(HttpServletRequest request) {
41      super();
42      this.request = request;
43    }
44  
45    /**
46     * Retorna um list com identificações de todos os grupos filhos de um grupo
47     * @param localGrupo
48     * @return List de Long
49     */
50    public List getFilhosById(LocalGrupoLgp localGrupo) {
51      List filhos = new ArrayList();
52      if (localGrupo.getLocalGrupoHierarquiaLgphsByCodLgpPai() != null) {
53        Iterator it = localGrupo.getLocalGrupoHierarquiaLgphsByCodLgpPai().iterator();
54        while (it.hasNext()) {
55          LocalGrupoLgp localGrupoFilho = (LocalGrupoLgp) it.next();
56          filhos.add(localGrupoFilho.getCodLgp());
57        }
58      }
59      return filhos;
60    }
61  
62    /**
63     * Retorna os Grupos acima do Grupo passado como parâmetro (pais, avôs, etc)
64     * @param localGrupo
65     * @return Set Coleção de Grupos de Local Pseudocodigo: Ascendentes(g) {
66     *         resultado = {conjunto vazio} se (Pais(g) != {conjunto vazio}) para
67     *         cada p em Pais(g) faca resultado <- {p} U Ascendentes(p) return
68     *         (resultado) }
69     */
70    public List getAscendentes(LocalGrupoLgp localGrupo) {
71      List grupos = new ArrayList();
72      if (localGrupo.getLocalGrupoHierarquiaLgphsByCodLgp() != null) {
73        // Coleção dos Pais
74        Iterator it = localGrupo.getLocalGrupoHierarquiaLgphsByCodLgp().iterator();
75        while (it.hasNext()) {
76          LocalGrupoLgp localGrupoLgp = (LocalGrupoLgp) it.next();
77          if (!grupos.contains(localGrupoLgp)) {
78            grupos.add(localGrupoLgp);
79            grupos.addAll(getAscendentes(localGrupoLgp));
80          }
81        }
82      }
83      return grupos;
84    }
85  
86    /**
87     * Exclui um grupo de Locais, verificando antes se ele possui relação com
88     * outras tabelas. Neste caso, não permite exclusão
89     * @param atributo
90     * @throws ECARException
91     */
92    public void excluir(LocalGrupoLgp localGrupo) throws ECARException {
93      try {
94        boolean excluir = true;
95        if (contar(localGrupo.getLocalItemLits()) > 0) {
96          excluir = false;
97          throw new ECARException("localGrupo.exclusao.erro.localItemLits");
98        }
99        if (contar(localGrupo.getLocalGrupoHierarquiaLgphsByCodLgp()) > 0) {
100         excluir = false;
101         throw new ECARException("localGrupo.exclusao.erro.localGrupoHierarquiaLgphsByCodLgp");
102       }
103       if (contar(localGrupo.getLocalGrupoHierarquiaLgphsByCodLgpPai()) > 0) {
104         excluir = false;
105         throw new ECARException("localGrupo.exclusao.erro.localGrupoHierarquiaLgphsByCodLgpPai");
106       }
107 
108       if (excluir)
109         super.excluir(localGrupo);
110     } catch (ECARException e) {
111       this.logger.error(e);
112       throw e;
113     }
114   }
115 
116   /**
117    * verifica duplicação depois salva
118    * @param grupo
119    * @throws ECARException
120    */
121   public void salvar(LocalGrupoLgp grupo) throws ECARException {
122     if (pesquisarDuplos(grupo, new String[] { "identificacaoLgp" }, "codLgp").size() > 0)
123       throw new ECARException("localGrupo.validacao.registroDuplicado");
124     super.salvar(grupo);
125   }
126 
127   /**
128    * verifica duplicação depois altera
129    * @param grupo
130    * @throws ECARException
131    */
132   public void alterar(LocalGrupoLgp grupo) throws ECARException {
133     if (pesquisarDuplos(grupo, new String[] { "identificacaoLgp" }, "codLgp").size() > 0)
134       throw new ECARException("localGrupo.validacao.registroDuplicado");
135     super.alterar(grupo);
136   }
137 
138   /**
139    * Retorna a lista de LocalGrupoLgpPais (1o nível) ativos de um grupo
140    * @param grupo
141    * @return List LocalGrupoLgp
142    * @throws HibernateException
143    */
144   public List getGruposPais(LocalGrupoLgp grupo) throws HibernateException {
145     List grupos = new ArrayList();
146 
147     if (grupo.getLocalGrupoHierarquiaLgphsByCodLgp() != null) {
148       grupos = new ArrayList(grupo.getLocalGrupoHierarquiaLgphsByCodLgp());
149       Iterator it = grupos.iterator();
150       while (it.hasNext()) {
151         LocalGrupoLgp lgp = (LocalGrupoLgp) it.next();
152         if (!"S".equals(lgp.getIndAtivoLgp())) {
153           it.remove();
154         }
155       }
156       Collections.sort(grupos, new Comparator() {
157         public int compare(Object o1, Object o2) {
158           return ((LocalGrupoLgp) o1).getIdentificacaoLgp().compareToIgnoreCase(((LocalGrupoLgp) o2).getIdentificacaoLgp());
159         }
160       });
161     }
162 
163     return grupos;
164   }
165 
166   /**
167    * Retorna a lista de LocalGrupoLgpFilhos (1o nível) ativos de um grupo
168    * @param grupo
169    * @return List LocalGrupoLgp
170    * @throws HibernateException
171    */
172   public List getGruposFilhos(LocalGrupoLgp grupo) throws HibernateException {
173     List grupos = new ArrayList();
174 
175     if (grupo.getLocalGrupoHierarquiaLgphsByCodLgpPai() != null) {
176       grupos = new ArrayList(grupo.getLocalGrupoHierarquiaLgphsByCodLgpPai());
177       Iterator it = grupos.iterator();
178       while (it.hasNext()) {
179         LocalGrupoLgp lgp = (LocalGrupoLgp) it.next();
180         if (!"S".equals(lgp.getIndAtivoLgp())) {
181           it.remove();
182         }
183       }
184       Collections.sort(grupos, new Comparator() {
185         public int compare(Object o1, Object o2) {
186           return ((LocalGrupoLgp) o1).getIdentificacaoLgp().compareToIgnoreCase(((LocalGrupoLgp) o2).getIdentificacaoLgp());
187         }
188       });
189     }
190 
191     return grupos;
192   }
193 
194 }