java/SuperDAO/src/cz/frantovo/superDAO/SuperDAO.java
author František Kučera <franta-hg@frantovo.cz>
Sat, 30 May 2009 01:20:13 +0200
changeset 4 6223b4e5de77
parent 2 3df37f25b286
permissions -rw-r--r--
Nová univerzální metoda orizni();
Místo zavržené orizniJNDI();
HG: changed java/SuperDAO/src/cz/frantovo/superDAO/SuperDAO.java
     1 package cz.frantovo.superDAO;
     2 
     3 import java.io.InputStream;
     4 import java.sql.Connection;
     5 import java.sql.ResultSet;
     6 import java.sql.Statement;
     7 import java.util.Collections;
     8 import java.util.HashMap;
     9 import java.util.Map;
    10 import java.util.Properties;
    11 import java.util.logging.Level;
    12 import java.util.logging.Logger;
    13 
    14 /**
    15  * Předek všech DTOček
    16  * @author fiki
    17  */
    18 public class SuperDAO {
    19 
    20     protected Logger log = Logger.getLogger(getClass().getName());
    21     private static Map<Class, Properties> sql = Collections.synchronizedMap(new HashMap<Class, Properties>());
    22     private static Map<Class, Properties> vlastnosti = Collections.synchronizedMap(new HashMap<Class, Properties>());
    23 
    24     private enum VLASTNOSTI {
    25 
    26         AHOJ
    27     }
    28 
    29     /**
    30      * Načítá SQL dotazy ze souboru, který se jmenuje stejně jako třída a má příponu sql.xml
    31      * Do těchto souborů patří pouze SQL dotazy - všechny ostatní parametry dáme do .xml souboru.
    32      * <p><strong>Pozor</strong> na použití v <em>protected</em> metodách, které mohou být volány z potomků –
    33      * pak se použije XML soubor daného potomka a ne XML soubor třídy, ve které se <em>protected</em> metoda nachází.
    34      * V takovém případě je potřeba použít parametr <em>trida</em></p>
    35      * @param klic Enum konstnanta z dané třídy
    36      * @param trida třída, jejíž XML soubor budeme hledat.
    37      * @return SQL dotaz nebo null v případě chyby
    38      */
    39     protected String getSQL(Enum klic, Class trida) {
    40         return getHodnota(sql, "sql.xml", klic, trida);
    41     }
    42 
    43     /**
    44      * @see getSQL(Enum klic, Class trida)
    45      */
    46     protected String getSQL(Enum klic) {
    47         return getSQL(klic, null);
    48     }
    49 
    50     /**
    51      * Načítá textové hodnoty (vlastnosti) ze souboru, který se jmenuje stejně jako třída a má příponu xml
    52      * Sem patří všechny parametry tříd kromě SQL dotazů.
    53      * <p><strong>Pozor</strong> na použití v <em>protected</em> metodách, které mohou být volány z potomků –
    54      * pak se použije XML soubor daného potomka a ne XML soubor třídy, ve které se <em>protected</em> metoda nachází.
    55      * V takovém případě je potřeba použít parametr <em>trida</em></p>
    56      * @param klic Enum konstnanta z dané třídy
    57      * @param trida třída, jejíž XML soubor budeme hledat.
    58      * @return textová hodnota nebo null v případě chyby
    59      */
    60     protected String getVlastnost(Enum klic, Class trida) {
    61         return getHodnota(vlastnosti, "xml", klic, trida);
    62     }
    63 
    64     /**
    65      * @see getVlastnost(Enum klic, Class trida)
    66      */
    67     protected String getVlastnost(Enum klic) {
    68         return getVlastnost(klic, null);
    69     }
    70 
    71     /**
    72      * Nečte hodnoty přímo ze souboru, ale snaží se je nejprve najít ve statické mezipaměti.
    73      * @param klic Enum konstnanta z dané třídy
    74      * @return textová hodnota nebo null v případě chyby
    75      */
    76     private String getHodnota(Map<Class, Properties> mezipamet, String pripona, Enum klic, Class trida) {
    77 
    78         if (trida == null) {
    79             trida = getClass();
    80         }
    81 
    82         if (mezipamet.get(trida) == null) {
    83             /** Ještě nemáme načteno ze souboru */
    84             mezipamet.put(trida, getHodnoty(pripona, trida));
    85 
    86             if (mezipamet.get(trida) == null) {
    87                 /** Došlo k chybě --> už to příště nebudeme zkoušet načítat */
    88                 mezipamet.put(trida, new Properties());
    89             }
    90         }
    91 
    92         return mezipamet.get(trida).getProperty(klic.toString());
    93     }
    94 
    95     public static void main(String[] args) {
    96         System.out.println(new SuperDAO().getSQL(VLASTNOSTI.AHOJ));
    97 
    98     }
    99 
   100     /**
   101      * Načte vlastnosti dané třídy z XML souboru.
   102      * Soubory se dávají do stejného balíčku jako třída, akorát mají jinou příponu.
   103      * @param pripona přípona souboru - obvykle "sql.xml" nebo "xml" (bez tečky)
   104      * @return načtené vlastnosti nebo null v případě chyby
   105      */
   106     private Properties getHodnoty(String pripona, Class trida) {
   107         String soubor = trida.getSimpleName() + "." + pripona;
   108 
   109         try {
   110             Properties hodnoty = new Properties();
   111             InputStream fis = trida.getResourceAsStream(soubor);
   112             hodnoty.loadFromXML(fis);
   113             return hodnoty;
   114         } catch (Exception e) {
   115             log.log(Level.SEVERE, "Chyba při načítání vlastností: " + soubor, e);
   116             return null;
   117         }
   118     }
   119 
   120     /**
   121      * Zavře všechno
   122      * @param spojeni DB spojení
   123      * @param prikaz DB dotaz
   124      * @param vysledek DB výsledek
   125      */
   126     protected static void zavri(Connection spojeni, Statement prikaz, ResultSet vysledek) {
   127         if (vysledek != null) {
   128             try {
   129                 vysledek.close();
   130             } catch (Exception e) {
   131             }
   132         }
   133         if (prikaz != null) {
   134             try {
   135                 prikaz.close();
   136             } catch (Exception e) {
   137             }
   138         }
   139         if (spojeni != null) {
   140             try {
   141                 spojeni.close();
   142             } catch (Exception e) {
   143             }
   144         }
   145     }
   146 
   147     /**
   148      * @param jndi původní řetězec
   149      * @return U JNDI jmen nemá smysl, aby měli na začátku nebo na konci bílé znaky (mezery…)
   150      * @deprecated zavrženo ve prospěch univerzální metody orizni(), která dělá totéž.
   151      * @see SuperDAO#orizni(java.lang.String)
   152      */
   153     public static String orizniJNDI(String jndi) {
   154         if (jndi == null) {
   155             return null;
   156         } else {
   157             return jndi.trim();
   158         }
   159     }
   160 
   161     /**
   162      * Vhodné pokud v XML používáme &lt;![CDATA[ … ]]&gt;.
   163      * @param text původní řetězec načtený z XML souboru.
   164      * @return Text s oříznutými bílými znany nazačátku a nakonci.
   165      */
   166     public static String orizni(String text) {
   167         if (text == null) {
   168             return null;
   169         } else {
   170             return text.trim();
   171         }
   172     }
   173 }