939e5fe100bbc0c0dee481c4d6cd02346cddab48
[jabaws.git] / engine / compbio / engine / conf / PropertyHelperManager.java
1 /* Copyright (c) 2009 Peter Troshin\r
2  *  \r
3  *  JAva Bioinformatics Analysis Web Services (JABAWS) @version: 1.0     \r
4  * \r
5  *  This library is free software; you can redistribute it and/or modify it under the terms of the\r
6  *  Apache License version 2 as published by the Apache Software Foundation\r
7  * \r
8  *  This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without\r
9  *  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Apache \r
10  *  License for more details.\r
11  * \r
12  *  A copy of the license is in apache_license.txt. It is also available here:\r
13  * @see: http://www.apache.org/licenses/LICENSE-2.0.txt\r
14  * \r
15  * Any republication or derived work distributed in source code form\r
16  * must include this copyright and license notice.\r
17  */\r
18 \r
19 package compbio.engine.conf;\r
20 \r
21 import java.io.File;\r
22 import java.io.IOException;\r
23 import java.net.URISyntaxException;\r
24 import java.net.URL;\r
25 \r
26 import javax.naming.ConfigurationException;\r
27 \r
28 import org.apache.log4j.Logger;\r
29 \r
30 import compbio.util.PropertyHelper;\r
31 import compbio.util.Util;\r
32 \r
33 public final class PropertyHelperManager {\r
34 \r
35         private static Logger log = Logger.getLogger(PropertyHelperManager.class);\r
36         private static PropertyHelper ph = null;\r
37         public static final String confDir = "conf" + File.separator;\r
38 \r
39         /**\r
40          * Ways to fix path problem: 1) find a path to WEB-INF directory based on\r
41          * the path to a known class. Then prepend this absolute path to the rest of\r
42          * paths pros: no input from user cons: relocation of the source may cause\r
43          * problems 2) Require users to add configuration directories to the class\r
44          * path and then load entries from it. pros: cons: Many paths needs to be\r
45          * added. Put significant burden on the user. Hard to tell web appl server\r
46          * to add these entries to its class path. 3) Ask for project source\r
47          * directory explicitly in the configuration. pros cons: similar to 1, but\r
48          * this initial configuration file must reside in well known location! Why\r
49          * ask users what can be found automatically? 4) Have everything in the\r
50          * location already in class path for tomcat. cons: only classes and\r
51          * lib/*.jar are added, eclipse will remove non classses from classes dir.\r
52          * \r
53          * Try 1 - succeed.\r
54          * \r
55          * @return\r
56          */\r
57         public static PropertyHelper getPropertyHelper() {\r
58                 if (ph == null) {\r
59                         try {\r
60                                 File locEngineProp = getResourceFromClasspath(confDir\r
61                                                 + "Engine.local.properties");\r
62                                 File clustEngineProp = getResourceFromClasspath(confDir\r
63                                                 + "Engine.cluster.properties");\r
64                                 File execProp = getResourceFromClasspath(confDir\r
65                                                 + "Executable.properties");\r
66                                 ph = new PropertyHelper(locEngineProp, clustEngineProp,\r
67                                                 execProp);\r
68                         } catch (IOException e) {\r
69                                 log.warn(\r
70                                                 "Cannot read property files! Reason: "\r
71                                                                 + e.getLocalizedMessage(), e.getCause());\r
72                         }\r
73                 }\r
74                 return ph;\r
75         }\r
76 \r
77         static File getResourceFromClasspath(String resourceName) {\r
78                 assert !Util.isEmpty(resourceName);\r
79                 String locPath = getLocalPath();\r
80                 File prop = new File(locPath + resourceName);\r
81                 if (!prop.exists()) {\r
82                         log.warn("Could not find a resource " + resourceName\r
83                                         + " in the classpath!");\r
84                 }\r
85                 return prop;\r
86         }\r
87 \r
88         /**\r
89          * Method return the absolute path to the project root directory. It assumes\r
90          * the following structure of the project project root conf settings\r
91          * binaries WEB-INF classes compbio engine conf If the structure changes it\r
92          * must be reflected in this method\r
93          * \r
94          * @return\r
95          * @throws ConfigurationException\r
96          */\r
97         public static String getLocalPath() {\r
98                 String clname = PropertyHelperManager.class.getSimpleName();\r
99                 URL url = PropertyHelperManager.class.getResource(clname + ".class");\r
100                 File f = null;\r
101                 try {\r
102                         f = new File(url.toURI());\r
103                         // Iterate up the hierarchy to find a root project directory\r
104                         for (int i = 0; i < 6; i++) {\r
105                                 f = f.getParentFile();\r
106                         }\r
107                 } catch (URISyntaxException e) {\r
108                         String message = "Could not find resources path! Problems locating PropertyHelperManager class! "\r
109                                         + e.getLocalizedMessage();\r
110                         log.error(message, e.getCause());\r
111                         throw new RuntimeException(message, e.getCause());\r
112                 } catch (IllegalArgumentException e) {\r
113                         // Classes are in the jar file, using different method to determine\r
114                         // the path new File(INCORRECT URL) throws it\r
115                         log.debug(\r
116                                         "It looks like classes are in the jar file. "\r
117                                                         + "Attempting a different method to determinine the path to the resources "\r
118                                                         + e.getLocalizedMessage(), e.getCause());\r
119                         try {\r
120                                 f = new File(PropertyHelperManager.class.getProtectionDomain()\r
121                                                 .getCodeSource().getLocation().toURI().getPath());\r
122 \r
123                                 // Iterate up the hierarchy to find a root project directory\r
124                                 // This time there is not need to walk up all class packages\r
125                                 // WEB_APPL_NAME\WEB-INF\lib\JAR-FILE-NAME\r
126                                 // jws2-1.0\WEB-INF\lib\full-jws2-1.0.jar\r
127                                 for (int i = 0; i < 3; i++) {\r
128                                         f = f.getParentFile();\r
129                                 }\r
130                         } catch (URISyntaxException e1) {\r
131                                 log.error(\r
132                                                 "Could not find resources path! "\r
133                                                                 + e1.getLocalizedMessage(), e1.getCause());\r
134                                 throw new RuntimeException("Could not find resources path! ",\r
135                                                 e1.getCause());\r
136                         }\r
137                 }\r
138                 log.debug("Project directory is: " + f.getAbsolutePath());\r
139                 return f.getAbsolutePath() + File.separator;\r
140         }\r
141 }\r