KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > info > jtrac > util > JtracConfigurer


1 /*
2  * Copyright 2002-2005 the original author or authors.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */

16
17 package info.jtrac.util;
18
19 import java.io.File JavaDoc;
20 import java.io.FileInputStream JavaDoc;
21 import java.io.FileOutputStream JavaDoc;
22 import java.io.FilenameFilter JavaDoc;
23 import java.io.InputStream JavaDoc;
24 import java.io.OutputStream JavaDoc;
25 import java.io.PrintWriter JavaDoc;
26 import java.io.Writer JavaDoc;
27 import java.util.Properties JavaDoc;
28 import javax.servlet.ServletContext JavaDoc;
29 import org.apache.commons.logging.Log;
30 import org.apache.commons.logging.LogFactory;
31 import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
32 import org.springframework.core.io.ClassPathResource;
33 import org.springframework.core.io.FileSystemResource;
34 import org.springframework.web.context.ServletContextAware;
35
36 /**
37  * Custom extension of the Spring PropertyPlaceholderConfigurer that
38  * sets up the jtrac.home System property (creates if required) and also creates
39  * a default jtrac.properties file for HSQLDB - useful for those who want
40  * to quickly evaluate JTrac. Just dropping the war into a servlet container
41  * would work without the need to even configure a datasource.
42  *
43  * This class would effectively do nothing if a "jtrac.properties" file exists in jtrac.home
44  *
45  * 1) a "jtrac.home" property is looked for in /WEB-INF/classes/jtrac-init.properties
46  * 2) if not found, then a "jtrac.home" system property is checked for
47  * 3) then a servlet context init-parameter called "jtrac.home" is looked for
48  * 4) last resort, a ".jtrac" folder is created in the "user.home" and used as "jtrac.home"
49  *
50  * Other tasks
51  * - initialize the "test" query for checking idle database connections
52  * - initialize list of available locales based on the properties files available
53  *
54  * Note that later on during startup, the HibernateJtracDao would check if
55  * database tables exist, and if they dont, would proceed to create them
56  */

