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 }