franta-hg@0: package cz.frantovo.superDAO; franta-hg@0: franta-hg@0: import java.io.InputStream; franta-hg@0: import java.sql.Connection; franta-hg@0: import java.sql.ResultSet; franta-hg@0: import java.sql.Statement; franta-hg@0: import java.util.Collections; franta-hg@0: import java.util.HashMap; franta-hg@0: import java.util.Map; franta-hg@0: import java.util.Properties; franta-hg@0: import java.util.logging.Level; franta-hg@0: import java.util.logging.Logger; franta-hg@0: franta-hg@0: /** franta-hg@0: * Předek všech DTOček franta-hg@0: * @author fiki franta-hg@0: */ franta-hg@0: public class SuperDAO { franta-hg@0: franta-hg@0: protected Logger log = Logger.getLogger(getClass().getName()); franta-hg@0: private static Map sql = Collections.synchronizedMap(new HashMap()); franta-hg@0: private static Map vlastnosti = Collections.synchronizedMap(new HashMap()); franta-hg@0: franta-hg@2: private enum VLASTNOSTI { franta-hg@0: franta-hg@0: AHOJ franta-hg@0: } franta-hg@0: franta-hg@0: /** franta-hg@0: * Načítá SQL dotazy ze souboru, který se jmenuje stejně jako třída a má příponu sql.xml franta-hg@0: * Do těchto souborů patří pouze SQL dotazy - všechny ostatní parametry dáme do .xml souboru. franta-hg@2: *

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

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

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

franta-hg@0: * @param klic Enum konstnanta z dané třídy franta-hg@2: * @param trida třída, jejíž XML soubor budeme hledat. franta-hg@0: * @return textová hodnota nebo null v případě chyby franta-hg@0: */ franta-hg@2: protected String getVlastnost(Enum klic, Class trida) { franta-hg@2: return getHodnota(vlastnosti, "xml", klic, trida); franta-hg@2: } franta-hg@2: franta-hg@2: /** franta-hg@2: * @see getVlastnost(Enum klic, Class trida) franta-hg@2: */ franta-hg@0: protected String getVlastnost(Enum klic) { franta-hg@2: return getVlastnost(klic, null); franta-hg@0: } franta-hg@0: franta-hg@0: /** franta-hg@0: * Nečte hodnoty přímo ze souboru, ale snaží se je nejprve najít ve statické mezipaměti. franta-hg@0: * @param klic Enum konstnanta z dané třídy franta-hg@0: * @return textová hodnota nebo null v případě chyby franta-hg@0: */ franta-hg@2: private String getHodnota(Map mezipamet, String pripona, Enum klic, Class trida) { franta-hg@0: franta-hg@2: if (trida == null) { franta-hg@2: trida = getClass(); franta-hg@2: } franta-hg@2: franta-hg@2: if (mezipamet.get(trida) == null) { franta-hg@0: /** Ještě nemáme načteno ze souboru */ franta-hg@2: mezipamet.put(trida, getHodnoty(pripona, trida)); franta-hg@0: franta-hg@2: if (mezipamet.get(trida) == null) { franta-hg@0: /** Došlo k chybě --> už to příště nebudeme zkoušet načítat */ franta-hg@2: mezipamet.put(trida, new Properties()); franta-hg@0: } franta-hg@0: } franta-hg@0: franta-hg@2: return mezipamet.get(trida).getProperty(klic.toString()); franta-hg@0: } franta-hg@0: franta-hg@0: public static void main(String[] args) { franta-hg@2: System.out.println(new SuperDAO().getSQL(VLASTNOSTI.AHOJ)); franta-hg@0: franta-hg@0: } franta-hg@0: franta-hg@0: /** franta-hg@0: * Načte vlastnosti dané třídy z XML souboru. franta-hg@0: * Soubory se dávají do stejného balíčku jako třída, akorát mají jinou příponu. franta-hg@0: * @param pripona přípona souboru - obvykle "sql.xml" nebo "xml" (bez tečky) franta-hg@0: * @return načtené vlastnosti nebo null v případě chyby franta-hg@0: */ franta-hg@2: private Properties getHodnoty(String pripona, Class trida) { franta-hg@0: String soubor = trida.getSimpleName() + "." + pripona; franta-hg@0: franta-hg@0: try { franta-hg@2: Properties hodnoty = new Properties(); franta-hg@0: InputStream fis = trida.getResourceAsStream(soubor); franta-hg@0: hodnoty.loadFromXML(fis); franta-hg@2: return hodnoty; franta-hg@0: } catch (Exception e) { franta-hg@0: log.log(Level.SEVERE, "Chyba při načítání vlastností: " + soubor, e); franta-hg@2: return null; franta-hg@0: } franta-hg@0: } franta-hg@0: franta-hg@0: /** franta-hg@0: * Zavře všechno franta-hg@0: * @param spojeni DB spojení franta-hg@0: * @param prikaz DB dotaz franta-hg@0: * @param vysledek DB výsledek franta-hg@0: */ franta-hg@2: protected static void zavri(Connection spojeni, Statement prikaz, ResultSet vysledek) { franta-hg@0: if (vysledek != null) { franta-hg@0: try { franta-hg@0: vysledek.close(); franta-hg@0: } catch (Exception e) { franta-hg@0: } franta-hg@0: } franta-hg@0: if (prikaz != null) { franta-hg@0: try { franta-hg@0: prikaz.close(); franta-hg@0: } catch (Exception e) { franta-hg@0: } franta-hg@0: } franta-hg@0: if (spojeni != null) { franta-hg@0: try { franta-hg@0: spojeni.close(); franta-hg@0: } catch (Exception e) { franta-hg@0: } franta-hg@0: } franta-hg@0: } franta-hg@2: franta-hg@2: /** franta-hg@2: * @param jndi původní řetězec franta-hg@2: * @return U JNDI jmen nemá smysl, aby měli na začátku nebo na konci bílé znaky (mezery…) franta-hg@4: * @deprecated zavrženo ve prospěch univerzální metody orizni(), která dělá totéž. franta-hg@4: * @see SuperDAO#orizni(java.lang.String) franta-hg@2: */ franta-hg@2: public static String orizniJNDI(String jndi) { franta-hg@2: if (jndi == null) { franta-hg@2: return null; franta-hg@2: } else { franta-hg@2: return jndi.trim(); franta-hg@2: } franta-hg@2: } franta-hg@4: franta-hg@4: /** franta-hg@4: * Vhodné pokud v XML používáme <![CDATA[ … ]]>. franta-hg@4: * @param text původní řetězec načtený z XML souboru. franta-hg@4: * @return Text s oříznutými bílými znany nazačátku a nakonci. franta-hg@4: */ franta-hg@4: public static String orizni(String text) { franta-hg@4: if (text == null) { franta-hg@4: return null; franta-hg@4: } else { franta-hg@4: return text.trim(); franta-hg@4: } franta-hg@4: } franta-hg@0: }