java/SuperPostak/src/cz/frantovo/superPostak/Data.java
author František Kučera <franta-hg@frantovo.cz>
Sun, 23 Nov 2008 22:19:20 +0100
changeset 0 e76872ad5226
child 3 03d27d3b3f7b
permissions -rw-r--r--
Přidání SuperPošťáka do Mercurialu (původně byl v Subversionu)
Postak – základ, knihovna
SuperPostak – GUI nadstavba
SuperPostak2 – pokus o implementaci aplikace jako modulu pro Netbeans, POZOR: není přidán do Mercurialu, možná později (pravděpodobně se ale nebude používat)
     1 /*
     2  * To change this template, choose Tools | Templates
     3  * and open the template in the editor.
     4  */
     5 package cz.frantovo.superPostak;
     6 
     7 import java.security.MessageDigest;
     8 import java.security.NoSuchAlgorithmException;
     9 import java.sql.Connection;
    10 import java.sql.DriverManager;
    11 import java.sql.SQLException;
    12 import java.util.Arrays;
    13 import java.util.logging.Level;
    14 import java.util.logging.Logger;
    15 
    16 /**
    17  * Vrstva pro připojení k databázi
    18  * @author fiki
    19  */
    20 public class Data {
    21 
    22     private static Logger log = Logger.getLogger(Data.class.getName());
    23     private static Connection spojeni;
    24     private static byte[] hash;
    25     private static MessageDigest sha;
    26 
    27     public static synchronized DataSQL getSpojeniSQL(String url, String jmeno, char[] heslo) throws SQLException {
    28         return new DataSQL(getSpojeni(url, jmeno, heslo));
    29     }
    30 
    31     private static synchronized Connection getSpojeni(String url, String jmeno, char[] heslo) throws SQLException {
    32         if (Arrays.equals(hash, hashuj(url, jmeno, heslo)) && spojeni != null && !spojeni.isClosed()) {
    33             log.log(Level.INFO, "Znovupoužívám DB spojení.");
    34         } else {
    35             spojeni = getNoveSpojeni(url, jmeno, heslo);
    36         }
    37 
    38         return spojeni;
    39     }
    40 
    41     private static Connection getNoveSpojeni(
    42             String url, String jmeno, char[] heslo) throws SQLException {
    43         /** Pokusíme se uzavřít staré spojení */
    44         if (spojeni != null && !spojeni.isClosed()) {
    45             try {
    46                 spojeni.close();
    47             } catch (Exception e) {
    48                 log.log(Level.INFO, "Nepodařilo se uzavřít spojení", e);
    49             }
    50         }
    51 
    52         /** Vrátíme nové spojení */
    53         hash = hashuj(url, jmeno, heslo);
    54         spojeni = DriverManager.getConnection(url, jmeno, String.valueOf(heslo));
    55         log.log(Level.INFO, "Otevřeno nové spoejní spojení k databázi: " + url);
    56         return spojeni;
    57     }
    58 
    59     private static byte[] hashuj(String url, String jmeno, char[] heslo) {
    60         try {
    61             if (sha == null) {
    62                 sha = MessageDigest.getInstance("SHA-256");
    63             }
    64             String text = url + "/" + jmeno + "/" + String.valueOf(heslo);
    65             return sha.digest(text.getBytes());
    66 
    67         } catch (NoSuchAlgorithmException e) {
    68             /** Tohle by nemělo nikdy nastat. V nouzovém případě použijeme součet hodnot místo hashe. */
    69             log.log(Level.SEVERE, "Neexistující hashovací algoritmus", e);
    70             String soucet = url + "/" + jmeno + String.valueOf(heslo).length();
    71             return soucet.getBytes();
    72         }
    73     }
    74 }
    75 
    76