java/HrisniciSpameri/src/java/cz/frantovo/hrisniciSpameri/dao/GeneratorSouhrnuDAO.java
author František Kučera <franta-hg@frantovo.cz>
Sun, 15 Feb 2009 23:22:23 +0100
changeset 32 3bc16e43872b
parent 28 dbb434bd4b99
permissions -rw-r--r--
Generování souhrnu: překlad IP adres probíhá až ve druhém kroku.
Výchozí období pro generování: poslední měsíc.
franta-hg@22
     1
package cz.frantovo.hrisniciSpameri.dao;
franta-hg@22
     2
franta-hg@22
     3
import cz.frantovo.hrisniciSpameri.dto.Cil;
franta-hg@23
     4
import java.net.InetAddress;
franta-hg@22
     5
import java.sql.Connection;
franta-hg@22
     6
import java.sql.Date;
franta-hg@22
     7
import java.sql.PreparedStatement;
franta-hg@22
     8
import java.sql.ResultSet;
franta-hg@22
     9
import java.util.Collection;
franta-hg@22
    10
import java.util.logging.Level;
franta-hg@22
    11
franta-hg@22
    12
/**
franta-hg@22
    13
 *
franta-hg@22
    14
 * @author fiki
franta-hg@22
    15
 */
franta-hg@22
    16
