ulrich
2017-01-06 e0ec318eaf4c6f6129f57174bcb5873763541c13
commit | author | age
51c9e3 1 /*
U 2  *  Nutzerverwaltung - User and role management in your browser
3  *  Copyright (C) 2011-2016 Ulrich Hilger, http://uhilger.de
4  *
5  *  This program is free software: you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation, either version 3 of the License, or
8  *  (at your option) any later version.
9  *
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with this program.  If not, see http://www.gnu.org/licenses/
17  */
18
19 package de.uhilger.um.web;
7fb4d9 20
314fea 21 import de.uhilger.baselink.PersistenceManager;
U 22 import de.uhilger.baselink.Record;
1fc020 23 import de.uhilger.um.api.UserMgr;
314fea 24 import java.io.BufferedReader;
U 25 import java.io.File;
26 import java.io.FileInputStream;
27 import java.io.IOException;
28 import java.io.InputStream;
29 import java.io.InputStreamReader;
30 import java.util.List;
31 import java.util.Properties;
32 import java.util.logging.Level;
33 import java.util.logging.Logger;
34 import javax.servlet.ServletContext;
7fb4d9 35 import javax.servlet.ServletContextEvent;
U 36 import javax.servlet.ServletContextListener;
37
38 /**
b7910b 39  * Initialisierungsklasse der Anwendung Nutzerverwaltung
7fb4d9 40  * 
U 41  * Hier wird u.a. geprüft, ob die Datenbank vorhanden ist und diese 
b7910b 42  * angelegt, falls nicht. Das SQL-Skript zur Anlage der Datenbank findet 
627850 43  * sich in WEB-INF/create_database.sql
7fb4d9 44  * 
U 45  * @author Ulrich Hilger
46  */
b7910b 47 public class Initialiser implements ServletContextListener {
314fea 48   
b7910b 49   private static final Logger logger = Logger.getLogger(Initialiser.class.getName());
7fb4d9 50
314fea 51   /** Name der Datei mit dem SQL-Skript zum Erzeugen der Datenbank */
U 52   private static final String SCRIPT_NAME = "create_database.sql";  
53   /** Name der Datei mit den SQL-Kommandos dieser Anwendung */
54   public static final String SQL_PROPERTIES_NAME = "sql.properties";
55   /** Name des Parameters, unter dem der Name der DataSource im Deployment Descritpor zu finden ist */
56   public static final String P_DSNAME = "dsname";
35c04d 57     
314fea 58   /** Name des SQL-Befehls zum Pruefen, ob die Datenbank vorhanden ist */
U 59   public static final String SQL_DB_VORHANDEN = "dbVorhanden";  
60   
1fc020 61   /**
U 62    * Diese Webanwendung initialisieren, also z.B. Elemente instantiieren, die
63    * über den Deployment Descritpor veränderlich gehalten sind.
64    * 
65    * @param servletContext  der zur Laufzeit bestehende ServletContext
66    */
6240cd 67   private void initApp(ServletContext servletContext) {
U 68     try {
1fc020 69       initSql(servletContext);
U 70       initDb(servletContext);
6240cd 71     } catch (Exception ex) {
U 72       logger.log(Level.SEVERE, null, ex);
73     }
74   }
314fea 75   
U 76  /**
77    * Ein Eigenschaften-Objekt mit den SQL-Statements initialisieren, 
78    * die von dieser Webanwendung verwendet werden
79    * 
80    * Die SQL-Kommandos werden aus der Datei 
81    * [CatalinaBase]/webapps/[Context]/WEB-INF/sql.properties 
82    * gelesen und als Properties-Objekt unter dem von der Konstante 
83    * SPOT_SQL_PROPERTIES bezeichneten Namen im ServletContext hinterlegt
84    */
85   private void initSql(ServletContext servletContext) {
86     try {
87       File basis = new File(this.getClass().getResource("/").toURI());
88       File sqlFile = new File(basis.getParentFile(), SQL_PROPERTIES_NAME);
89       logger.fine("lese SQL-Eigenschaften von " + sqlFile.getAbsolutePath());
35c04d 90       Properties sql = new Properties();
314fea 91       sql.loadFromXML(new FileInputStream(sqlFile));
1fc020 92       servletContext.setAttribute(UserMgr.UM_SQL_PROPERTIES, sql);
314fea 93       logger.fine("Abfrage dbVorhanden='" + sql.getProperty(SQL_DB_VORHANDEN) + "'");
U 94     } catch(Exception ex) {
95       logger.log(Level.SEVERE, ex.getMessage(), ex);
96     }
97   }
98   
99   /* ----------------- Logik zur Datenbank-Erzeugung ------------ */
100   
101   /*
102     Die Logik zur Datenbank-Erzeugung benoetigt zwei Parameter: 
103       1. den Namen der DataSource
104       2. einen SQL-Befehl, mit dem geprueft werden kann, ob die 
105           Datenbank vorhanden ist
106   
107     Der Name der DataSource ist im Deployment Descriptor unter dem mit 
108     P_DSNAME bezeichneten Namen hinterlegt, der SQL-Befehl ist 
109     im Properties-Objekt mit den SQL-Befehlen dieser Anwendung unter dem 
110     mit SQL_DB_VORHANDEN bezeichneten Namen zu finden.
111   */
112   
113   /**
114    * Pruefen, ob die von dieser Webanwendung benoetigte Datenbank 
115    * vorhanden ist. Erzeugen der Datenbank, wenn sie nicht vorgefunden 
116    * wird.
117    * 
118    * @param servletContext der ServletContext dieser Webanwendung, in dem 
119    * die Parameter zu finden sind, welche die Datenbankverbindung beschreiben
120    */
121   private void initDb(ServletContext servletContext) {
122     try {
35c04d 123       PersistenceManager db = new PersistenceManager();
314fea 124       db.setDataSourceName(servletContext.getInitParameter(P_DSNAME));
35c04d 125       servletContext.setAttribute(UserMgr.UM_DB, db);
1fc020 126       Properties sql = (Properties) servletContext.getAttribute(UserMgr.UM_SQL_PROPERTIES);
314fea 127       if(!dbVorhanden(db, sql.getProperty(SQL_DB_VORHANDEN))) {
U 128         logger.info("Datenbank ist nicht vorhanden");
129         int[] ergebnis = db.executeScript(getSqlSkript());
130       }
131     } catch(Exception ex) {
132       logger.log(Level.INFO, ex.getMessage(), ex);
133     }
134   }
135   
136   @SuppressWarnings("rawtypes")
137   private boolean dbVorhanden(PersistenceManager pm, String sql) {
138     boolean istVorhanden = false;
139     List<List<String>> list = pm.select(sql, Record.WITHOUT_BLOBS);
140     if(list.size() > 1) {
141       istVorhanden = true;
142       logger.fine("Datenbank ist vorhanden");
143     }
144     return istVorhanden;
145   }
146     
147   private String getSqlSkript() throws Exception {
148     File basis = new File(this.getClass().getResource("/").toURI());
149     File skript = new File(basis.getParentFile(), SCRIPT_NAME);
150     return fromStream(new FileInputStream(skript));
151   }
152   
153   private String fromStream(InputStream in) throws IOException
154   {
155     BufferedReader reader = new BufferedReader(new InputStreamReader(in));
156     StringBuilder out = new StringBuilder();
157     String line;
158     while ((line = reader.readLine()) != null) {
159       out.append(line);
160     }
161     return out.toString();
162   }
163
164   /* --- ServletContextListener --- */
165   
7fb4d9 166   @Override
U 167   public void contextInitialized(ServletContextEvent sce) {
314fea 168     ServletContext servletContext = sce.getServletContext();
6240cd 169     initApp(servletContext);
7fb4d9 170   }
U 171
172   @Override
173   public void contextDestroyed(ServletContextEvent sce) {
174     // destroy whatever 
175   }
176   
177 }