From 87368a7028013a40cc20b05f56b8ffa392e44bb4 Mon Sep 17 00:00:00 2001 From: ulrich <not disclosed> Date: Sun, 27 Nov 2016 17:34:01 +0000 Subject: [PATCH] Datenbankzugriffe begonnen --- src/java/de/uhilger/um/App.java | 148 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 147 insertions(+), 1 deletions(-) diff --git a/src/java/de/uhilger/um/App.java b/src/java/de/uhilger/um/App.java index 9ad37f0..5b4c409 100644 --- a/src/java/de/uhilger/um/App.java +++ b/src/java/de/uhilger/um/App.java @@ -1,5 +1,18 @@ package de.uhilger.um; +import de.uhilger.baselink.PersistenceManager; +import de.uhilger.baselink.Record; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.List; +import java.util.Properties; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; @@ -12,10 +25,143 @@ * @author Ulrich Hilger */ public class App implements ServletContextListener { + + private static final Logger logger = Logger.getLogger(App.class.getName()); + /** Name der Datei mit dem SQL-Skript zum Erzeugen der Datenbank */ + private static final String SCRIPT_NAME = "create_database.sql"; + /** Name der Datei mit den SQL-Kommandos dieser Anwendung */ + public static final String SQL_PROPERTIES_NAME = "sql.properties"; + /** Name, unter dem das Properties-Objekt mit den SQL-Befehlen im ServletContext hinterlegt ist */ + public static final String UM_SQL_PROPERTIES = "umSqlProperties"; + /** Name des Parameters, unter dem der Name der DataSource im Deployment Descritpor zu finden ist */ + public static final String P_DSNAME = "dsname"; + + /** Name des SQL-Befehls zum Pruefen, ob die Datenbank vorhanden ist */ + public static final String SQL_DB_VORHANDEN = "dbVorhanden"; + + + private static PersistenceManager db; + private static Properties sql; + + /** + * Ein Eigenschaften-Objekt mit den SQL-Statements initialisieren, + * die von dieser Webanwendung verwendet werden + * + * Die SQL-Kommandos werden aus der Datei + * [CatalinaBase]/webapps/[Context]/WEB-INF/sql.properties + * gelesen und als Properties-Objekt unter dem von der Konstante + * SPOT_SQL_PROPERTIES bezeichneten Namen im ServletContext hinterlegt + */ + private void initSql(ServletContext servletContext) { + try { + File basis = new File(this.getClass().getResource("/").toURI()); + File sqlFile = new File(basis.getParentFile(), SQL_PROPERTIES_NAME); + logger.fine("lese SQL-Eigenschaften von " + sqlFile.getAbsolutePath()); + sql = new Properties(); + sql.loadFromXML(new FileInputStream(sqlFile)); + servletContext.setAttribute(UM_SQL_PROPERTIES, sql); + logger.fine("Abfrage dbVorhanden='" + sql.getProperty(SQL_DB_VORHANDEN) + "'"); + } catch(Exception ex) { + logger.log(Level.SEVERE, ex.getMessage(), ex); + } + } + + /* ----------------- statische Getter --------------------- */ + + /** + * Das Zugriffsobjekt fuer die Datenbank dieser Webanwendung + * ermitteln + * + * @return das Zugriffsobjekt zur Datenbank dieser Webanwendung + */ + public static PersistenceManager getDatabase() { + if(db == null) { + db = new PersistenceManager(); + } + return db; + } + + /** + * Ein benanntes SQL-Kommando ermitteln + * @param id Name des gewuenschten SQL-Kommandos + * @return das SQL-Kommando mit der in id angegebenen Bezeichnung + */ + public static String getSqlStatement(String id) { + return sql.getProperty(id); + } + + /* ----------------- Logik zur Datenbank-Erzeugung ------------ */ + + /* + Die Logik zur Datenbank-Erzeugung benoetigt zwei Parameter: + 1. den Namen der DataSource + 2. einen SQL-Befehl, mit dem geprueft werden kann, ob die + Datenbank vorhanden ist + + Der Name der DataSource ist im Deployment Descriptor unter dem mit + P_DSNAME bezeichneten Namen hinterlegt, der SQL-Befehl ist + im Properties-Objekt mit den SQL-Befehlen dieser Anwendung unter dem + mit SQL_DB_VORHANDEN bezeichneten Namen zu finden. + */ + + /** + * Pruefen, ob die von dieser Webanwendung benoetigte Datenbank + * vorhanden ist. Erzeugen der Datenbank, wenn sie nicht vorgefunden + * wird. + * + * @param servletContext der ServletContext dieser Webanwendung, in dem + * die Parameter zu finden sind, welche die Datenbankverbindung beschreiben + */ + private void initDb(ServletContext servletContext) { + try { + db = new PersistenceManager(); + db.setDataSourceName(servletContext.getInitParameter(P_DSNAME)); + Properties sql = (Properties) servletContext.getAttribute(UM_SQL_PROPERTIES); + if(!dbVorhanden(db, sql.getProperty(SQL_DB_VORHANDEN))) { + logger.info("Datenbank ist nicht vorhanden"); + int[] ergebnis = db.executeScript(getSqlSkript()); + } + } catch(Exception ex) { + logger.log(Level.INFO, ex.getMessage(), ex); + } + } + + @SuppressWarnings("rawtypes") + private boolean dbVorhanden(PersistenceManager pm, String sql) { + boolean istVorhanden = false; + List<List<String>> list = pm.select(sql, Record.WITHOUT_BLOBS); + if(list.size() > 1) { + istVorhanden = true; + logger.fine("Datenbank ist vorhanden"); + } + return istVorhanden; + } + + private String getSqlSkript() throws Exception { + File basis = new File(this.getClass().getResource("/").toURI()); + File skript = new File(basis.getParentFile(), SCRIPT_NAME); + return fromStream(new FileInputStream(skript)); + } + + private String fromStream(InputStream in) throws IOException + { + BufferedReader reader = new BufferedReader(new InputStreamReader(in)); + StringBuilder out = new StringBuilder(); + String line; + while ((line = reader.readLine()) != null) { + out.append(line); + } + return out.toString(); + } + + /* --- ServletContextListener --- */ + @Override public void contextInitialized(ServletContextEvent sce) { - // do some initialisation here + ServletContext servletContext = sce.getServletContext(); + initSql(servletContext); + initDb(servletContext); } @Override -- Gitblit v1.9.3