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