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