57
58 public class JtracConfigurer extends PropertyPlaceholderConfigurer implements ServletContextAware {
59     
60     private final Log logger = LogFactory.getLog(getClass());
61  
62     private ServletContext JavaDoc servletContext;
63
64     public JtracConfigurer() {
65         // zero arg constructor
66
}
67
68     public void setServletContext(ServletContext JavaDoc servletContext) {
69         this.servletContext = servletContext;
70     }
71
72     public void init() throws Exception JavaDoc {
73         String JavaDoc jtracHome = null;
74         ClassPathResource cpr = new ClassPathResource("jtrac-init.properties");
75         File JavaDoc initPropsFile = cpr.getFile();
76         if (initPropsFile.exists()) {
77             logger.info("found 'jtrac-init.properties' on classpath, processing...");
78             InputStream JavaDoc is = null;
79             Properties JavaDoc props = new Properties JavaDoc();
80             try {
81                 is = new FileInputStream JavaDoc(initPropsFile);
82                 props.load(is);
83             } finally {
84                 is.close();
85             }
86             jtracHome = props.getProperty("jtrac.home");
87             if (jtracHome != null) {
88                 logger.info("'jtrac.home' property initialized from 'jtrac-init.properties' as '" + jtracHome + "'");
89             }
90             FilenameFilter JavaDoc ff = new FilenameFilter JavaDoc() {
91                 public boolean accept(File JavaDoc dir, String JavaDoc name) {
92                     return name.startsWith("messages_") && name.endsWith(".properties");
93                 }
94             };
95             File JavaDoc[] messagePropsFiles = initPropsFile.getParentFile().listFiles(ff);
96             String JavaDoc locales = "en";
97             for(File JavaDoc f : messagePropsFiles) {
98                 int endIndex = f.getName().indexOf('.');
99                 logger.debug("found " + f.getName());
100                 String JavaDoc localeCode = f.getName().substring(9, endIndex);
101                 locales += "," + localeCode;
102             }
103             logger.info("locales available configured are '" + locales + "'");
104             System.setProperty("jtrac.locales", locales);
105         } else {
106             System.setProperty("jtrac.locales", "en");
107         }
108         if (jtracHome == null) {
109             logger.info("valid 'jtrac.home' property not available in 'jtrac-init.properties', trying system properties.");
110             jtracHome = System.getProperty("jtrac.home");
111             if (jtracHome != null) {
112                 logger.info("'jtrac.home' property initialized from system properties as '" + jtracHome + "'");
113             }
114         }
115         if (jtracHome == null) {
116             logger.info("valid 'jtrac.home' property not available in system properties, trying servlet init paramters.");
117             jtracHome = servletContext.getInitParameter("jtrac.home");
118             if (jtracHome != null) {
119                 logger.info("Servlet init parameter 'jtrac.home' exists: '" + jtracHome + "'");
120             }
121         }
122         if (jtracHome == null) {
123             jtracHome = System.getProperty("user.home") + "/.jtrac";
124             logger.warn("Servlet init paramter 'jtrac.home' does not exist. Will use 'user.home' directory '" + jtracHome + "'");
125         }
126         System.setProperty("jtrac.home", jtracHome);
127         File JavaDoc homeFile = new File JavaDoc(jtracHome);
128         if (!homeFile.exists()) {
129             homeFile.mkdir();
130             logger.info("directory does not exist, created '" + homeFile.getPath() + "'");
131             if (!homeFile.exists()) {
132                 String JavaDoc message = "invalid path '" + homeFile.getAbsolutePath() + "', try creating this directory first. Aborting.";
133                 logger.fatal(message);
134                 throw new RuntimeException JavaDoc(message);
135             }
136         } else {
137             logger.info("directory already exists: '" + homeFile.getPath() + "'");
138         }
139         System.setProperty("jtrac.home", homeFile.getAbsolutePath());
140         File JavaDoc attachmentsFile = new File JavaDoc(jtracHome + "/attachments");
141         if (!attachmentsFile.exists()) {
142             attachmentsFile.mkdir();
143             logger.info("directory does not exist, created '" + attachmentsFile.getPath() + "'");
144         } else {
145             logger.info("directory already exists: '" + attachmentsFile.getPath() + "'");
146         }
147         File JavaDoc indexesFile = new File JavaDoc(jtracHome + "/indexes");
148         if (!indexesFile.exists()) {
149             indexesFile.mkdir();
150             logger.info("directory does not exist, created '" + indexesFile.getPath() + "'");
151         } else {
152             logger.info("directory already exists: '" + indexesFile.getPath() + "'");
153         }
154         File JavaDoc propFile = new File JavaDoc(homeFile.getPath() + "/jtrac.properties");
155         if (!propFile.exists()) {
156             propFile.createNewFile();
157             logger.info("properties file does not exist, created '" + propFile.getPath() + "'");
158             OutputStream JavaDoc os = new FileOutputStream JavaDoc(propFile);
159             Writer JavaDoc out = new PrintWriter JavaDoc(os);
160             try {
161                 out.write("database.driver=org.hsqldb.jdbcDriver\n");
162                 out.write("database.url=jdbc:hsqldb:file:${jtrac.home}/db/jtrac\n");
163                 out.write("database.username=sa\n");
164                 out.write("database.password=\n");
165                 out.write("hibernate.dialect=org.hibernate.dialect.HSQLDialect\n");
166                 out.write("hibernate.show_sql=false\n");
167             } finally {
168                 out.close();
169                 os.close();
170             }
171             logger.info("HSQLDB will be used. Finished creating '" + propFile.getPath() + "'");
172         } else {
173             logger.info("'jtrac.properties' file exists: '" + propFile.getPath() + "'");
174         }
175         FileSystemResource fsr = new FileSystemResource(propFile);
176         logger.info("opening for processing: " + fsr);
177         InputStream JavaDoc is = null;
178         Properties JavaDoc props = new Properties JavaDoc();
179         try {
180             is = new FileInputStream JavaDoc(fsr.getFile());
181             props.load(is);
182         } finally {
183             is.close();
184         }
185         String JavaDoc databaseUrl = props.getProperty("database.url");
186         if (databaseUrl.trim().startsWith("jdbc:hsqldb:file")) {
187             logger.info("embedded HSQLDB mode detected, switching on spring single connection data source");
188             System.setProperty("jtrac.datasource", "dataSource");
189             System.setProperty("database.validationQuery", "");
190         } else {
191             logger.info("Not using embedded HSQLDB, switching on Apache DBCP data source connection pooling");
192             System.setProperty("jtrac.datasource", "dataSourceDbcp");
193             String JavaDoc validationQuery = props.getProperty("database.validationQuery");
194             if (validationQuery == null) {
195                 logger.info("database.validationQuery property not found in 'jtrac.properties', using default 'SELECT 1'");
196                 System.setProperty("database.validationQuery", "SELECT 1");
197             } else {
198                 logger.info("database.validationQuery property found in 'jtrac.properties': '" + validationQuery + "'");
199             }
200         }
201         setLocation(fsr);
202     }
203     
204 }
205
Popular Tags