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)
franta-hg@0
     1
/*
franta-hg@0
     2
 * To change this template, choose Tools | Templates
franta-hg@0
     3
 * and open the template in the editor.
franta-hg@0
     4
 */
franta-hg@0
     5
package cz.frantovo.superPostak;
franta-hg@0
     6
franta-hg@0
     7
import java.security.MessageDigest;
franta-hg@0
     8
import java.security.NoSuchAlgorithmException;
franta-hg@0
     9
import java.sql.Connection;
franta-hg@0
    10
import java.sql.DriverManager;
franta-hg@0
    11
import java.sql.SQLException;
franta-hg@0
    12
import java.util.Arrays;
franta-hg@0
    13
import java.util.logging.Level;
franta-hg@0
    14
import java.util.logging.Logger;
franta-hg@0
    15
franta-hg@0
    16
/**
franta-hg@0
    17
 * Vrstva pro připojení k databázi
franta-hg@0
    18
 * @author fiki
franta-hg@0
    19
 */
franta-hg@0
    20
public class Data {
franta-hg@0
    21
franta-hg@0
    22
    private static Logger log = Logger.getLogger(Data.class.getName());
franta-hg@0
    23
    private static Connection spojeni;
franta-hg@0
    24
    private static byte[] hash;
franta-hg@0
    25
    private static MessageDigest sha;
franta-hg@0
    26
franta-hg@0
    27
    public static synchronized DataSQL getSpojeniSQL(String url, String jmeno, char[] heslo) throws SQLException {
franta-hg@0
    28
        return new DataSQL(getSpojeni(url, jmeno, heslo));
franta-hg@0
    29
    }
franta-hg@0
    30
franta-hg@0
    31
    private static synchronized Connection getSpojeni(String url, String jmeno, char[] heslo) throws SQLException {
franta-hg@0
    32
        if (Arrays.equals(hash, hashuj(url, jmeno, heslo)) && spojeni != null && !spojeni.isClosed()) {
franta-hg@0
    33
            log.log(Level.INFO, "Znovupoužívám DB spojení.");
franta-hg@0
    34
        } else {
franta-hg@0
    35
            spojeni = getNoveSpojeni(url, jmeno, heslo);
franta-hg@0
    36
        }
franta-hg@0
    37
franta-hg@0
    38
        return spojeni;
franta-hg@0
    39
    }
franta-hg@0
    40
franta-hg@0
    41
    private static Connection getNoveSpojeni(
franta-hg@0
    42
            String url, String jmeno, char[] heslo) throws SQLException {
franta-hg@0
    43
        /** Pokusíme se uzavřít staré spojení */
franta-hg@0
    44
        if (spojeni != null && !spojeni.isClosed()) {
franta-hg@0
    45
            try {
franta-hg@0
    46
                spojeni.close();
franta-hg@0
    47
            } catch (Exception e) {
franta-hg@0
    48
                log.log(Level.INFO, "Nepodařilo se uzavřít spojení", e);
franta-hg@0
    49
            }
franta-hg@0
    50
        }
franta-hg@0
    51
franta-hg@0
    52
        /** Vrátíme nové spojení */
franta-hg@0
    53
        hash = hashuj(url, jmeno, heslo);
franta-hg@0
    54
        spojeni = DriverManager.getConnection(url, jmeno, String.valueOf(heslo));
franta-hg@0
    55
        log.log(Level.INFO, "Otevřeno nové spoejní spojení k databázi: " + url);
franta-hg@0
    56
        return spojeni;
franta-hg@0
    57
    }
franta-hg@0
    58
franta-hg@0
    59
    private static byte[] hashuj(String url, String jmeno, char[] heslo) {
franta-hg@0
    60
        try {
franta-hg@0
    61
            if (sha == null) {
franta-hg@0
    62
                sha = MessageDigest.getInstance("SHA-256");
franta-hg@0
    63
            }
franta-hg@0
    64
            String text = url + "/" + jmeno + "/" + String.valueOf(heslo);
franta-hg@0
    65
            return sha.digest(text.getBytes());
franta-hg@0
    66
franta-hg@0
    67
        } catch (NoSuchAlgorithmException e) {
franta-hg@0
    68
            /** Tohle by nemělo nikdy nastat. V nouzovém případě použijeme součet hodnot místo hashe. */
franta-hg@0
    69
            log.log(Level.SEVERE, "Neexistující hashovací algoritmus", e);
franta-hg@0
    70
            String soucet = url + "/" + jmeno + String.valueOf(heslo).length();
franta-hg@0
    71
            return soucet.getBytes();
franta-hg@0
    72
        }
franta-hg@0
    73
    }
franta-hg@0
    74
}
franta-hg@0
    75
franta-hg@0
    76