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