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