# HG changeset patch # User František Kučera # Date 1264534074 -3600 # Node ID 2b441592f632b9ae2fc4e9714c2709b2ed7ca8d1 # Parent 5d93bf1c8093403b6a4b2bb87c6d214a886399b3 Přidáno SuperDAO. diff -r 5d93bf1c8093 -r 2b441592f632 java/nekurak.net-web/src/java/cz/frantovo/superDAO/SuperDAO.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/nekurak.net-web/src/java/cz/frantovo/superDAO/SuperDAO.java Tue Jan 26 20:27:54 2010 +0100 @@ -0,0 +1,163 @@ +package cz.frantovo.superDAO; + +import java.io.InputStream; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.Statement; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * Předek všech DTOček + * @author fiki + */ +public class SuperDAO { + + protected Logger log = Logger.getLogger(getClass().getName()); + private static Map sql = Collections.synchronizedMap(new HashMap()); + private static Map vlastnosti = Collections.synchronizedMap(new HashMap()); + + private enum VLASTNOSTI { + + AHOJ + } + + /** + * Načítá SQL dotazy ze souboru, který se jmenuje stejně jako třída a má příponu sql.xml + * Do těchto souborů patří pouze SQL dotazy - všechny ostatní parametry dáme do .xml souboru. + *

Pozor na použití v protected metodách, které mohou být volány z potomků – + * pak se použije XML soubor daného potomka a ne XML soubor třídy, ve které se protected metoda nachází. + * V takovém případě je potřeba použít parametr trida

+ * @param klic Enum konstnanta z dané třídy + * @param trida třída, jejíž XML soubor budeme hledat. + * @return SQL dotaz nebo null v případě chyby + */ + protected String getSQL(Enum klic, Class trida) { + return getHodnota(sql, "sql.xml", klic, trida); + } + + /** + * @see getSQL(Enum klic, Class trida) + */ + protected String getSQL(Enum klic) { + return getSQL(klic, null); + } + + /** + * Načítá textové hodnoty (vlastnosti) ze souboru, který se jmenuje stejně jako třída a má příponu xml + * Sem patří všechny parametry tříd kromě SQL dotazů. + *

Pozor na použití v protected metodách, které mohou být volány z potomků – + * pak se použije XML soubor daného potomka a ne XML soubor třídy, ve které se protected metoda nachází. + * V takovém případě je potřeba použít parametr trida

+ * @param klic Enum konstnanta z dané třídy + * @param trida třída, jejíž XML soubor budeme hledat. + * @return textová hodnota nebo null v případě chyby + */ + protected String getVlastnost(Enum klic, Class trida) { + return getHodnota(vlastnosti, "xml", klic, trida); + } + + /** + * @see getVlastnost(Enum klic, Class trida) + */ + protected String getVlastnost(Enum klic) { + return getVlastnost(klic, null); + } + + /** + * Nečte hodnoty přímo ze souboru, ale snaží se je nejprve najít ve statické mezipaměti. + * @param klic Enum konstnanta z dané třídy + * @return textová hodnota nebo null v případě chyby + */ + private String getHodnota(Map mezipamet, String pripona, Enum klic, Class trida) { + + if (trida == null) { + trida = getClass(); + } + + if (mezipamet.get(trida) == null) { + /** Ještě nemáme načteno ze souboru */ + mezipamet.put(trida, getHodnoty(pripona, trida)); + + if (mezipamet.get(trida) == null) { + /** Došlo k chybě --> už to příště nebudeme zkoušet načítat */ + mezipamet.put(trida, new Properties()); + } + } + + return mezipamet.get(trida).getProperty(klic.toString()); + } + + /** + * Jen pro vyzkoušení, jak načítání XML funguje. + * @param args prázdné + */ + public static void main(String[] args) { + System.out.println(new SuperDAO().getSQL(VLASTNOSTI.AHOJ)); + } + + /** + * Načte vlastnosti dané třídy z XML souboru. + * Soubory se dávají do stejného balíčku jako třída, akorát mají jinou příponu. + * @param pripona přípona souboru - obvykle "sql.xml" nebo "xml" (bez tečky) + * @return načtené vlastnosti nebo null v případě chyby + */ + private Properties getHodnoty(String pripona, Class trida) { + String soubor = trida.getSimpleName() + "." + pripona; + + try { + Properties hodnoty = new Properties(); + InputStream fis = trida.getResourceAsStream(soubor); + hodnoty.loadFromXML(fis); + return hodnoty; + } catch (Exception e) { + log.log(Level.SEVERE, "Chyba při načítání vlastností: " + soubor, e); + return null; + } + } + + /** + * Zavře všechno + * @param spojeni DB spojení + * @param prikaz DB dotaz + * @param vysledek DB výsledek + */ + protected static void zavri(Connection spojeni, Statement prikaz, ResultSet vysledek) { + if (vysledek != null) { + try { + vysledek.close(); + } catch (Exception e) { + } + } + if (prikaz != null) { + try { + prikaz.close(); + } catch (Exception e) { + } + } + if (spojeni != null) { + try { + spojeni.close(); + } catch (Exception e) { + } + } + } + + /** + * Vhodné pokud v XML používáme <![CDATA[ … ]]>. + * (hodí se pro JNDI) + * @param text původní řetězec načtený z XML souboru. + * @return Text s oříznutými bílými znany nazačátku a nakonci. + */ + public static String orizni(String text) { + if (text == null) { + return null; + } else { + return text.trim(); + } + } +} \ No newline at end of file diff -r 5d93bf1c8093 -r 2b441592f632 java/nekurak.net-web/src/java/cz/frantovo/superDAO/SuperDAO.sql.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/nekurak.net-web/src/java/cz/frantovo/superDAO/SuperDAO.sql.xml Tue Jan 26 20:27:54 2010 +0100 @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file