1 package cz.frantovo.superPostak;
3 import java.security.MessageDigest;
4 import java.security.NoSuchAlgorithmException;
5 import java.sql.Connection;
6 import java.sql.DriverManager;
7 import java.sql.SQLException;
8 import java.util.Arrays;
9 import java.util.logging.Level;
10 import java.util.logging.Logger;
13 * Vrstva pro připojení k databázi
18 private static final Logger log = Logger.getLogger(Data.class.getName());
19 private static Connection spojeni;
20 private static byte[] hash;
21 private static MessageDigest sha;
23 public static synchronized DataSQL getSpojeniSQL(String url, String jmeno, char[] heslo) throws SQLException {
24 return new DataSQL(getSpojeni(url, jmeno, heslo));
27 private static synchronized Connection getSpojeni(String url, String jmeno, char[] heslo) throws SQLException {
28 if (Arrays.equals(hash, hashuj(url, jmeno, heslo)) && spojeni != null && !spojeni.isClosed()) {
29 log.log(Level.INFO, "Znovupoužívám DB spojení.");
31 spojeni = getNoveSpojeni(url, jmeno, heslo);
37 private static Connection getNoveSpojeni(
38 String url, String jmeno, char[] heslo) throws SQLException {
39 /** Pokusíme se uzavřít staré spojení */
40 if (spojeni != null && !spojeni.isClosed()) {
43 } catch (Exception e) {
44 log.log(Level.INFO, "Nepodařilo se uzavřít spojení", e);
48 /** Vrátíme nové spojení */
49 hash = hashuj(url, jmeno, heslo);
50 spojeni = DriverManager.getConnection(url, jmeno, String.valueOf(heslo));
51 log.log(Level.INFO, "Otevřeno nové spoejní spojení k databázi: {0}", url);
55 private static byte[] hashuj(String url, String jmeno, char[] heslo) {
58 sha = MessageDigest.getInstance("SHA-256");
60 String text = url + "/" + jmeno + "/" + String.valueOf(heslo);
61 return sha.digest(text.getBytes());
63 } catch (NoSuchAlgorithmException e) {
64 /** Tohle by nemělo nikdy nastat. V nouzovém případě použijeme součet hodnot místo hashe. */
65 log.log(Level.SEVERE, "Neexistující hashovací algoritmus", e);
66 String soucet = url + "/" + jmeno + String.valueOf(heslo).length();
67 return soucet.getBytes();