View Javadoc

1   /**
2    * Copyright 2008 WebPhotos
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package net.sf.webphotos;
17  
18  import com.google.common.base.Function;
19  import java.awt.Dimension;
20  import java.awt.MediaTracker;
21  import java.io.File;
22  import java.sql.SQLException;
23  import java.sql.Statement;
24  import java.util.List;
25  import javax.swing.ImageIcon;
26  import net.sf.webphotos.dao.jpa.PhotoDAO;
27  import net.sf.webphotos.entity.IsCredits;
28  import net.sf.webphotos.entity.PhotoEntity;
29  import net.sf.webphotos.model.CreditsVO;
30  import net.sf.webphotos.model.PhotoVO;
31  import net.sf.webphotos.util.ApplicationContextResource;
32  import net.sf.webphotos.util.Util;
33  
34  /**
35   * A classe PhotoDTO armazena dados específicos de uma foto. Dentre os dados estão
36   * ID da foto,ID do album e ID do crédito, legenda, crédito e resolução de tela.
37   */
38  public class PhotoDTO extends PhotoEntity {
39      
40      /**
41       *
42       */
43      public static final Function<PhotoDTO, PhotoVO> FROM_PHOTODTO_PHOTOVO = new Function<PhotoDTO, PhotoVO>() {
44          @Override
45          public PhotoVO apply(PhotoDTO input) {
46              return new PhotoVO(input.getLegenda(), input.getLegenda(), new CreditsVO(input.creditoID, input.creditoNome), input.caminhoArquivo);
47          }
48      };
49  
50      private int fotoID = 0;
51      private int albumID = -1;
52      private int creditoID = 0;
53      private String legenda = null;
54      private int largura = 0;
55      private int altura = 0;
56      @Deprecated
57      private long tamanhoBytes = 0;
58      private String creditoNome = "";
59      private String caminhoArquivo = "";
60      private static PhotoDAO photosDAO = (PhotoDAO) ApplicationContextResource.getBean("photosDAO");
61      private static String[][] creditos = null;
62  
63      public PhotoDTO(PhotoVO photoVO) {
64          this(photoVO.getFotoid(), photoVO.getAlbum().getAlbumid(), photoVO.getLegenda(), photoVO.getCreditos().getCreditoid(), photoVO.getCreditos().getNome(), 0, 0, 0);
65      }
66  
67      /**
68       * Construtor da classe PhotoDTO. Recebe e seta todos os dados da foto.
69       *
70       * @param ID ID da foto.
71       * @param albumID ID do album.
72       * @param fotoLegenda Legenda da foto.
73       * @param fotoCreditoID ID do créito.
74       * @param fotoCreditoNome Crédito.
75       * @param fotoLargura Largura da foto.
76       * @param fotoAltura Altura da foto.
77       */
78      public PhotoDTO(int ID, int albumID, String fotoLegenda, int fotoCreditoID, String fotoCreditoNome, int fotoLargura, int fotoAltura, long tamanhoBytes) {
79          this.fotoID = ID;
80          this.albumID = albumID;
81          this.legenda = fotoLegenda;
82          this.creditoID = fotoCreditoID;
83          this.creditoNome = fotoCreditoNome;
84          this.largura = fotoLargura;
85          this.altura = fotoAltura;
86          this.tamanhoBytes = tamanhoBytes;
87      }
88  
89      /**
90       * Contrutor da classe PhotoDTO. Recebe apenas nome do arquivo como
91       * parametro. Seta a legenda com o valor vazio, e seta caminhoArquivo com
92       * o nome recebido como parametro. Carrega a foto a partir do nome do
93       * arquivo, obtem medidas da foto e seta as variaveis de largura e
94       * altura.
95       *
96       * @param arquivo Nome ou caminho do arquivo.
97       */
98      public PhotoDTO(String arquivo) {
99          legenda = "";
100         caminhoArquivo = arquivo;
101         // obtem medidas da foto
102         ImageIcon a = new ImageIcon(arquivo);
103 
104         if (a.getImageLoadStatus() == MediaTracker.COMPLETE) {
105             largura = a.getIconWidth();
106             altura = a.getIconHeight();
107             tamanhoBytes = new File(arquivo).length();
108         } else {
109             Util.log("[Foto.Foto]/ERRO: " + arquivo + " Não pode ser lido");
110         }
111     }
112 
113     /**
114      * Retorna o ID da foto.
115      *
116      * @return Retorna um ID.
117      */
118     public int getFotoID() {
119         return fotoID;
120     }
121 
122     /**
123      * Retorna o ID do crédito.
124      *
125      * @return Retorna um ID.
126      */
127     public int getCreditoID() {
128         return creditoID;
129     }
130 
131     /**
132      * Retorna o crédito da foto.
133      *
134      * @return Retorna o crédito.
135      */
136     public String getCreditoNome() {
137         return creditoNome;
138     }
139 
140     /**
141      * Retorna a legenda da foto.
142      *
143      * @return Retorna a legenda.
144      */
145     @Override
146     public String getLegenda() {
147         return legenda;
148     }
149 
150     /**
151      * Retorna o tamanho da largura da foto.
152      *
153      * @return Retorna o valor da largura.
154      */
155     public int getLargura() {
156         return largura;
157     }
158 
159     /**
160      * Retorna o tamanho da altura da foto.
161      *
162      * @return Retorna o valor da altura.
163      */
164     public int getAltura() {
165         return altura;
166     }
167 
168     /**
169      * Retorna uma resolução especifica com os valores de altura e largura.
170      * Para entender melhor os conceitos de dimensão veja {@link java.awt.Dimension Dimension}
171      *
172      * @return Retorna uma resolução.
173      */
174     public Dimension getResolucao() {
175         return new Dimension(largura, altura);
176     }
177 
178     /**
179      * Retorna o nome ou o caminho do arquivo.
180      *
181      * @return Retorna o caminho de um arquivo
182      */
183     public String getCaminhoArquivo() {
184         return caminhoArquivo;
185     }
186 
187     /**
188      * Seta o ID da foto.
189      *
190      * @param f ID da foto.
191      */
192     public void setFotoID(int f) {
193         fotoID = f;
194     }
195 
196     /**
197      * Seta o ID do credito.
198      *
199      * @param c ID do credito.
200      */
201     public void setCreditoID(int c) {
202         creditoID = c;
203     }
204 
205     /**
206      * Seta a legenda da foto.
207      *
208      * @param l Legenda.
209      */
210     public void setLegenda(String l) {
211         legenda = l;
212     }
213 
214     /**
215      * Seta o valor da largura da foto.
216      *
217      * @param l Largura da foto.
218      */
219     public void setLargura(int l) {
220         largura = l;
221     }
222 
223     /**
224      * Seta o valor da altura da foto.
225      *
226      * @param a Altura da foto.
227      */
228     public void setAltura(int a) {
229         altura = a;
230     }
231 
232     /**
233      * Seta o valor da resolução da foto.
234      *
235      * @param r Dimensão da foto. Para entender melhor os conceitos de dimensão
236      * veja {@link java.awt.Dimension Dimension}
237      */
238     public void setResolucao(Dimension r) {
239         largura = r.width;
240         altura = r.height;
241     }
242 
243     /**
244      * Seta o credito da foto e completa o creditoID.
245      *
246      * @param nome Credito.
247      */
248     public void setCreditoNome(String nome) {
249         creditoNome = nome;
250         // pesquisa no array creditos e completa creditoID
251         if (creditos != null) {
252             for (int i = 0; i < creditos.length; i++) {
253                 if (creditoNome.equals(creditos[i][1])) {
254                     creditoID = Integer.parseInt(creditos[i][0]);
255                     break;
256                 }
257             }
258         }
259     }
260 
261     /**
262      * Retorna um vetor com os valores de credito. Checa se o vetor ja
263      * possui valores, caso contrario utiliza a função {@link net.sf.webphotos.PhotoDTO#populaCreditos() populaCreditos()}
264      * completar os valores.
265      *
266      * @return Retorna uma lista com os creditos.
267      */
268     public static String[] getCreditosArray() {
269         int tamanho;
270         // executa a instrucao sql somente na primeira vez
271         if (creditos == null) {
272             try {
273                 Util.log("[Foto.getCreditosArray]/AVISO: Populando Créditos");
274                 populaCreditos();
275                 tamanho = creditos.length;
276             } catch (SQLException ex) {
277                 Util.log("[Foto.getCreditosArray]/ERRO: Impossível popular Créditos - " + ex);
278                 tamanho = 0;
279             }
280         } else {
281             tamanho = creditos.length;
282         }
283 
284         String[] nomesCreditos = new String[tamanho];
285         for (int i = 0; i < tamanho; i++) {
286             nomesCreditos[i] = creditos[i][1];
287         }
288 
289         return nomesCreditos;
290     }
291 
292     /**
293      * Retorna um índice da matriz créditos dado um nome de crédito.
294      *
295      * @param nomeCredito Crédito.
296      * @return Retorna um índice numérico.
297      */
298     public static int getLstCreditosIndex(String nomeCredito) {
299         for (int i = 0; i < creditos.length; i++) {
300             if (nomeCredito.compareTo(creditos[i][1]) == 0) {
301                 return i;
302             }
303         }
304 
305         return 0;
306     }
307 
308     /**
309      * Retorna o ID do crédito. Faz a busca do ID na matriz credito através do
310      * nome especificado.
311      *
312      * @param nomeCredito Crédito.
313      * @return Retorna um ID numérico.
314      */
315     public static int getLstCreditosID(String nomeCredito) {
316         for (int i = 0; i < creditos.length; i++) {
317             if (nomeCredito.equals(creditos[i][1])) {
318                 return Integer.parseInt(creditos[i][0]);
319             }
320         }
321         return 0;
322     }
323 
324     /**
325      * Busca no banco de dados, os valores para setar a matriz creditos
326      *
327      * @throws java.sql.SQLException Lança exceção caso ocorra algum erro no
328      * acesso ao banco de dados.
329      */
330     public static void populaCreditos() throws SQLException {
331         String sql = Util.getConfig().getString("sql7");
332 
333         List<Object[]> tableData = photosDAO.findByNativeQuery(sql);
334 
335         creditos = new String[tableData.size()][2];
336 
337         int ct = 0;
338         for (Object[] objects : tableData) {
339             creditos[ct][0] = objects[0].toString();
340             creditos[ct][1] = objects[1].toString();
341             ct++;
342         }
343 
344     }
345 
346     /**
347      * Retorna todos os valores das variaveis de PhotoDTO em uma unica String.
348      *
349      * @return Retorna os valores da foto.
350      */
351     @Override
352     public String toString() {
353         return "fotoID: " + fotoID + "\ncreditoID: " + creditoID + "\ncreditoNome: " + creditoNome + "\nlargura: " + largura + "\naltura: " + altura + "\narquivo: " + caminhoArquivo + "\nlegenda: " + legenda;
354     }
355 
356     /**
357      * Limpa o valor da variavel caminhoArquivo. Seta com o campo vazio.
358      */
359     public void resetCaminhoArquivo() {
360         caminhoArquivo = "";
361     }
362 
363     /**
364      * Faz a atualização dos dados da foto. Checa se a foto já possui cadastro,
365      * caso Não possui faz inclusão e faz a atualização. Caso ja possua
366      * cadastro, so atualiza os dados.
367      *
368      * @throws java.lang.Exception Lança qualquer tipo de exceção que possa
369      * interromper o fluxo da função.
370      */
371     public void atualizaFoto() throws Exception {
372         int ultimoFotoID = -1;
373         String sql;
374         Statement st = null;
375 
376         // INSERT para fotos ainda Não cadastradas
377         if (caminhoArquivo.length() > 0) {
378             try {
379                 sql = "select max(fotoID) from fotos";
380                 Integer tableData = (Integer) photosDAO.createNativeQuery(sql).getSingleResult();
381 
382                 ultimoFotoID = tableData.intValue();
383             } catch (Exception ex) {
384                 Util.log("[Foto.atualizaFoto]/ERRO: " + ex);
385             }
386             setFotoID(ultimoFotoID);
387 
388 
389             try {
390                 PhotoVO photoVO = new PhotoVO(fotoID, albumID, legenda, creditoID, largura, altura);
391                 photosDAO.save(photoVO);
392             } catch (Exception e) {
393                 Util.log("[Foto.atualizaFoto]/ERRO: " + e);
394                 throw e;
395             }
396 
397             // UPDATE para fotos já cadastradas
398         } else {
399             try {
400                 PhotoVO photoVO = photosDAO.findBy(fotoID);
401                 photoVO.setLegenda(legenda);
402                 photosDAO.save(photoVO);
403             } catch (Exception e) {
404                 Util.log("[Foto.atualizaFoto]/ERRO: " + e);
405                 throw e;
406             }
407         }
408 
409         try {
410             st.close();
411         } catch (Exception e) {
412         }
413     }
414 
415     /**
416      * Retorna o ID do album.
417      *
418      * @return Retorna um ID.
419      */
420     public int getAlbumID() {
421         return albumID;
422     }
423 
424     /**
425      * Seta o valor do ID do album
426      *
427      * @param albumID ID do album.
428      */
429     public void setAlbumID(int albumID) {
430         this.albumID = albumID;
431     }
432 
433     @Override
434     public String getKey() {
435         return this.caminhoArquivo;
436     }
437 
438     @Override
439     public IsCredits getCreditos() {
440         return new CreditsVO(creditoID, creditoNome);
441     }
442 }