java/SuperPostak/src/cz/frantovo/superPostak/Data.java
author František Kučera <franta-hg@frantovo.cz>
Tue Nov 29 17:16:47 2011 +0100 (2011-11-29)
changeset 13 b15d81be8af3
parent 3 03d27d3b3f7b
permissions -rw-r--r--
drobnosti: lgoování, formátování, netbeans…
     1 package cz.frantovo.superPostak;
     2 
     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;
    11 
    12 /**
    13  * Vrstva pro připojení k databázi
    14  * @author fiki
    15  */
    16 public class Data {
    17 
    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;
    22 
    23     public static synchronized DataSQL getSpojeniSQL(String url, String jmeno, char[] heslo) throws SQLException {
    24         return new DataSQL(getSpojeni(url, jmeno, heslo));
    25     }
    26 
    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í.");
    30         } else {
    31             spojeni = getNoveSpojeni(url, jmeno, heslo);
    32         }
    33 
    34         return spojeni;
    35     }
    36 
    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()) {
    41             try {
    42                 spojeni.close();
    43             } catch (Exception e) {
    44                 log.log(Level.INFO, "Nepodařilo se uzavřít spojení", e);
    45             }
    46         }
    47 
    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);
    52         return spojeni;
    53     }
    54 
    55     private static byte[] hashuj(String url, String jmeno, char[] heslo) {
    56         try {
    57             if (sha == null) {
    58                 sha = MessageDigest.getInstance("SHA-256");
    59             }
    60             String text = url + "/" + jmeno + "/" + String.valueOf(heslo);
    61             return sha.digest(text.getBytes());
    62 
    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();
    68         }
    69     }
    70 }
    71 
    72