View Javadoc

1   /*
2    * Created on 13/09/2004
3    */
4   package ecar.dao;
5   
6   import java.io.File;
7   import java.util.ArrayList;
8   import java.util.Collections;
9   import java.util.Comparator;
10  import java.util.HashMap;
11  import java.util.Iterator;
12  import java.util.List;
13  import java.util.Map;
14  import java.util.Set;
15  import java.util.TreeMap;
16  
17  import javax.servlet.http.HttpServletRequest;
18  
19  import org.apache.commons.fileupload.FileItem;
20  import org.hibernate.Query;
21  
22  import comum.database.Dao;
23  import comum.util.FileUpload;
24  import comum.util.Pagina;
25  import comum.util.Util;
26  
27  import ecar.exception.ECARException;
28  import ecar.pojo.Cor;
29  import ecar.pojo.CorTipoFuncAcompCtfa;
30  import ecar.pojo.TipoFuncAcompTpfa;
31  import ecar.servlet.grafico.bean.PosicaoBean;
32  import ecar.util.Dominios;
33  
34  /**
35   * @author garten
36   */
37  public class CorDao extends Dao {
38  
39    /**
40     * Construtor. Chama o Session factory do Hibernate
41     */
42    public CorDao(HttpServletRequest request) {
43      super();
44      this.request = request;
45    }
46  
47    /**
48     * Grava Cor e suas respectivas CorTipo
49     * @author ..., rogerio
50     * @since N/C
51     * @version 0.2, 28/02/2007
52     * @param cor
53     * @throws ECARException
54     */
55    public void salvar(Cor cor) throws ECARException {
56      if (pesquisarDuplos(cor, new String[] { "nomeCor" }, "codCor").size() > 0)
57        throw new ECARException("cor.validacao.registroDuplicado");
58      super.salvar(cor, cor.getCorTipoFuncAcompCtfas());
59    } // fim salvar()
60  
61    /**
62     * Altera Cor e suas respectivas CorTipoFuncAcomp.
63     * @author ..., rogerio
64     * @since N/C
65     * @version 0.2, 02/03/2007
66     * @param cor
67     * @throws ECARException
68     */
69    public void alterar(Cor cor) throws ECARException {
70      if (pesquisarDuplos(cor, new String[] { "nomeCor" }, "codCor").size() > 0)
71        throw new ECARException("cor.validacao.registroDuplicado");
72  
73      /*
74       * -- Controla a atualização dos registros de CorTipoFuncAcomp no Banco de
75       * Dados. Verifica a existência de um registro que está sendo alterado, se
76       * existir apaga e insere, caso contrário, apenas insere no banco. --
77       */
78      List<CorTipoFuncAcompCtfa> listCtfa = new ArrayList(cor.getCorTipoFuncAcompCtfas());
79      CorTipoFuncAcompCtfa aux = null; // aux para pesquisa
80  
81      for (CorTipoFuncAcompCtfa ctfa : listCtfa) {
82        /*
83         * -- Consulta por hql pois o método "buscar" não leva em conta o --
84         */
85        Query query = session.createQuery(" from CorTipoFuncAcompCtfa " + " where comp_id.codCor = :codCor " + "   and comp_id.codTpfa = :tipoFunc " + "   and comp_id.posicaoCtfa = :posicao ");
86  
87        query.setLong("codCor", ctfa.getComp_id().getCodCor());
88        query.setLong("tipoFunc", ctfa.getComp_id().getCodTpfa());
89        query.setString("posicao", ctfa.getComp_id().getPosicaoCtfa());
90  
91        aux = (CorTipoFuncAcompCtfa) query.uniqueResult();
92  
93        if (aux != null)
94          super.alterar(ctfa);
95        else
96          super.salvar(ctfa);
97      }
98  
99      super.alterar(cor);
100   } // fim alterar()
101 
102   /**
103    * Retorna o noma da imagem representando uma cor para uma função de
104    * acompanhamento
105    * @param cor
106    * @param funcaoAcomp
107    * @return
108    */
109   public String getImagemSinal(Cor cor, TipoFuncAcompTpfa funcaoAcomp) {
110     return "s" + cor.getNomeCor() + funcaoAcomp.getTamanhoSinalTpfa() + ".png";
111   }
112 
113   /**
114    * Retorna o noma da imagem representando uma cor para uma função de
115    * acompanhamento
116    * @param cor
117    * @param funcaoAcomp
118    * @return
119    */
120   public String getImagemSinalRelPosicoes(Cor cor, TipoFuncAcompTpfa funcaoAcomp) {
121     // return "sinal" + cor.getCodCor() + funcaoAcomp.getTamanhoSinalTpfa() +
122     // ".png";
123     if (cor != null)
124       return "r" + cor.getNomeCor() + funcaoAcomp.getTamanhoSinalTpfa() + ".png";
125     else
126       return "rBranco" + funcaoAcomp.getTamanhoSinalTpfa() + ".png";
127   }
128 
129   /**
130    * Retorna o noma da imagem representando uma cor para uma função de
131    * acompanhamento
132    * @param cor
133    * @param funcaoAcomp
134    * @return
135    */
136   public String getImagemRelatorio(Cor cor, TipoFuncAcompTpfa funcaoAcomp) {
137     if (cor != null)
138       return cor.getNomeCor().toLowerCase() + funcaoAcomp.getTamanhoSinalTpfa() + ".png";
139     else
140       return "branco" + funcaoAcomp.getTamanhoSinalTpfa() + ".png";
141   }
142 
143   public List getOrdemCores() throws ECARException {
144     return this.listar(Cor.class, new String[] { "ordemCor", "" });
145   }
146 
147   /**
148    * Realiza o upload das imagens de Cores na inclusão. Sobrescreve o arquivo
149    * existente anteriormente. <br>
150    * @author joao carlos, rogerio
151    * @since N/C
152    * @version 0.2, 28/02/2007
153    * @param campos
154    * @param pathRaiz
155    * @param pathRelativo
156    * @throws ECARException
157    */
158 
159   public void uploadImagem(List campos) throws ECARException {
160     String pathRaiz = new ecar.dao.ConfiguracaoDao(request).getConfiguracao().getRaizUpload(); // _msg.getPathUploadRaiz("path .upload.raiz");
161     String pathRelativo = Dominios.PATH_REMOTE_IMAGES;
162 
163     try {
164       Iterator it = campos.iterator();
165       while (it.hasNext()) {
166         FileItem fileItem = (FileItem) it.next();
167 
168         if (!fileItem.isFormField() && !"".equals(fileItem.getName())) {
169           String fileName = FileUpload.getNomeArquivo(fileItem);
170           File realFile = new File(pathRaiz + pathRelativo + fileName);
171 
172           if (realFile.exists())
173             FileUpload.apagarArquivo(pathRaiz + pathRelativo + fileName);
174           File arquivoGravado = FileUpload.salvarNoDisco(fileItem, FileUpload.getPathFisico(pathRaiz, pathRelativo, fileName));
175         }
176       }
177     } catch (Exception e) {
178       this.logger.error(e);
179       throw new ECARException(e);
180     }
181 
182   }
183 
184   /**
185    * Retorna o caminho da imagem personalizada pelo usuário para a função de
186    * acompanhamento. <br>
187    * Na falta da imagem personalizada, retorna NULL. <br>
188    * @author rogerio
189    * @since 0.1, 27/02/2007
190    * @version 0.1, 27/02/2007
191    * @param cor
192    * @param funcaoAcomp
193    * @return String
194    * @throws ECARException
195    */
196   public String getImagemPersonalizada(Cor cor, TipoFuncAcompTpfa funcaoAcomp, String posicao) throws ECARException {
197     String path = null;
198     ConfiguracaoDao cdao = new ConfiguracaoDao(null);
199 
200     if (cor != null && cor.getCodCor() != null && funcaoAcomp != null && posicao != null) {
201       CorTipoFuncAcompCtfa ctfa = null;
202 
203       try {
204         Query query = session.createQuery(" from CorTipoFuncAcompCtfa " + " where comp_id.codCor = :codCor " + "   and comp_id.codTpfa = :tipoFunc " + "   and comp_id.posicaoCtfa = :posicao ");
205 
206         query.setLong("codCor", cor.getCodCor());
207         query.setLong("tipoFunc", funcaoAcomp.getCodTpfa());
208         query.setString("posicao", posicao);
209 
210         ctfa = (CorTipoFuncAcompCtfa) query.uniqueResult();
211       } catch (Exception e) {
212         this.logger.error(e);
213         throw new ECARException("erro.exception");
214       }
215 
216       /*
217        * -- Se o usuario personalizou a imagem para a função de acompanhamento,
218        * retorna o caminho para exibição da imagem, caso contrário retorna NULL
219        * e o controle deverá ser feito na página. --
220        */
221       if (ctfa != null && (ctfa.getCaminhoImagemCtfa() != null || !"".equals(ctfa.getCaminhoImagemCtfa()))) {
222         path = cdao.getConfiguracao().getRaizUpload() + Dominios.PATH_REMOTE_IMAGES + ctfa.getCaminhoImagemCtfa();
223         File file = new File(path);
224         if (!file.exists())
225           path = null;
226       }
227     }
228     else if (cor != null && cor.getCodCor() != null && funcaoAcomp == null) {
229       path = cdao.getConfiguracao().getRaizUpload() + Dominios.PATH_REMOTE_IMAGES + cor.getCaminhoImagemPontoCriticoCor();
230       File file = new File(path);
231       if (!file.exists())
232         path = null;
233     }
234 
235     return path;
236   } // fim getImagemPersonalizada()
237 
238   /**
239    * Retorna o caminho da imagem personalizada pelo usuário do
240    * indicador/resultado. <br>
241    * Na falta da imagem personalizada, retorna NULL. <br>
242    * @author
243    * @since
244    * @version
245    * @param cor
246    * @return String
247    * @throws ECARException
248    */
249   public String getImagemPersonalizadaIndResul(Cor cor) throws ECARException {
250     String path = null;
251     ConfiguracaoDao cdao = new ConfiguracaoDao(null);
252 
253     if (cor != null && cor.getCodCor() != null) {
254       path = cdao.getConfiguracao().getRaizUpload() + Dominios.PATH_REMOTE_IMAGES + cor.getCaminhoImagemIndResulCor();
255       File file = new File(path);
256       if (!file.exists())
257         path = null;
258     }
259 
260     return path;
261   } // fim getImagemPersonalizadaIndResul()
262 
263   /**
264    * Realiza a exclusão de cor. Antes de excluir efetivamente, obtem os nomes
265    * das imagens personalizadas, caso existam e tenta realizar a exclusão dos
266    * registros do banco. Caso a exclusão seja bem sucedida, apaga as imagens do
267    * servidor. Caso contrário as mantém para evitar perda de arquivo. <br>
268    * @author rogerio
269    * @since 0.1, 01/03/2007
270    * @version 0.1, 01/03/2007
271    * @param cor
272    * @throws ECARException
273    */
274   public void excluirCor(Cor cor) throws ECARException {
275     List<String> listImages = new ArrayList<String>();
276     List<CorTipoFuncAcompCtfa> listCtfa = new ArrayList<CorTipoFuncAcompCtfa>();
277 
278     /*
279      * -- Obtem o nome das imagens personalizadas do registro da cor e suas
280      * funções de acompanhamento --
281      */
282     try {
283       // Imagem Ponto Crítico
284       listImages.add(cor.getCaminhoImagemPontoCriticoCor());
285 
286       // Imagens de Cor Tipo Função Acompanhamento
287       Query query = session.createQuery(" from CorTipoFuncAcompCtfa " + " where comp_id.codCor = :codCor ");
288 
289       query.setLong("codCor", cor.getCodCor());
290       listCtfa = query.list();
291 
292       for (CorTipoFuncAcompCtfa ctfa : listCtfa)
293         listImages.add(ctfa.getCaminhoImagemCtfa());
294     } catch (Exception e) {
295       this.logger.error(e);
296       throw new ECARException("erro.exception");
297     }
298 
299     /*
300      * -- Apaga os registros do banco de dados. --
301      */
302     try {
303       this.excluir(cor);
304     } catch (Exception e) {
305       this.logger.error(e);
306       throw new ECARException("erro.exception");
307     }
308 
309     /*
310      * -- Se a exclusão dos registros foi bem sucedida, realiza a exclusão das
311      * imagens registradas para estas cores no servidor. --
312      */
313     try {
314       ConfiguracaoDao cDao = new ConfiguracaoDao(request);
315       String pathRoot = cDao.getConfiguracao().getRaizUpload();
316       String fullFile = "";
317 
318       for (int i = 0; i < listImages.size(); i++) {
319         if (listImages.get(i) != null) {
320           fullFile = pathRoot + Dominios.PATH_REMOTE_IMAGES + listImages.get(i);
321 
322           File f = new File(fullFile);
323           if (f.exists())
324             FileUpload.apagarArquivo(fullFile);
325         }
326       }
327     } catch (Exception e) {
328       this.logger.error(e);
329       throw new ECARException("erro.exception");
330     }
331   } // fim excluir()
332 
333   /**
334    * Consulta as cores das posições presentes no gráfico e inicializa o contador
335    * com 0 (Zero);
336    * @return Map com chave = codCor listadas no relatório (arel) com seus valores
337    *         zerados
338    * @author 05110500460
339    */
340 
341   public Map<String, Integer> criarMapCodCorPosicoesGeraisGrafico() throws ECARException {
342     CorDao corDao = new CorDao(null);
343 
344     // Map para as cores configuradas, chave:codigo da cor; valor:quantidade
345     // de vez em que apareceu
346     Map<String, Integer> mapCoresConfiguradas = new HashMap<String, Integer>();
347 
348     /* Cores fixas no sistema */
349     mapCoresConfiguradas.put(Cor.BRANCO, 0);
350     mapCoresConfiguradas.put(Cor.NAO_LIBERADO, 0);
351     mapCoresConfiguradas.put(Cor.NAO_ACOMPANHADO, 0);
352 
353     Iterator<Cor> itCor = corDao.listar(Cor.class, new String[] { "ordemCor", "asc" }).iterator();
354 
355     while (itCor.hasNext()) {
356       Cor cor = itCor.next();
357 
358       if (cor.getIndPosicoesGeraisCor().equals(Pagina.SIM)) {
359         mapCoresConfiguradas.put(cor.getCodCor() + "", 0);
360       }
361     }
362 
363     return mapCoresConfiguradas;
364   }// fim criarMapCodCorPosicoesGeraisGrafico()
365 
366   /**
367    * Conta quantas vezes cada cor apareceu nas posições (acompanhamentos)
368    * @return Map com: <br>
369    *         <b> chave </b>: codigo da cor <b> valor </b>: quantas vezes essa
370    *         cor apareceu
371    */
372   public Map<String, Integer> contadorDePosicoesPorCores(PosicaoBean posicaoBean) throws ECARException {
373     int totalNaoAcompanhado = 0, totalNaoLiberado = 0, totalWhite = 0;
374     Map<String, Integer> mapCoresConfiguradas = this.criarMapCodCorPosicoesGeraisGrafico();
375     Iterator itCoresPosicoes = posicaoBean.getCor().iterator();
376 
377     while (itCoresPosicoes.hasNext()) {
378       String cor = itCoresPosicoes.next().toString();
379       mapCoresConfiguradas.put(cor, mapCoresConfiguradas.get(cor) + 1);
380     }
381 
382     return mapCoresConfiguradas;
383 
384   } // fim contadorDePosicoesPorCores (PosicaoBean posicaoBean)
385 
386   public List<String> ordenarCores(Set<String> setCores) {
387     return ordenarCores(new ArrayList<String>(setCores));
388   }
389 
390   public List<String> ordenarCores(List<String> listCores) {
391 
392     /* Ordena o map na ordem do código das cores */
393     Collections.sort(listCores, new Comparator() {
394 
395       public int compare(Object arg0, Object arg1) {
396 
397         String cor1 = (String) arg0;
398         String cor2 = (String) arg1;
399 
400         boolean codCor1EhValor = Util.ehValor(cor1);
401         boolean codCor2EhValor = Util.ehValor(cor2);
402 
403         if (codCor1EhValor && codCor2EhValor) {
404           Long longCor1 = Long.parseLong(cor1);
405           Long longCor2 = Long.parseLong(cor2);
406           return longCor1.compareTo(longCor2);
407         }
408         else if (codCor1EhValor) {
409           return -1;
410         }
411         else if (codCor2EhValor) {
412           return 1;
413         }
414         else {
415           return cor1.compareTo(cor2);
416         }
417       } // fim compare
418     } // fim Comparator
419     );// fim sort
420 
421     return listCores;
422   }// fim ordenarCores
423 
424 } // fim class