public class GeneratorSouhrnuDAO extends HrisniciSuperDAO {
franta-hg@22
    17
franta-hg@22
    18
    private enum SQL {
franta-hg@22
    19
franta-hg@23
    20
        VLOZ_SOUHRN,
franta-hg@32
    21
        SMAZ_SOUHRNY,
franta-hg@32
    22
        IP_ADRESY_OBDOBI,
franta-hg@32
    23
        IP_PREKLAD
franta-hg@22
    24
    }
franta-hg@22
    25
franta-hg@22
    26
    /**
franta-hg@22
    27
     * Vygeneruje souhrn pro daný cíl a datum a uloží ho do databáze
franta-hg@22
    28
     * @param cil cíl, pro který generujeme souhrn
franta-hg@22
    29
     * @param den den, pro který souhrn generujeme.
franta-hg@22
    30
     */
franta-hg@28
    31
    public void generujSouhrn(Cil cil, Date zacatek, Date konec) {
franta-hg@22
    32
        Connection dbZdroj = getSpojeni(cil.getDatabaze());
franta-hg@22
    33
        Connection dbSouhrn = getSpojeni(null);
franta-hg@22
    34
franta-hg@28
    35
        if (konec == null) {
franta-hg@28
    36
            konec = zacatek;
franta-hg@28
    37
        }
franta-hg@28
    38
franta-hg@22
    39
        if (dbZdroj == null || dbSouhrn == null) {
franta-hg@22
    40
            /** TODO: Chyba spojení */
franta-hg@22
    41
        } else {
franta-hg@22
    42
            PreparedStatement ps = null;
franta-hg@23
    43
            PreparedStatement psSmazat = null;
franta-hg@22
    44
            ResultSet rs = null;
franta-hg@22
    45
            try {
franta-hg@23
    46
                /** pokud už něco vygenerovaného pro daný den a cíl máme, smažeme to */
franta-hg@23
    47
                psSmazat = dbSouhrn.prepareStatement(getSQL(SQL.SMAZ_SOUHRNY));
franta-hg@23
    48
                psSmazat.setInt(1, cil.getId());
franta-hg@28
    49
                psSmazat.setDate(2, zacatek);
franta-hg@28
    50
                psSmazat.setDate(3, konec);
franta-hg@23
    51
                psSmazat.executeUpdate();
franta-hg@23
    52
franta-hg@22
    53
                ps = dbZdroj.prepareStatement(cil.getSelekt());
franta-hg@28
    54
                ps.setDate(1, zacatek);
franta-hg@28
    55
                ps.setDate(2, konec);
franta-hg@22
    56
                rs = ps.executeQuery();
franta-hg@22
    57
                PreparedStatement psSouhrn = dbSouhrn.prepareStatement(getSQL(SQL.VLOZ_SOUHRN));
franta-hg@22
    58
                while (rs.next()) {
franta-hg@22
    59
                    /**
franta-hg@22
    60
                     * Souhrn bychom mohli vkládat pomocí SouhrnDAO,
franta-hg@22
    61
                     * ale z výkonnostních důvodů to budeme dělat tady
franta-hg@22
    62
                     * (jedno spojení a jeden předpřipravený příkaz).
franta-hg@22
    63
                     */
franta-hg@28
    64
                    psSouhrn.setDate(1, rs.getDate("den"));
franta-hg@22
    65
                    psSouhrn.setString(2, rs.getString("ip"));
franta-hg@32
    66
                    psSouhrn.setString(3, null);
franta-hg@22
    67
                    psSouhrn.setInt(4, rs.getInt("pocet"));
franta-hg@22
    68
                    psSouhrn.setInt(5, cil.getId());
franta-hg@22
    69
                    psSouhrn.executeUpdate();
franta-hg@22
    70
                }
franta-hg@22
    71
                zavri(null, psSouhrn, null);
franta-hg@32
    72
franta-hg@32
    73
                /**
franta-hg@32
    74
                 * Přeložíme všechny IP adresy daného období
franta-hg@32
    75
                 * a aktualizujeme domény všude (i jiné cíle a jiná období).
franta-hg@32
    76
                 */
franta-hg@32
    77
                PreparedStatement psIPselekt = dbSouhrn.prepareStatement(getSQL(SQL.IP_ADRESY_OBDOBI));
franta-hg@32
    78
                psIPselekt.setInt(1, cil.getId());
franta-hg@32
    79
                psIPselekt.setDate(2, zacatek);
franta-hg@32
    80
                psIPselekt.setDate(3, konec);
franta-hg@32
    81
                PreparedStatement psIPupdate = dbSouhrn.prepareStatement(getSQL(SQL.IP_PREKLAD));
franta-hg@32
    82
                ResultSet rsIP = psIPselekt.executeQuery();
franta-hg@32
    83
                while (rsIP.next()) {
franta-hg@32
    84
                    String ip = rsIP.getString("ip");
franta-hg@32
    85
                    String domena = prelozIP(ip);
franta-hg@32
    86
                    psIPupdate.setString(1, domena);
franta-hg@32
    87
                    psIPupdate.setString(2, ip);
franta-hg@32
    88
                    psIPupdate.executeUpdate();
franta-hg@32
    89
                }
franta-hg@32
    90
                zavri(null, psIPselekt, null);
franta-hg@32
    91
                zavri(null, psIPupdate, null);
franta-hg@32
    92
franta-hg@32
    93
                /**
franta-hg@32
    94
                 * Pokud se všechno povedlo, commitujeme, jinak nedochází k žádným změnám.
franta-hg@32
    95
                 * Dané období se buď vygeneruje úspěšně, nebo vůbec.
franta-hg@32
    96
                 * Přepokládáme vypnutý autocommit (to zajišťuje aplikační server).
franta-hg@32
    97
                 */
franta-hg@22
    98
                dbSouhrn.commit();
franta-hg@22
    99
            } catch (Exception e) {
franta-hg@22
   100
                log.log(Level.SEVERE, "Chyba při generování souhrnu.", e);
franta-hg@22
   101
            } finally {
franta-hg@22
   102
                zavri(dbZdroj, ps, rs);
franta-hg@23
   103
                zavri(dbSouhrn, psSmazat, null);
franta-hg@22
   104
            }
franta-hg@22
   105
        }
franta-hg@22
   106
    }
franta-hg@22
   107
franta-hg@22
   108
    /**
franta-hg@28
   109
     * Vygeneruje denní souhrny pro všechny cíle za dané období.
franta-hg@28
   110
     * @param zacatek začátek období – včetně
franta-hg@28
   111
     * @param konec konec období – včetně
franta-hg@22
   112
     */
franta-hg@28
   113
    public void generujSouhrny(Date zacatek, Date konec) {
franta-hg@22
   114
        Collection<Cil> cile = new CilDAO().getCile();
franta-hg@22
   115
        for (Cil c : cile) {
franta-hg@28
   116
            generujSouhrn(c, zacatek, konec);
franta-hg@22
   117
        }
franta-hg@22
   118
    }
franta-hg@23
   119
franta-hg@23
   120
    /**
franta-hg@23
   121
     * Přeloží IP adresu na doménu
franta-hg@23
   122
     * @param ip IP adresa
franta-hg@23
   123
     * @return doména
franta-hg@23
   124
     */
franta-hg@23
   125
    private static String prelozIP(String ip) {
franta-hg@23
   126
        try {
franta-hg@23
   127
            return InetAddress.getByName(ip).getHostName();
franta-hg@23
   128
        } catch (Exception e) {
franta-hg@23
   129
            return "Chyba: nepodařilo se přeložit.";
franta-hg@23
   130
        }
franta-hg@23
   131
    }
franta-hg@22
   132
}