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 +