move the new versioning thing down so it actually works
[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
83     configHash.put("Home", ctx.getRealPath("/"));
84     configHash.put("ServletContext", ctx);
85     configHash.put("RootUri", ctxPath);
86
87     Enumeration resKeys = getResourceKeys();
88     while(resKeys.hasMoreElements()) {
89       String keyNm = (String)resKeys.nextElement();
90       configHash.put(keyNm, getProperty(keyNm));
91     }
92     configHash.put("Mir.Version", "$Name:  $");
93   }
94
95   public static void setAdminServletName(String servletName) {
96     configHash.put("AdminServletName",servletName);
97   }
98
99   public static void setOpenServletName(String servletName) {
100     configHash.put("OpenServletName",servletName);
101   }
102
103   /**
104    * Returns the property asked for by pulling it out a HashMap
105    * @param a String containing the property name (key)
106    * @return a String containing the prop. value
107    */
108   public static String getProp(String propName) {
109     return (String)configHash.get(propName);
110   }
111
112   /**
113    * Returns the property asked for by pulling it out a HashMap and
114    * appending it to configproperty "Home"
115    * @param a String containing the property name (key)
116    * @return a String containing the prop.value
117    */
118   public static String getPropWithHome(String propName) {
119     return (String)configHash.get("Home") +
120            (String)configHash.get(propName);
121   }
122
123   /**
124    * Returns the property asked for iin raw Object form by 
125    * pulling it out a HashMap
126    * @param a String containing the property name (key)
127    * @return an Object containing the prop.value
128    */
129   public static Object getPropAsObject(String propName) {
130     return configHash.get(propName);
131   }
132
133   public static void initDbPool () throws StorageObjectException {
134     if (configHash == null) {
135         throw new StorageObjectException("MirConfig -- Trying initialize "+
136                                         "DB pool when system not yet "+
137                                         "configured");
138     }
139     String dbUser=getProp("Database.Username");
140     String dbPassword=getProp("Database.Password");
141     String dbHost=getProp("Database.Host");
142     String dbAdapName=getProp("Database.Adaptor");
143     DatabaseAdaptor adaptor;
144     try {
145       adaptor = (DatabaseAdaptor)Class.forName(dbAdapName).newInstance();
146     } catch (Exception e) {
147       throw new StorageObjectException("Could not load DB adapator: "+
148                                         e.toString());
149     }
150     String dbDriver=adaptor.getDriver();
151     String dbUrl=adaptor.getURL(dbUser,dbPassword, dbHost);
152     System.out.println("adding Broker with: " +dbDriver+":"+dbUrl );
153     addBroker( dbDriver, dbUrl);
154   }
155
156   public static void addBroker(String driver, String URL)
157     throws StorageObjectException {
158
159     if (configHash == null) {
160         throw new StorageObjectException("MirConfig -- Trying initialize "+
161                                         "DB pool when system not yet "+
162                                         "configured");
163     }
164     String username,passwd,min,max,log,reset,dbname,dblogfile;
165
166     if(!brokerHash.containsKey("Pool.broker")){
167       username=getProp("Database.Username");
168       passwd=getProp("Database.Password");
169       min=getProp("Database.poolMin");
170       max=getProp("Database.poolMax");
171       dbname=getProp("Database.Name");
172       log=getProp("Home")+ configHash.get("Database.PoolLog");
173       reset=getProp("Database.poolResetTime");
174       dblogfile=getPropWithHome("Database.Logfile");
175
176       System.err.println("-- making Broker for -"
177                           +driver+" - " +URL
178                           + " log " + log + " user "
179                           + username + " pass: " + passwd);
180
181       JDBCPoolMetaData meta = new JDBCPoolMetaData();
182       meta.setDbname(dbname);
183       meta.setDriver(driver);
184       meta.setURL(URL);
185       meta.setUserName(username);
186       meta.setPassword(passwd);
187       meta.setJNDIName("mir");
188       meta.setMaximumSize(Integer.parseInt(max));
189       meta.setMinimumSize(Integer.parseInt(min));
190       meta.setPoolPreparedStatements(false);
191       meta.setCacheEnabled(false);
192       meta.setCacheSize(15);
193       meta.setDebugging(false);
194       meta.setLogFile(dblogfile+".pool");
195
196       JDBCPool pool = SQLManager.getInstance().createPool(meta);
197
198       if (pool!=null){
199         instances++;
200         brokerHash.put("Pool.broker",pool);
201       }
202
203     } // end if
204   }
205
206   /**
207    * Finalize method
208    */
209   public void finalize(){
210     instances --;
211     try {
212       super.finalize();
213     } catch (Throwable t) {}
214   }
215
216 }