java/nekurak.net-web/src/java/cz/frantovo/superDAO/SuperDAO.java
author František Kučera <franta-hg@frantovo.cz>
Wed Jan 27 03:51:01 2010 +0100 (2010-01-27)
changeset 24 58aa900334e4
parent 23 f76fc9f3cb7c
permissions -rw-r--r--
drobnosti
     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 http://hg.frantovo.cz/SuperDAO/
    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 <code>protected</code> 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 <code>protected</code> metoda nachází.
    55      * V takovém případě je potřeba použít parametr <code>trida</code></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     /**
    96      * Jen pro vyzkoušení, jak načítání XML funguje.
    97      * @param args prázdné
    98      */
    99     public static void main(String[] args) {
   100 	System.out.println(new SuperDAO().getSQL(VLASTNOSTI.AHOJ));
   101     }
   102 
   103     /**
   104      * Načte vlastnosti dané třídy z XML souboru.
   105      * Soubory se dávají do stejného balíčku jako třída, akorát mají jinou příponu.
   106      * @param pripona přípona souboru - obvykle "sql.xml" nebo "xml" (bez tečky)
   107      * @return načtené vlastnosti nebo null v případě chyby
   108      */
   109     private Properties getHodnoty(String pripona, Class trida) {
   110 	String soubor = trida.getSimpleName() + "." + pripona;
   111 
   112 	try {
   113 	    Properties hodnoty = new Properties();
   114 	    InputStream fis = trida.getResourceAsStream(soubor);
   115 	    hodnoty.loadFromXML(fis);
   116 	    return hodnoty;
   117 	} catch (Exception e) {
   118 	    log.log(Level.SEVERE, "Chyba při načítání vlastností: " + soubor, e);
   119 	    return null;
   120 	}
   121     }
   122 
   123     /**
   124      * Pokusí se zrušit transakci.
   125      * @param spojeni databázové spojení.
   126      */
   127     protected void rollback(Connection spojeni) {
   128 	try {
   129 	    spojeni.rollback();
   130 	} catch (Exception e) {
   131 	    log.log(Level.FINEST, "rollback se nezdařil", e);
   132 	}
   133     }
   134 
   135     /**
   136      * Zavře všechno
   137      * @param spojeni DB spojení
   138      * @param prikaz DB dotaz
   139      * @param vysledek DB výsledek
   140      */
   141     protected static void zavri(Connection spojeni, Statement prikaz, ResultSet vysledek) {
   142 	if (vysledek != null) {
   143 	    try {
   144 		vysledek.close();
   145 	    } catch (Exception e) {
   146 	    }
   147 	}
   148 	if (prikaz != null) {
   149 	    try {
   150 		prikaz.close();
   151 	    } catch (Exception e) {
   152 	    }
   153 	}
   154 	if (spojeni != null) {
   155 	    try {
   156 		spojeni.close();
   157 	    } catch (Exception e) {
   158 	    }
   159 	}
   160     }
   161 
   162     /**
   163      * Vhodné pokud v XML používáme &lt;![CDATA[ … ]]&gt;.
   164      * (hodí se pro JNDI)
   165      * @param text původní řetězec načtený z XML souboru.
   166      * @return Text s oříznutými bílými znany nazačátku a nakonci.
   167      */
   168     public static String orizni(String text) {
   169 	if (text == null) {
   170 	    return null;
   171 	} else {
   172 	    return text.trim();
   173 	}
   174     }
   175 }