1 package cz.frantovo.superDAO;
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;
10 import java.util.Properties;
11 import java.util.logging.Level;
12 import java.util.logging.Logger;
18 public class SuperDAO {
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>());
24 private enum VLASTNOSTI {
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
39 protected String getSQL(Enum klic, Class trida) {
40 return getHodnota(sql, "sql.xml", klic, trida);
44 * @see getSQL(Enum klic, Class trida)
46 protected String getSQL(Enum klic) {
47 return getSQL(klic, null);
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
60 protected String getVlastnost(Enum klic, Class trida) {
61 return getHodnota(vlastnosti, "xml", klic, trida);
65 * @see getVlastnost(Enum klic, Class trida)
67 protected String getVlastnost(Enum klic) {
68 return getVlastnost(klic, null);
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
76 private String getHodnota(Map<Class, Properties> mezipamet, String pripona, Enum klic, Class trida) {
82 if (mezipamet.get(trida) == null) {
83 /** Ještě nemáme načteno ze souboru */
84 mezipamet.put(trida, getHodnoty(pripona, trida));
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());
92 return mezipamet.get(trida).getProperty(klic.toString());
95 public static void main(String[] args) {
96 System.out.println(new SuperDAO().getSQL(VLASTNOSTI.AHOJ));
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
106 private Properties getHodnoty(String pripona, Class trida) {
107 String soubor = trida.getSimpleName() + "." + pripona;
110 Properties hodnoty = new Properties();
111 InputStream fis = trida.getResourceAsStream(soubor);
112 hodnoty.loadFromXML(fis);
114 } catch (Exception e) {
115 log.log(Level.SEVERE, "Chyba při načítání vlastností: " + soubor, e);
122 * @param spojeni DB spojení
123 * @param prikaz DB dotaz
124 * @param vysledek DB výsledek
126 protected static void zavri(Connection spojeni, Statement prikaz, ResultSet vysledek) {
127 if (vysledek != null) {
130 } catch (Exception e) {
133 if (prikaz != null) {
136 } catch (Exception e) {
139 if (spojeni != null) {
142 } catch (Exception e) {
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…)
151 public static String orizniJNDI(String jndi) {