use req.getContextPath to find the RootUri.. much more robust. 4.0 and 4.1 compatible...
[mir.git] / source / mir / misc / MirConfig.java
1 /*
2  * Copyright (C) 2001, 2002  The Mir-coders group
3  *
4  * This file is part of Mir.
5  *
6  * Mir is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * Mir is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with Mir; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  *
20  * In addition, as a special exception, The Mir-coders gives permission to link
21  * the code of this program with the com.oreilly.servlet library, any library
22  * licensed under the Apache Software License, The Sun (tm) Java Advanced
23  * Imaging library (JAI), The Sun JIMI library (or with modified versions of
24  * the above that use the same license as the above), and distribute linked
25  * combinations including the two.  You must obey the GNU General Public
26  * License in all respects for all of the code used other than the above
27  * mentioned libraries.  If you modify this file, you may extend this exception
28  * to your version of the file, but you are not obligated to do so.  If you do
29  * not wish to do so, delete this exception statement from your version.
30  */
31
32 package  mir.misc;
33
34 import  java.net.*;
35 import  java.io.*;
36 import  java.util.*;
37 import  java.lang.*;
38
39 import  javax.servlet.ServletContext;
40 import  javax.servlet.http.*;
41
42 import  mir.storage.StorageObjectException;
43 import  mir.storage.DatabaseAdaptor;
44 import com.codestudio.util.*;
45
46 /**
47  * Title:        Mir
48  * Description:  Class that allows access to all Mir
49  *               config values
50  * Copyright:    Copyright (c) 2001
51  * Company:      Indymedia
52  * @author       mh <heckmann@hbe.ca>
53  * @version 0.1
54  */
55
56
57 /**
58  * This class is a layer above the Configuration
59  * It manages access to config variables that are
60  * both generated on the fly and found in the config file.
61  */
62
63 public class MirConfig extends Configuration {
64
65   private static HashMap configHash = null;
66   private static HashMap brokerHash = new HashMap();
67   private static int      instances=0;
68
69   /**
70    * Initializes Configuration hash that contains all values.
71    * loads the properties-file and any other values
72    * @param uri, the root Uri of the install
73    * @param home, The absolute path if the install root.
74    * @param name, The name of the servlet (usually "Mir")
75    * @param confName, the name of the config file to load.
76    */
77   public static synchronized void initConfig(ServletContext ctx, String ctxPath,
78                                             String name, String confName) {
79     initConfResource(confName);
80     configHash = new HashMap();
81
82     configHash.put("Home", ctx.getRealPath("/"));
83     configHash.put("ServletContext", ctx);
84     configHash.put("RootUri", ctxPath);
85
86     Enumeration resKeys = getResourceKeys();
87     while(resKeys.hasMoreElements()) {
88       String keyNm = (String)resKeys.nextElement();
89       configHash.put(keyNm, getProperty(keyNm));
90     }
91   }
92
93   public static void setAdminServletName(String servletName) {
94     configHash.put("AdminServletName",servletName);
95   }
96
97   public static void setOpenServletName(String servletName) {
98     configHash.put("OpenServletName",servletName);
99   }
100
101   /**
102    * Returns the property asked for by pulling it out a HashMap
103    * @param a String containing the property name (key)
104    * @return a String containing the prop. value
105    */
106   public static String getProp(String propName) {
107     return (String)configHash.get(propName);
108   }
109
110   /**
111    * Returns the property asked for by pulling it out a HashMap and
112    * appending it to configproperty "Home"
113    * @param a String containing the property name (key)
114    * @return a String containing the prop.value
115    */
116   public static String getPropWithHome(String propName) {
117     return (String)configHash.get("Home") +
118            (String)configHash.get(propName);
119   }
120
121   /**
122    * Returns the property asked for iin raw Object form by 
123    * pulling it out a HashMap
124    * @param a String containing the property name (key)
125    * @return an Object containing the prop.value
126    */
127   public static Object getPropAsObject(String propName) {
128     return configHash.get(propName);
129   }
130
131   public static void initDbPool () throws StorageObjectException {
132     if (configHash == null) {
133         throw new StorageObjectException("MirConfig -- Trying initialize "+
134                                         "DB pool when system not yet "+
135                                         "configured");
136     }
137     String dbUser=getProp("Database.Username");
138     String dbPassword=getProp("Database.Password");
139     String dbHost=getProp("Database.Host");
140     String dbAdapName=getProp("Database.Adaptor");
141     DatabaseAdaptor adaptor;
142     try {
143       adaptor = (DatabaseAdaptor)Class.forName(dbAdapName).newInstance();
144     } catch (Exception e) {
145       throw new StorageObjectException("Could not load DB adapator: "+
146                                         e.toString());
147     }
148     String dbDriver=adaptor.getDriver();
149     String dbUrl=adaptor.getURL(dbUser,dbPassword, dbHost);
150     System.out.println("adding Broker with: " +dbDriver+":"+dbUrl );
151     addBroker( dbDriver, dbUrl);
152   }
153
154   public static void addBroker(String driver, String URL)
155     throws StorageObjectException {
156
157     if (configHash == null) {
158         throw new StorageObjectException("MirConfig -- Trying initialize "+
159                                         "DB pool when system not yet "+
160                                         "configured");
161     }
162     String username,passwd,min,max,log,reset,dbname,dblogfile;
163
164     if(!brokerHash.containsKey("Pool.broker")){
165       username=getProp("Database.Username");
166       passwd=getProp("Database.Password");
167       min=getProp("Database.poolMin");
168       max=getProp("Database.poolMax");
169       dbname=getProp("Database.Name");
170       log=getProp("Home")+ configHash.get("Database.PoolLog");
171       reset=getProp("Database.poolResetTime");
172       dblogfile=getPropWithHome("Database.Logfile");
173
174       System.err.println("-- making Broker for -"
175                           +driver+" - " +URL
176                           + " log " + log + " user "
177                           + username + " pass: " + passwd);
178
179       JDBCPoolMetaData meta = new JDBCPoolMetaData();
180       meta.setDbname(dbname);
181       meta.setDriver(driver);
182       meta.setURL(URL);
183       meta.setUserName(username);
184       meta.setPassword(passwd);
185       meta.setJNDIName("mir");
186       meta.setMaximumSize(Integer.parseInt(max));
187       meta.setMinimumSize(Integer.parseInt(min));
188       meta.setPoolPreparedStatements(false);
189       meta.setCacheEnabled(false);
190       meta.setCacheSize(15);
191       meta.setDebugging(false);
192       meta.setLogFile(dblogfile+".pool");
193
194       JDBCPool pool = SQLManager.getInstance().createPool(meta);
195
196       if (pool!=null){
197         instances++;
198         brokerHash.put("Pool.broker",pool);
199       }
200
201     } // end if
202   }
203
204   /**
205    * Finalize method
206    */
207   public void finalize(){
208     instances --;
209     try {
210       super.finalize();
211     } catch (Throwable t) {}
212   }
213
214 }