/*
Copyright (C) 2011 Diego Darriba, David Posada
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program 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
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package es.uvigo.darwin.jmodeltest;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.Map;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import es.uvigo.darwin.jmodeltest.utilities.Utilities;
/**
* ModelTestConfiguration.java
*
* Description: Configuration parameters
*
* @author Diego Darriba, University of Vigo / University of A Coruna, Spain
* ddarriba@udc.es
* @author David Posada, University of Vigo, Spain dposada@uvigo.es |
* darwin.uvigo.es
* @version 2.1.10 (Mar 2016)
*/
public abstract class ModelTestConfiguration {
private static String convertPathToAbsolute(String path) {
Map<String, String> envMap = System.getenv();
String pattern = "\\$\\{([A-Za-z0-9]+)\\}";
Pattern expr = Pattern.compile(pattern);
Matcher matcher = expr.matcher(path);
while (matcher.find()) {
String envValue = envMap.get(matcher.group(1).toUpperCase());
if (envValue == null) {
envValue = "";
} else {
envValue = envValue.replace("\\", "\\\\");
}
Pattern subexpr = Pattern.compile(Pattern.quote(matcher.group(0)));
path = subexpr.matcher(path).replaceAll(envValue);
}
if (Utilities.isWindows()) {
// change wrong path separators
path.replace('/', '\\');
} else {
File fPath = new File(path);
if (!fPath.isAbsolute()) {
path = PATH + path;
}
}
return path;
}
/** The application APPLICATION_PROPERTIES. */
private static final Properties APPLICATION_PROPERTIES;
public static final boolean DEFAULT_GLOBAL_PHYML = false;
private static String JAR_PATH;
public static String PATH;
public static String DEFAULT_EXE_DIR;
public static String DEFAULT_LOG_DIR;
public static final String HTML_LOG = "html-logging";
public static final String PHYML_LOG = "phyml-logging";
public static final String CKP_LOG = "checkpointing";
public static final String LOG_DIR = "log-dir";
public static final String EXE_DIR = "exe-dir";
public static final String GLOBAL_PHYML_EXE = "global-phyml-exe";
public static final String G_THREADS = "gamma-threads";
public static final String I_THREADS = "inv-threads";
public static final String U_THREADS = "uniform-threads";
static {
APPLICATION_PROPERTIES = new Properties();
try {
if (ModelTest.MPJ_RUN)
PATH = System.getProperty("user.dir") + File.separator;
else {
File f = new File(ModelTest.class.getProtectionDomain().getCodeSource()
.getLocation().toURI());
JAR_PATH = f.getAbsolutePath();
PATH = JAR_PATH.replaceFirst(new File(JAR_PATH).getName(), "");
}
} catch (URISyntaxException e) {
PATH = System.getProperty("user.dir") + File.separator;
}
DEFAULT_EXE_DIR = PATH + "exe" + File.separator + "phyml";
DEFAULT_LOG_DIR = PATH + "log";
try {
FileInputStream prop = new FileInputStream(
convertPathToAbsolute(ModelTest.CONFIG_FILE));
APPLICATION_PROPERTIES.load(prop);
/* load also user definitions */
for (Object key : ModelTest.USERDEF_PROPERTIES.keySet()) {
String strKey = (String) key;
if (strKey.equals(LOG_DIR) || strKey.equals(EXE_DIR)) {
File fDir = new File(
ModelTest.USERDEF_PROPERTIES.getProperty(strKey));
if (!fDir.exists()) {
System.err.println("\nCOMMAND LINE ERROR: Unexistent directory "
+ fDir.getAbsolutePath());
ModelTest.CommandLineError();
} else if (!(fDir.isDirectory() && fDir.canRead())
|| (strKey.equals(LOG_DIR) && !fDir.canWrite())) {
System.err.println("\nCOMMAND LINE ERROR: Argument "
+ fDir.getAbsolutePath()
+ " is not a directory or you have not the required permissions on it");
ModelTest.CommandLineError();
}
APPLICATION_PROPERTIES.setProperty(strKey, fDir.getAbsolutePath());
} else {
APPLICATION_PROPERTIES.setProperty(strKey,
ModelTest.USERDEF_PROPERTIES.getProperty(strKey));
}
}
if (existsKey(LOG_DIR)) {
/* test writing */
File logDir = new File(getLogDir());
if ((isCkpEnabled() || isPhymlLogEnabled() || isHtmlLogEnabled())
&& !(logDir.exists() && logDir.canWrite())) {
System.err.println("WARNING: Cannot write in 'log' directory ("
+ getLogDir() + "): All logging will be disabled");
System.err.println(
" If you want to fix this warning, check 'conf/jmodeltest.conf'");
System.err.println(
" Change the logging directory to where you have writing permission");
System.err.println(
" or disable 'checkpointing', 'html-logging' and 'phyml-logging' properties\n");
disableHtmlLog();
disablePhymlLog();
disableCkpLog();
}
} else {
disableHtmlLog();
disablePhymlLog();
disableCkpLog();
}
} catch (IOException e) {
System.err.println(
"Configuration file (" + convertPathToAbsolute(ModelTest.CONFIG_FILE)
+ ") cannot be resolved");
System.exit(-1);
}
}
public static boolean existsKey(String key) {
return !(getProperty(key).equals("n/a"));
}
public static String getProperty(String key) {
return APPLICATION_PROPERTIES.getProperty(key, "n/a");
}
public static String getExeDir() {
String exeDir;
if (existsKey(EXE_DIR)) {
exeDir = getProperty(EXE_DIR);
} else {
exeDir = DEFAULT_EXE_DIR;
}
return convertPathToAbsolute(exeDir);
}
public static void disableCkpLog() {
APPLICATION_PROPERTIES.setProperty(CKP_LOG, "disabled");
}
public static void disablePhymlLog() {
APPLICATION_PROPERTIES.setProperty(PHYML_LOG, "disabled");
}
public static void disableHtmlLog() {
APPLICATION_PROPERTIES.setProperty(HTML_LOG, "disabled");
}
public static boolean isGlobalPhymlBinary() {
String propValue = getProperty(GLOBAL_PHYML_EXE);
return (existsKey(propValue) && getProperty(GLOBAL_PHYML_EXE).equalsIgnoreCase("true"));
}
public static boolean isHtmlLogEnabled() {
return getProperty(HTML_LOG).equalsIgnoreCase("enabled");
}
public static boolean isPhymlLogEnabled() {
return getProperty(PHYML_LOG).equalsIgnoreCase("enabled");
}
public static boolean isCkpEnabled() {
return getProperty(CKP_LOG).equalsIgnoreCase("enabled");
}
public static String getLogDir() {
String logDir = getProperty(LOG_DIR);
if (logDir == null) {
logDir = DEFAULT_LOG_DIR;
}
return convertPathToAbsolute(logDir);
}
public static Properties getProperties() {
return APPLICATION_PROPERTIES;
}
}