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.sun.rowset.JdbcRowSetImpl;
19  import java.io.File;
20  import java.sql.Connection;
21  import java.sql.DriverManager;
22  import java.sql.ResultSet;
23  import java.sql.SQLException;
24  import javax.sql.RowSet;
25  import javax.sql.rowset.JdbcRowSet;
26  import javax.swing.JOptionPane;
27  import javax.swing.UIManager;
28  import net.sf.webphotos.gui.util.Login;
29  import net.sf.webphotos.util.Util;
30  import org.apache.commons.configuration.Configuration;
31  import org.apache.log4j.Logger;
32  
33  /**
34   * A classe BancoImagem manipula dados das imagens através da conexão com banco
35   * de dados. Classe do tipo Singleton, é permitido apenas uma instância da
36   * classe. O objeto é acessível unicamente através da classe. Mantém uma conexao
37   * permanente com banco de dados.
38   */
39  public class BancoImagem {
40  
41      private static Logger log = Logger.getLogger(BancoImagem.class);
42      private static final BancoImagem instancia = new BancoImagem();
43      private static String titulo;
44      private static String descricao;
45      private static int categoriaID;
46      private static String url;
47      private static String driver;
48      private static Connection conn;
49      private static File albunsRoot;
50      // informações sobre uso da ponte www
51      private static boolean utilizarPonteWWW;
52      private static String webServer;
53      private static String chaveCripto;
54      // usuário principal do sistema
55      private static String usuario = null;
56      private static char[] senha = null;
57      // caso o usuário ftp seja diferente...
58      private static String usuarioFTP = null;
59      private static char[] senhaFTP = null;
60      private static Login login;
61      @Deprecated
62      private static RowSet rSet;
63  
64      // inicializa o banco de dados
65      private BancoImagem() {
66          Configuration c = Util.getConfig();
67          log.info("inicializando banco de imagem...");
68          webServer = c.getString("enderecoWWW");
69          chaveCripto = c.getString("chaveCripto");
70  
71          if (webServer != null && chaveCripto != null) {
72              log.info("utilizando ponte http");
73              utilizarPonteWWW = true;
74          }
75      }
76  
77      /**
78       * Retorna o objeto BancoImagem instanciado na própria classe.
79       *
80       * @return Retorna o objeto BancoImagem.
81       */
82      public static BancoImagem getBancoImagem() {
83          return instancia;
84      }
85  
86      /**
87       * Recebe o ID de um albúm e retorna o caminho do path local
88       *
89       * @param albumID ID do albúm.
90       * @return Retorna o caminho do path local.
91       */
92      public static String getLocalPath(int albumID) {
93          if (albunsRoot == null) {
94              albunsRoot = new File(Util.getConfig().getString("albunsRoot"));
95          }
96  
97          File localFile = new File(albunsRoot, Integer.toString(albumID));
98          if (!localFile.isDirectory()) {
99              localFile.mkdirs();
100         }
101         return localFile.getAbsolutePath();
102     }
103 
104     /**
105      * Configura a URL e o driver do DB.
106      *
107      * @param dbUrl URL do DB.
108      * @param dbDriver Driver do DB.
109      * @throws java.lang.ClassNotFoundException Lança exceção caso a classe
110      * específica não seja encontrada.
111      * @throws java.lang.InstantiationException Lança exceção caso não permita a
112      * instância de um objeto da classe.
113      * @throws java.lang.IllegalAccessException Lança exceção se ocorrer um
114      * acesso qualquer e o nível de segurança não permitir.
115      * @throws java.sql.SQLException Lança exceção caso ocorra algum erro ao
116      * acessar o banco de dados.
117      */
118     public void configure(String dbUrl, String dbDriver)
119             throws ClassNotFoundException,
120             InstantiationException,
121             IllegalAccessException,
122             SQLException {
123         url = dbUrl;
124         driver = dbDriver;
125         Class.forName(dbDriver).newInstance();
126         log.info("Driver " + dbDriver + " carregado");
127     }
128 
129     /**
130      * Retorna uma conexão ao banco de dados. Testa se a conexão já esta aberta,
131      * caso positivo retorna a conexão, caso contrário pede o login e faz a
132      * conexão.
133      *
134      * @return Retorna a conexão com o banco de dados.
135      * @throws java.sql.SQLException Lança exceção caso ocorra algum erro ao
136      * acessar o banco de dados. Mais detalhes, veja em
137      * {@link java.sql.DriverManager#getConnection(String, String, String) getConnection()}
138      */
139     public static Connection getConnection() throws SQLException {
140         try {
141             if (conn != null
142                     && conn.isClosed() == false) {
143 
144                 log.debug("Usando a conexão existente");
145                 return conn;
146             }
147         } catch (AbstractMethodError amE) {
148             log.warn("Error getting conection", amE);
149         }
150         // conexão fechada...	
151         if (usuario == null) {
152             login();
153         }
154         conn = DriverManager.getConnection(url, usuario, (new String(senha)));
155         log.debug("Usando uma nova conexão");
156         return conn;
157     }
158 
159     /**
160      * Fecha uma conexão com o banco de dados. Testa se a conexão esta aberta e
161      * encerra a mesma.
162      *
163      * @throws java.sql.SQLException Lança exceção caso ocorra algum erro ao
164      * acessar o banco de dados.
165      */
166     public static void closeConnection() throws SQLException {
167         if (conn.isClosed() == false) {
168             conn.close();
169         }
170         log.debug("Conexao ao banco de dados fechada");
171     }
172 
173     /**
174      * Retorna <I>true</I> caso o login seja efetuado ou <I>false</I> caso não.
175      * Faz uso da função
176      * {@link net.sf.webphotos.BancoImagem#login(String) login(String title)}
177      * para obter o resultado.
178      *
179      * @return Retorno lógico para a operação de login.
180      */
181     public static boolean login() {
182         return login("WebPhotos - Login BD");
183     }
184 
185     /**
186      * Inicia o login partir de um nome passado como parâmetro. Esse nome
187      * realizará alteração na instancia da classe
188      * {@link net.sf.webphotos.gui.util.Login Login}. Faz a comparação com o
189      * banco de dados através do {@link javax.sql.RowSet RowSet} e retorna uma
190      * variável lógica para informar se o login ocorreu com sucesso.
191      *
192      * @param title Título do login.
193      * @return Retorno lógico para a operação de login.
194      */
195     public static boolean login(String title) {
196         Login l = Login.getLogin(title);
197         boolean conectado = false;
198 
199         do {
200             l.show();
201             if (l.getUser() == null) {
202                 System.exit(0);
203             }
204 
205             usuario = l.getUser();
206             senha = l.getPassword();
207             try {
208                 conn = DriverManager.getConnection(url, usuario, (new String(senha)));
209 
210                 rSet = new JdbcRowSetImpl(conn);
211                 rSet.setReadOnly(false);
212                 rSet.setType(ResultSet.TYPE_SCROLL_INSENSITIVE);
213                 rSet.setConcurrency(ResultSet.CONCUR_UPDATABLE);
214                 ((JdbcRowSet) rSet).setAutoCommit(false);
215 
216                 conectado = true;
217             } catch (Exception e) {
218                 String msg = "Erro na conexão ao banco de dados";
219                 log.error(msg, e);
220                 JOptionPane.showMessageDialog(null, e.getMessage(), msg, JOptionPane.ERROR_MESSAGE);
221             }
222         } while (!conectado);
223 
224         Login.getTelaLogin().dispose();
225         return true;
226     }
227 
228     /**
229      * Retorna o usuário.
230      *
231      * @return Retorna um usuário.
232      */
233     public String getUser() {
234         return usuario;
235     }
236 
237     /**
238      * Retorna a senha do usuário.
239      *
240      * @return Retorna uma senha.
241      */
242     public char[] getPassword() {
243         return senha;
244     }
245 
246     /**
247      * Retorna o usuário de FTP.
248      *
249      * @return Retorna um usuário.
250      */
251     public String getUserFTP() {
252         return usuarioFTP;
253     }
254 
255     /**
256      * Retorna a senha do usuário de FTP.
257      *
258      * @return Retorna uma senha.
259      */
260     public char[] getPasswordFTP() {
261         return senhaFTP;
262     }
263 
264     /**
265      * Seta o usuário de FTP.
266      *
267      * @param u Usuário.
268      */
269     public void setUserFTP(String u) {
270         usuarioFTP = u;
271     }
272 
273     /**
274      * Seta a senha do usuário de FTP.
275      *
276      * @param p Senha.
277      */
278     public void setPasswordFTP(char[] p) {
279         senhaFTP = p;
280     }
281 
282     /**
283      * Retorna o {@link javax.sql.RowSet RowSet} rSet da instancia de
284      * BancoImagem.
285      *
286      * @return Retorna o {@link javax.sql.RowSet RowSet} da instância.
287      */
288     @Deprecated
289     public static RowSet getRSet() {
290         return rSet;
291     }
292 
293     /**
294      * Altera o {@link javax.sql.RowSet RowSet} rSet da instancia de
295      * BancoImagem.
296      *
297      * @param aRSet o novo {@link javax.sql.RowSet RowSet} da instância.
298      */
299     @Deprecated
300     public static void setRSet(RowSet aRSet) {
301         rSet = aRSet;
302     }
303 
304     @Override
305     public Object clone() throws CloneNotSupportedException {
306         throw new CloneNotSupportedException("Singleton Object");
307     }
308 
309     public static void loadUIManager() {
310         String lookAndFeel = Util.getConfig().getString("UIManager.lookAndFeel");
311         try {
312             UIManager.setLookAndFeel(lookAndFeel);
313         } catch (Exception e) {
314             log.warn("Caution: Theme not correctly configured");
315             //UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
316         }
317     }
318 
319     public static void loadDBDriver() throws IllegalAccessException, SQLException, ClassNotFoundException, InstantiationException {
320         // obtém driver do db
321         url = Util.getConfig().getString("jdbc.url");
322         driver = Util.getConfig().getString("jdbc.driver");
323         getBancoImagem().configure(url, driver);
324     }
325 }