File: PropertyHelperManager.java

package info (click to toggle)
libjaba-client-java 2.2.0-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, forky, sid, trixie
  • size: 2,052 kB
  • sloc: java: 17,308; makefile: 12
file content (154 lines) | stat: -rw-r--r-- 5,913 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
/* Copyright (c) 2009 Peter Troshin
 *  
 *  JAva Bioinformatics Analysis Web Services (JABAWS) @version: 1.0     
 * 
 *  This library is free software; you can redistribute it and/or modify it under the terms of the
 *  Apache License version 2 as published by the Apache Software Foundation
 * 
 *  This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
 *  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Apache 
 *  License for more details.
 * 
 *  A copy of the license is in apache_license.txt. It is also available here:
 * @see: http://www.apache.org/licenses/LICENSE-2.0.txt
 * 
 * Any republication or derived work distributed in source code form
 * must include this copyright and license notice.
 */

package compbio.engine.conf;

import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;

import org.apache.log4j.Logger;

import compbio.util.PropertyHelper;
import compbio.util.Util;

public final class PropertyHelperManager {

	private static Logger log = Logger.getLogger(PropertyHelperManager.class);
	private static PropertyHelper ph = null;
	public static final String confDir = "conf" + File.separator;

	/**
	 * Ways to fix path problem: 
	 * 1) find a path to WEB-INF directory based on the path to a known class. 
	 * Then prepend this absolute path to the rest of paths 
	 * pros: no input from user 
	 * cons: relocation of the source may cause problems 
	 * 
	 * 2) Require users to add configuration directories to the class
	 * path and then load entries from it. 
	 * pros: 
	 * cons: Many paths needs to be added. Put significant burden on the user. 
	 * Hard to tell web appl server to add these entries to its class path. 
	 * 
	 * 3) Ask for project source directory explicitly in the configuration. 
	 * pros:
	 * cons: similar to 1, but this initial configuration file must reside in 
	 * well known location! Why ask users what can be found automatically?
	 * 
	 * 4) Have everything in the location already in class path for tomcat. 
	 * pros:
	 * cons: only classes and lib/*.jar are added, Eclipse will remove non 
	 * classses from classes dir.
	 * 
	 * Try 1 - succeed.
	 * 
	 * @return an instance
	 */
	public static PropertyHelper getPropertyHelper() {
		if (ph == null) {
			try {
				File locEngineProp = getResourceFromClasspath(confDir + "Engine.local.properties");
				File clustEngineProp = getResourceFromClasspath(confDir + "Engine.cluster.properties");
				File execProp = getResourceFromClasspath(confDir + "Executable.properties");
				File gaProp = getResourceFromClasspath(confDir + "GA.properties");
				ph = new PropertyHelper(locEngineProp, clustEngineProp, execProp, gaProp);
			} catch (IOException e) {
				log.warn("Cannot read property files! Reason: " + e.getLocalizedMessage(), e.getCause());
			}
		}
		return ph;
	}

	static File getResourceFromClasspath(String resourceName) {
		assert !Util.isEmpty(resourceName);
		String locPath = getLocalPath();
		File prop = new File(locPath + resourceName);
		if (!prop.exists()) {
			log.warn("Could not find a resource " + resourceName + " in the classpath!");
		}
		return prop;
	}

	/**
	 * Method return the absolute path to the project root directory. It assumes
	 * the following structure of the project:
	 * project-root: 
	 * conf/settings
	 * binaries 
	 * WEB-INF/classes/compbio/engine/conf/PropertyHelperManager.class
	 * If the structure changes it must be reflected in this method
	 * 
	 * @return the local path
	 * @throws RuntimeException
	 *             if cannot determine the local path
	 */
	public static String getLocalPath() {
		String clname = PropertyHelperManager.class.getSimpleName();
		URL url = PropertyHelperManager.class.getResource(clname + ".class");
		File f = null;
		try {
			f = new File(url.toURI());
			// Iterate up the hierarchy to find a root project directory
			for (int i = 0; i < 6; i++) {
				f = f.getParentFile();
			}
		} catch (URISyntaxException e) {
			String mes = "Could not find resources path! Problems locating PropertyHelperManager class! ";
			log.error(mes + e.getLocalizedMessage(), e.getCause());
			throw new RuntimeException(mes + e.getLocalizedMessage(), e.getCause());
		} catch (IllegalArgumentException e) {
			// Classes are in the jar file, using different method to determine
			// the path new File(INCORRECT URL) throws it
			String mes = "It looks like classes are in the jar file. " 
			           + "Attempting a different method to determinine the path to the resources";
			log.debug(mes + e.getLocalizedMessage(), e.getCause());
			try {
				f = new File(PropertyHelperManager.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());

				// Iterate up the hierarchy to find a root project directory
				// This time there is not need to walk up all class packages
				// WEB_APPL_NAME\WEB-INF\lib\JAR-FILE-NAME
				// jws2-1.0\WEB-INF\lib\full-jws2-1.0.jar
				for (int i = 0; i < 3; i++) {
					f = f.getParentFile();
				}
			} catch (URISyntaxException e1) {
				log.error("Could not find resources path! " + e1.getLocalizedMessage(), e1.getCause());
				throw new RuntimeException("Could not find resources path! ", e1.getCause());
			}
		}
		log.debug("Project directory is: " + f.getAbsolutePath());
		return f.getAbsolutePath() + File.separator;
	}

	public static int getIntProperty(String propValue) {
		if (!Util.isEmpty(propValue)) {
			return Integer.parseInt(propValue.trim());
		}
		return -1;
	}

	public static boolean getBooleanProperty(String propValue) {
		if (!Util.isEmpty(propValue)) {
			propValue = propValue.trim();
			return Boolean.parseBoolean(propValue);
		}
		return false;
	}}