Přidáno SuperDAO.
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/java/nekurak.net-web/src/java/cz/frantovo/superDAO/SuperDAO.java Tue Jan 26 20:27:54 2010 +0100
1.3 @@ -0,0 +1,163 @@
1.4 +package cz.frantovo.superDAO;
1.5 +
1.6 +import java.io.InputStream;
1.7 +import java.sql.Connection;
1.8 +import java.sql.ResultSet;
1.9 +import java.sql.Statement;
1.10 +import java.util.Collections;
1.11 +import java.util.HashMap;
1.12 +import java.util.Map;
1.13 +import java.util.Properties;
1.14 +import java.util.logging.Level;
1.15 +import java.util.logging.Logger;
1.16 +
1.17 +/**
1.18 + * Předek všech DTOček
1.19 + * @author fiki
1.20 + */
1.21 +public class SuperDAO {
1.22 +
1.23 + protected Logger log = Logger.getLogger(getClass().getName());
1.24 + private static Map<Class, Properties> sql = Collections.synchronizedMap(new HashMap<Class, Properties>());
1.25 + private static Map<Class, Properties> vlastnosti = Collections.synchronizedMap(new HashMap<Class, Properties>());
1.26 +
1.27 + private enum VLASTNOSTI {
1.28 +
1.29 + AHOJ
1.30 + }
1.31 +
1.32 + /**
1.33 + * Načítá SQL dotazy ze souboru, který se jmenuje stejně jako třída a má příponu sql.xml
1.34 + * Do těchto souborů patří pouze SQL dotazy - všechny ostatní parametry dáme do .xml souboru.
1.35 + * <p><strong>Pozor</strong> na použití v <em>protected</em> metodách, které mohou být volány z potomků –
1.36 + * pak se použije XML soubor daného potomka a ne XML soubor třídy, ve které se <em>protected</em> metoda nachází.
1.37 + * V takovém případě je potřeba použít parametr <em>trida</em></p>
1.38 + * @param klic Enum konstnanta z dané třídy
1.39 + * @param trida třída, jejíž XML soubor budeme hledat.
1.40 + * @return SQL dotaz nebo null v případě chyby
1.41 + */
1.42 + protected String getSQL(Enum klic, Class trida) {
1.43 + return getHodnota(sql, "sql.xml", klic, trida);
1.44 + }
1.45 +
1.46 + /**
1.47 + * @see getSQL(Enum klic, Class trida)
1.48 + */
1.49 + protected String getSQL(Enum klic) {
1.50 + return getSQL(klic, null);
1.51 + }
1.52 +
1.53 + /**
1.54 + * Načítá textové hodnoty (vlastnosti) ze souboru, který se jmenuje stejně jako třída a má příponu xml
1.55 + * Sem patří všechny parametry tříd kromě SQL dotazů.
1.56 + * <p><strong>Pozor</strong> na použití v <code>protected</code> metodách, které mohou být volány z potomků –
1.57 + * pak se použije XML soubor daného potomka a ne XML soubor třídy, ve které se <code>protected</code> metoda nachází.
1.58 + * V takovém případě je potřeba použít parametr <code>trida</code></p>
1.59 + * @param klic Enum konstnanta z dané třídy
1.60 + * @param trida třída, jejíž XML soubor budeme hledat.
1.61 + * @return textová hodnota nebo null v případě chyby
1.62 + */
1.63 + protected String getVlastnost(Enum klic, Class trida) {
1.64 + return getHodnota(vlastnosti, "xml", klic, trida);
1.65 + }
1.66 +
1.67 + /**
1.68 + * @see getVlastnost(Enum klic, Class trida)
1.69 + */
1.70 + protected String getVlastnost(Enum klic) {
1.71 + return getVlastnost(klic, null);
1.72 + }
1.73 +
1.74 + /**
1.75 + * Nečte hodnoty přímo ze souboru, ale snaží se je nejprve najít ve statické mezipaměti.
1.76 + * @param klic Enum konstnanta z dané třídy
1.77 + * @return textová hodnota nebo null v případě chyby
1.78 + */
1.79 + private String getHodnota(Map<Class, Properties> mezipamet, String pripona, Enum klic, Class trida) {
1.80 +
1.81 + if (trida == null) {
1.82 + trida = getClass();
1.83 + }
1.84 +
1.85 + if (mezipamet.get(trida) == null) {
1.86 + /** Ještě nemáme načteno ze souboru */
1.87 + mezipamet.put(trida, getHodnoty(pripona, trida));
1.88 +
1.89 + if (mezipamet.get(trida) == null) {
1.90 + /** Došlo k chybě --> už to příště nebudeme zkoušet načítat */
1.91 + mezipamet.put(trida, new Properties());
1.92 + }
1.93 + }
1.94 +
1.95 + return mezipamet.get(trida).getProperty(klic.toString());
1.96 + }
1.97 +
1.98 + /**
1.99 + * Jen pro vyzkoušení, jak načítání XML funguje.
1.100 + * @param args prázdné
1.101 + */
1.102 + public static void main(String[] args) {
1.103 + System.out.println(new SuperDAO().getSQL(VLASTNOSTI.AHOJ));
1.104 + }
1.105 +
1.106 + /**
1.107 + * Načte vlastnosti dané třídy z XML souboru.
1.108 + * Soubory se dávají do stejného balíčku jako třída, akorát mají jinou příponu.
1.109 + * @param pripona přípona souboru - obvykle "sql.xml" nebo "xml" (bez tečky)
1.110 + * @return načtené vlastnosti nebo null v případě chyby
1.111 + */
1.112 + private Properties getHodnoty(String pripona, Class trida) {
1.113 + String soubor = trida.getSimpleName() + "." + pripona;
1.114 +
1.115 + try {
1.116 + Properties hodnoty = new Properties();
1.117 + InputStream fis = trida.getResourceAsStream(soubor);
1.118 + hodnoty.loadFromXML(fis);
1.119 + return hodnoty;
1.120 + } catch (Exception e) {
1.121 + log.log(Level.SEVERE, "Chyba při načítání vlastností: " + soubor, e);
1.122 + return null;
1.123 + }
1.124 + }
1.125 +
1.126 + /**
1.127 + * Zavře všechno
1.128 + * @param spojeni DB spojení
1.129 + * @param prikaz DB dotaz
1.130 + * @param vysledek DB výsledek
1.131 + */
1.132 + protected static void zavri(Connection spojeni, Statement prikaz, ResultSet vysledek) {
1.133 + if (vysledek != null) {
1.134 + try {
1.135 + vysledek.close();
1.136 + } catch (Exception e) {
1.137 + }
1.138 + }
1.139 + if (prikaz != null) {
1.140 + try {
1.141 + prikaz.close();
1.142 + } catch (Exception e) {
1.143 + }
1.144 + }
1.145 + if (spojeni != null) {
1.146 + try {
1.147 + spojeni.close();
1.148 + } catch (Exception e) {
1.149 + }
1.150 + }
1.151 + }
1.152 +
1.153 + /**
1.154 + * Vhodné pokud v XML používáme <![CDATA[ … ]]>.
1.155 + * (hodí se pro JNDI)
1.156 + * @param text původní řetězec načtený z XML souboru.
1.157 + * @return Text s oříznutými bílými znany nazačátku a nakonci.
1.158 + */
1.159 + public static String orizni(String text) {
1.160 + if (text == null) {
1.161 + return null;
1.162 + } else {
1.163 + return text.trim();
1.164 + }
1.165 + }
1.166 +}
1.167 \ No newline at end of file
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2.2 +++ b/java/nekurak.net-web/src/java/cz/frantovo/superDAO/SuperDAO.sql.xml Tue Jan 26 20:27:54 2010 +0100
2.3 @@ -0,0 +1,9 @@
2.4 +<?xml version="1.0" encoding="UTF-8"?>
2.5 +<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
2.6 +<properties>
2.7 + <entry key="AHOJ">
2.8 + <![CDATA[
2.9 + Tak co, jak to jde? ;-)
2.10 + ]]>
2.11 + </entry>
2.12 +</properties>
2.13 \ No newline at end of file