java/SuperPostak/src/cz/frantovo/superPostak/Data.java
changeset 0 e76872ad5226
child 3 03d27d3b3f7b
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/java/SuperPostak/src/cz/frantovo/superPostak/Data.java	Sun Nov 23 22:19:20 2008 +0100
     1.3 @@ -0,0 +1,76 @@
     1.4 +/*
     1.5 + * To change this template, choose Tools | Templates
     1.6 + * and open the template in the editor.
     1.7 + */
     1.8 +package cz.frantovo.superPostak;
     1.9 +
    1.10 +import java.security.MessageDigest;
    1.11 +import java.security.NoSuchAlgorithmException;
    1.12 +import java.sql.Connection;
    1.13 +import java.sql.DriverManager;
    1.14 +import java.sql.SQLException;
    1.15 +import java.util.Arrays;
    1.16 +import java.util.logging.Level;
    1.17 +import java.util.logging.Logger;
    1.18 +
    1.19 +/**
    1.20 + * Vrstva pro připojení k databázi
    1.21 + * @author fiki
    1.22 + */
    1.23 +public class Data {
    1.24 +
    1.25 +    private static Logger log = Logger.getLogger(Data.class.getName());
    1.26 +    private static Connection spojeni;
    1.27 +    private static byte[] hash;
    1.28 +    private static MessageDigest sha;
    1.29 +
    1.30 +    public static synchronized DataSQL getSpojeniSQL(String url, String jmeno, char[] heslo) throws SQLException {
    1.31 +        return new DataSQL(getSpojeni(url, jmeno, heslo));
    1.32 +    }
    1.33 +
    1.34 +    private static synchronized Connection getSpojeni(String url, String jmeno, char[] heslo) throws SQLException {
    1.35 +        if (Arrays.equals(hash, hashuj(url, jmeno, heslo)) && spojeni != null && !spojeni.isClosed()) {
    1.36 +            log.log(Level.INFO, "Znovupoužívám DB spojení.");
    1.37 +        } else {
    1.38 +            spojeni = getNoveSpojeni(url, jmeno, heslo);
    1.39 +        }
    1.40 +
    1.41 +        return spojeni;
    1.42 +    }
    1.43 +
    1.44 +    private static Connection getNoveSpojeni(
    1.45 +            String url, String jmeno, char[] heslo) throws SQLException {
    1.46 +        /** Pokusíme se uzavřít staré spojení */
    1.47 +        if (spojeni != null && !spojeni.isClosed()) {
    1.48 +            try {
    1.49 +                spojeni.close();
    1.50 +            } catch (Exception e) {
    1.51 +                log.log(Level.INFO, "Nepodařilo se uzavřít spojení", e);
    1.52 +            }
    1.53 +        }
    1.54 +
    1.55 +        /** Vrátíme nové spojení */
    1.56 +        hash = hashuj(url, jmeno, heslo);
    1.57 +        spojeni = DriverManager.getConnection(url, jmeno, String.valueOf(heslo));
    1.58 +        log.log(Level.INFO, "Otevřeno nové spoejní spojení k databázi: " + url);
    1.59 +        return spojeni;
    1.60 +    }
    1.61 +
    1.62 +    private static byte[] hashuj(String url, String jmeno, char[] heslo) {
    1.63 +        try {
    1.64 +            if (sha == null) {
    1.65 +                sha = MessageDigest.getInstance("SHA-256");
    1.66 +            }
    1.67 +            String text = url + "/" + jmeno + "/" + String.valueOf(heslo);
    1.68 +            return sha.digest(text.getBytes());
    1.69 +
    1.70 +        } catch (NoSuchAlgorithmException e) {
    1.71 +            /** Tohle by nemělo nikdy nastat. V nouzovém případě použijeme součet hodnot místo hashe. */
    1.72 +            log.log(Level.SEVERE, "Neexistující hashovací algoritmus", e);
    1.73 +            String soucet = url + "/" + jmeno + String.valueOf(heslo).length();
    1.74 +            return soucet.getBytes();
    1.75 +        }
    1.76 +    }
    1.77 +}
    1.78 +
    1.79 +