ulrich
2017-01-08 57c58de18c43010e66c9e7306340a9cd088952b9
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;
57c58d 24 import de.uhilger.um.daten.User;
314fea 25 import java.io.BufferedReader;
U 26 import java.io.File;
27 import java.io.FileInputStream;
28 import java.io.IOException;
29 import java.io.InputStream;
30 import java.io.InputStreamReader;
31 import java.util.List;
32 import java.util.Properties;
33 import java.util.logging.Level;
34 import java.util.logging.Logger;
35 import javax.servlet.ServletContext;
7fb4d9 36 import javax.servlet.ServletContextEvent;
U 37 import javax.servlet.ServletContextListener;
38
39 /**
b7910b 40  * Initialisierungsklasse der Anwendung Nutzerverwaltung
7fb4d9 41  * 
U 42  * Hier wird u.a. geprüft, ob die Datenbank vorhanden ist und diese 
b7910b 43  * angelegt, falls nicht. Das SQL-Skript zur Anlage der Datenbank findet 
627850 44  * sich in WEB-INF/create_database.sql
7fb4d9 45  * 
U 46  * @author Ulrich Hilger
47  */
b7910b 48 public class Initialiser implements ServletContextListener {
314fea 49   
b7910b 50   private static final Logger logger = Logger.getLogger(Initialiser.class.getName());
7fb4d9 51
314fea 52   /** Name der Datei mit dem SQL-Skript zum Erzeugen der Datenbank */
U 53   private static final String SCRIPT_NAME = "create_database.sql";  
54   /** Name der Datei mit den SQL-Kommandos dieser Anwendung */
55   public static final String SQL_PROPERTIES_NAME = "sql.properties";
56   /** Name des Parameters, unter dem der Name der DataSource im Deployment Descritpor zu finden ist */
57   public static final String P_DSNAME = "dsname";
35c04d 58     
314fea 59   /** Name des SQL-Befehls zum Pruefen, ob die Datenbank vorhanden ist */
U 60   public static final String SQL_DB_VORHANDEN = "dbVorhanden";  
61   
1fc020 62   /**
U 63    * Diese Webanwendung initialisieren, also z.B. Elemente instantiieren, die
64    * über den Deployment Descritpor veränderlich gehalten sind.
65    * 
66    * @param servletContext  der zur Laufzeit bestehende ServletContext
67    */
6240cd 68   private void initApp(ServletContext servletContext) {
U 69     try {
1fc020 70       initSql(servletContext);
U 71       initDb(servletContext);
6240cd 72     } catch (Exception ex) {
U 73       logger.log(Level.SEVERE, null, ex);
74     }
75   }
314fea 76   
U 77  /**
78    * Ein Eigenschaften-Objekt mit den SQL-Statements initialisieren, 
79    * die von dieser Webanwendung verwendet werden
80    * 
81    * Die SQL-Kommandos werden aus der Datei 
82    * [CatalinaBase]/webapps/[Context]/WEB-INF/sql.properties 
83    * gelesen und als Properties-Objekt unter dem von der Konstante 
84    * SPOT_SQL_PROPERTIES bezeichneten Namen im ServletContext hinterlegt
85    */
86   private void initSql(ServletContext servletContext) {
87     try {
88       File basis = new File(this.getClass().getResource("/").toURI());
89       File sqlFile = new File(basis.getParentFile(), SQL_PROPERTIES_NAME);
90       logger.fine("lese SQL-Eigenschaften von " + sqlFile.getAbsolutePath());
35c04d 91       Properties sql = new Properties();
314fea 92       sql.loadFromXML(new FileInputStream(sqlFile));
1fc020 93       servletContext.setAttribute(UserMgr.UM_SQL_PROPERTIES, sql);
314fea 94       logger.fine("Abfrage dbVorhanden='" + sql.getProperty(SQL_DB_VORHANDEN) + "'");
U 95     } catch(Exception ex) {
96       logger.log(Level.SEVERE, ex.getMessage(), ex);
97     }
98   }
99   
100   /* ----------------- Logik zur Datenbank-Erzeugung ------------ */
101   
102   /*
103     Die Logik zur Datenbank-Erzeugung benoetigt zwei Parameter: 
104       1. den Namen der DataSource
105       2. einen SQL-Befehl, mit dem geprueft werden kann, ob die 
106           Datenbank vorhanden ist
107   
108     Der Name der DataSource ist im Deployment Descriptor unter dem mit 
109     P_DSNAME bezeichneten Namen hinterlegt, der SQL-Befehl ist 
110     im Properties-Objekt mit den SQL-Befehlen dieser Anwendung unter dem 
111     mit SQL_DB_VORHANDEN bezeichneten Namen zu finden.
112   */
113   
114   /**
115    * Pruefen, ob die von dieser Webanwendung benoetigte Datenbank 
116    * vorhanden ist. Erzeugen der Datenbank, wenn sie nicht vorgefunden 
117    * wird.
118    * 
119    * @param servletContext der ServletContext dieser Webanwendung, in dem 
120    * die Parameter zu finden sind, welche die Datenbankverbindung beschreiben
121    */
122   private void initDb(ServletContext servletContext) {
123     try {
35c04d 124       PersistenceManager db = new PersistenceManager();
314fea 125       db.setDataSourceName(servletContext.getInitParameter(P_DSNAME));
35c04d 126       servletContext.setAttribute(UserMgr.UM_DB, db);
1fc020 127       Properties sql = (Properties) servletContext.getAttribute(UserMgr.UM_SQL_PROPERTIES);
314fea 128       if(!dbVorhanden(db, sql.getProperty(SQL_DB_VORHANDEN))) {
U 129         logger.info("Datenbank ist nicht vorhanden");
130         int[] ergebnis = db.executeScript(getSqlSkript());
57c58d 131         User admin = new User();
U 132         admin.setId("admin");
133         admin.setPw("admin");
134         UserMgr um = new UserMgr();
135         um.setServletContext(servletContext);
136         um.createUser(admin);
314fea 137       }
U 138     } catch(Exception ex) {
139       logger.log(Level.INFO, ex.getMessage(), ex);
140     }
141   }
142   
143   @SuppressWarnings("rawtypes")
144   private boolean dbVorhanden(PersistenceManager pm, String sql) {
145     boolean istVorhanden = false;
146     List<List<String>> list = pm.select(sql, Record.WITHOUT_BLOBS);
147     if(list.size() > 1) {
148       istVorhanden = true;
149       logger.fine("Datenbank ist vorhanden");
150     }
151     return istVorhanden;
152   }
153     
154   private String getSqlSkript() throws Exception {
155     File basis = new File(this.getClass().getResource("/").toURI());
156     File skript = new File(basis.getParentFile(), SCRIPT_NAME);
157     return fromStream(new FileInputStream(skript));
158   }
159   
160   private String fromStream(InputStream in) throws IOException
161   {
162     BufferedReader reader = new BufferedReader(new InputStreamReader(in));
163     StringBuilder out = new StringBuilder();
164     String line;
165     while ((line = reader.readLine()) != null) {
166       out.append(line);
167     }
168     return out.toString();
169   }
170
171   /* --- ServletContextListener --- */
172   
7fb4d9 173   @Override
U 174   public void contextInitialized(ServletContextEvent sce) {
314fea 175     ServletContext servletContext = sce.getServletContext();
6240cd 176     initApp(servletContext);
7fb4d9 177   }
U 178
179   @Override
180   public void contextDestroyed(ServletContextEvent sce) {
181     // destroy whatever 
182   }
183   
184 }