/*
* Eoulsan development code
*
* This code may be freely distributed and modified under the
* terms of the GNU Lesser General Public License version 2.1 or
* later and CeCILL-C. This should be distributed with the code.
* If you do not have a copy, see:
*
* http://www.gnu.org/licenses/lgpl-2.1.txt
* http://www.cecill.info/licences/Licence_CeCILL-C_V1-en.txt
*
* Copyright for this code is held jointly by the Genomic platform
* of the Institut de Biologie de l'École normale supérieure and
* the individual authors. These should be listed in @author doc
* comments.
*
* For more information on the Eoulsan project and its aims,
* or to join the Eoulsan Google group, visit the home page
* at:
*
* http://outils.genomique.biologie.ens.fr/eoulsan
*
*/
package fr.ens.biologie.genomique.eoulsan;
import static fr.ens.biologie.genomique.eoulsan.EoulsanLogger.getLogger;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashSet;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import fr.ens.biologie.genomique.eoulsan.bio.FastqFormat;
import fr.ens.biologie.genomique.eoulsan.util.FileUtils;
import fr.ens.biologie.genomique.eoulsan.util.Utils;
/**
* This class define a settings class.
* @since 1.0
* @author Laurent Jourdren
*/
public final class Settings implements Serializable {
private static final long serialVersionUID = -7897805708866950402L;
private static final String MAIN_PREFIX_KEY = "main.";
private final Properties properties = new Properties();
private static final String DEBUG_KEY = MAIN_PREFIX_KEY + "debug";
private static final String AWS_ACCESS_KEY = "aws.access.key";
private static final String AWS_SECRET_KEY = "aws.secret.key";
private static final String PRINT_STACK_TRACE_KEY =
MAIN_PREFIX_KEY + "printstacktrace";
private static final String BYPASS_PLATFORM_CHECKING_KEY =
MAIN_PREFIX_KEY + "bypass.platform.checking";
private static final String TMP_DIR_KEY = MAIN_PREFIX_KEY + "tmp.dir";
private static final String EXECUTABLES_TMP_DIR_KEY =
MAIN_PREFIX_KEY + "executables.tmp.dir";
private static final String LOCAL_THREADS_NUMBER =
MAIN_PREFIX_KEY + "local.threads";
private static final String OUTPUT_TREE_TYPE =
MAIN_PREFIX_KEY + "output.tree.type";
private static final String DATA_FORMAT_PATH =
MAIN_PREFIX_KEY + "format.path";
private static final String GALAXY_TOOL_PATH =
MAIN_PREFIX_KEY + "galaxy.tool.path";
private static final String HADOOP_AWS_ACCESS_KEY =
"hadoop.conf.fs.s3n.awsAccessKeyId";
private static final String HADOOP_AWS_SECRET_KEY =
"hadoop.conf.fs.s3n.awsSecretAccessKey";
private static final String CLUSTER_SCHEDULER_NAME_KEY =
MAIN_PREFIX_KEY + "cluster.scheduler.name";
private static final String CLUSTER_DEFAULT_MEMORY_REQUIRED =
MAIN_PREFIX_KEY + "cluster.memory.required";
private static final String HADOOP_LOG_LEVEL_KEY =
MAIN_PREFIX_KEY + "hadoop.log.level";
private static final String RSERVE_ENABLED_KEY =
MAIN_PREFIX_KEY + "rserve.enable";
private static final String RSERVE_SERVER_NAME_KEY =
MAIN_PREFIX_KEY + "rserve.servername";
private static final String RSERVE_KEEP_FILES_KEY =
MAIN_PREFIX_KEY + "rserve.keep.files";
private static final String SAVE_RSCRIPTS_KEY =
MAIN_PREFIX_KEY + "save.r.scripts";
private static final String OBFUSCATE_DESIGN_KEY =
MAIN_PREFIX_KEY + "design.obfuscate";
private static final String OBFUSCATE_DESIGN_REMOVE_REPLICATE_INFO_KEY =
MAIN_PREFIX_KEY + "design.remove.replicate.info";
private static final String DEFAULT_FASTQ_FORMAT_KEY =
MAIN_PREFIX_KEY + "default.fastq.format";
private static final String GENOME_MAPPER_INDEX_STORAGE_KEY =
MAIN_PREFIX_KEY + "genome.mapper.index.storage.path";
private static final String GENOME_DESC_STORAGE_KEY =
MAIN_PREFIX_KEY + "genome.desc.storage.path";
private static final String GENOME_STORAGE_KEY =
MAIN_PREFIX_KEY + "genome.storage.path";
private static final String GFF_STORAGE_KEY =
MAIN_PREFIX_KEY + "gff.storage.path";
private static final String GTF_STORAGE_KEY =
MAIN_PREFIX_KEY + "gtf.storage.path";
private static final String ADDITIONAL_ANNOTATION_STORAGE_KEY =
MAIN_PREFIX_KEY + "additional.annotation.storage.path";
private static final String ADDITIONAL_ANNOTATION_HYPERTEXT_LINKS_KEY =
MAIN_PREFIX_KEY + "additional.annotation.hypertext.links.path";
private static final String SEND_RESULT_MAIL_KEY =
MAIN_PREFIX_KEY + "mail.send.result.mail";
private static final String RESULT_MAIL_KEY =
MAIN_PREFIX_KEY + "mail.send.result.mail.to";
private static final String SMTP_HOST_KEY =
MAIN_PREFIX_KEY + "mail.smtp.host";
private static final String DOCKER_URI_KEY = MAIN_PREFIX_KEY + "docker.uri";
private static final String ZOOKEEPER_CONNECT_STRING_KEY =
"zookeeper.connect.string";
private static final String ZOOKEEPER_DEFAULT_PORT_KEY =
"zookeeper.default.port";
private static final String ZOOKEEPER_SESSION_TIMEOUT_KEY =
"zookeeper.session.timeout";
private static final String USE_OLD_EOULSAN_RESULT_FORMAT_KEY =
MAIN_PREFIX_KEY + "old.result.format";
private static final String UI_NAME_KEY = MAIN_PREFIX_KEY + "ui.name";
private static final Set<String> FORBIDDEN_KEYS = Utils.unmodifiableSet(
new String[] {HADOOP_AWS_ACCESS_KEY, HADOOP_AWS_SECRET_KEY});
private static final Set<String> OBFUSCATED_KEYS =
Utils.unmodifiableSet(new String[] {AWS_ACCESS_KEY, AWS_SECRET_KEY,
HADOOP_AWS_ACCESS_KEY, HADOOP_AWS_SECRET_KEY});
//
// Getters
//
/**
* Test if a setting key exists.
* @return true if the setting exist
*/
public boolean isSetting(final String key) {
return this.properties.containsKey(key);
}
/**
* Test is the debug mode is enabled.
* @return true if the debug mode is enable
*/
public boolean isDebug() {
final String value =
this.properties.getProperty(DEBUG_KEY, Boolean.toString(Globals.DEBUG));
return Boolean.valueOf(value);
}
/**
* Test is the debug mode is enabled.
* @return true if the debug mode is enable
*/
public boolean isPrintStackTrace() {
final String value = this.properties.getProperty(PRINT_STACK_TRACE_KEY,
Boolean.toString(Globals.PRINT_STACK_TRACE_DEFAULT));
return Boolean.valueOf(value);
}
/**
* Get the AWS access key.
* @return the AWS access key
*/
public String getAWSAccessKey() {
return this.properties.getProperty(AWS_ACCESS_KEY);
}
/**
* Get the AWS secret key.
* @return the AWS secret key
*/
public String getAWSSecretKey() {
return this.properties.getProperty(AWS_SECRET_KEY);
}
/**
* Get the Hadoop log level.
* @return the Hadoop log level
*/
public String getHadoopLogLevel() {
return this.properties.getProperty(HADOOP_LOG_LEVEL_KEY);
}
/**
* Get the name of the cluster scheduler.
* @return the name of the cluster scheduler
*/
public String getClusterSchedulerName() {
return this.properties.getProperty(CLUSTER_SCHEDULER_NAME_KEY);
}
/**
* Get the default memory required for the steps in cluster mode.
* @return the default memory required for the cluster mode
*/
public int getDefaultClusterMemoryRequired() {
String value = this.properties.getProperty(CLUSTER_DEFAULT_MEMORY_REQUIRED);
if (value == null) {
return -1;
}
value = value.trim();
if (value.isEmpty()) {
return -1;
}
return Integer.parseInt(value);
}
/**
* Test if RServe is enabled.
* @return true if the RServe server is enabled
*/
public boolean isRServeServerEnabled() {
return Boolean
.parseBoolean(this.properties.getProperty(RSERVE_ENABLED_KEY));
}
/**
* Test if save.r.script is true
* @return boolean with keep Rscripts values
*/
public boolean isSaveRscripts() {
return Boolean.parseBoolean(this.properties.getProperty(SAVE_RSCRIPTS_KEY));
}
/**
* Get the RServe server name.
* @return The name of the RServe to use
*/
public String getRServeServerName() {
return this.properties.getProperty(RSERVE_SERVER_NAME_KEY);
}
/**
* Test if save.r.keep.files is true
* @return boolean if the RServe files must be kept
*/
public boolean isKeepRServeFiles() {
return Boolean
.parseBoolean(this.properties.getProperty(RSERVE_KEEP_FILES_KEY));
}
/**
* Get the temporary directory.
* @return The temporary directory
*/
public String getTempDirectory() {
return this.properties.getProperty(TMP_DIR_KEY,
System.getProperty("java.io.tmpdir"));
}
/**
* Get the temporary directory File.
* @return The temporary directory as a File object
*/
public File getTempDirectoryFile() {
return new File(getTempDirectory());
}
/**
* Test if the temporary directory File has been defined by user.
* @return true id the temporary directory has defined by user
*/
public boolean isUserDefinedTempDirectory() {
return this.properties.containsKey(TMP_DIR_KEY);
}
/**
* Get the temporary directory for executables.
* @return The temporary directory for executables
*/
public String getExecutablesTempDirectory() {
return this.properties.getProperty(EXECUTABLES_TMP_DIR_KEY,
getTempDirectory());
}
/**
* Get the temporary directory File for executables.
* @return The temporary directory for executables as a File object
*/
public File getExecutablesTempDirectoryFile() {
return new File(getExecutablesTempDirectory());
}
/**
* Test if design must be obfuscated
* @return true if design must be obfuscated
*/
public boolean isObfuscateDesign() {
return Boolean
.parseBoolean(this.properties.getProperty(OBFUSCATE_DESIGN_KEY,
Boolean.toString(Globals.OBFUSCATE_DESIGN_DEFAULT)));
}
/**
* Test if replicate information must be removed from design.
* @return true if replicate information must be removed
*/
public boolean isObfuscateDesignRemoveReplicateInfo() {
return Boolean.parseBoolean(this.properties
.getProperty(OBFUSCATE_DESIGN_REMOVE_REPLICATE_INFO_KEY, Boolean
.toString(Globals.OBFUSCATE_DESIGN_REMOVE_REPLICATE_INFO_DEFAULT)));
}
/**
* Get the number of threads to use in Steps computation in local mode.
* @return the number of threads to use
*/
public int getLocalThreadsNumber() {
return Integer.parseInt(this.properties.getProperty(LOCAL_THREADS_NUMBER,
"" + Runtime.getRuntime().availableProcessors()));
}
/**
* Get the default fastq format.
* @return the default fastq format
*/
public FastqFormat getDefaultFastqFormat() {
return FastqFormat.getFormatFromName(this.properties.getProperty(
DEFAULT_FASTQ_FORMAT_KEY, Globals.FASTQ_FORMAT_DEFAULT.getName()));
}
/**
* Test if the platform checking must be avoided at Eoulsan startup.
* @return true if the platform checking must be avoided
*/
public boolean isBypassPlatformChecking() {
return Boolean.parseBoolean(
this.properties.getProperty(BYPASS_PLATFORM_CHECKING_KEY));
}
/**
* Get the genome mapper index storage path.
* @return the path to genome mapper index storage path
*/
public String getGenomeMapperIndexStoragePath() {
return this.properties.getProperty(GENOME_MAPPER_INDEX_STORAGE_KEY);
}
/**
* Get the genome description storage path.
* @return the path to genome description storage path
*/
public String getGenomeDescStoragePath() {
return this.properties.getProperty(GENOME_DESC_STORAGE_KEY);
}
/**
* Get the genome storage path.
* @return the path to genome storage path
*/
public String getGenomeStoragePath() {
return this.properties.getProperty(GENOME_STORAGE_KEY);
}
/**
* Get the GFF storage path.
* @return the path to GFF storage path
*/
public String getGFFStoragePath() {
return this.properties.getProperty(GFF_STORAGE_KEY);
}
/**
* Get the GTF storage path.
* @return the path to GTF storage path
*/
public String getGTFStoragePath() {
return this.properties.getProperty(GTF_STORAGE_KEY);
}
/**
* Get the additional annotation storage path.
* @return the path to the additional annotation storage path
*/
public String getAdditionalAnnotationStoragePath() {
return this.properties.getProperty(ADDITIONAL_ANNOTATION_STORAGE_KEY);
}
/**
* Get the additional annotation hypertext links path.
* @return the additional annotation hypertext links path
*/
public String getAdditionalAnnotationHypertextLinksPath() {
return this.properties
.getProperty(ADDITIONAL_ANNOTATION_HYPERTEXT_LINKS_KEY);
}
/**
* Test if an email must be sent at the end of the analysis.
* @return true if an email must be sent at the end of the analysis
*/
public boolean isSendResultMail() {
return Boolean
.parseBoolean(this.properties.getProperty(SEND_RESULT_MAIL_KEY));
}
/**
* Get the mail address for eoulsan results.
* @return the mail address as a string
*/
public String getResultMail() {
return this.properties.getProperty(RESULT_MAIL_KEY);
}
/**
* Get the name of the SMTP server host.
* @return the name of the SMTP server host
*/
public String getSMTPHost() {
return this.properties.getProperty(SMTP_HOST_KEY);
}
/**
* Get the ZooKeeper connect string.
* @return the ZooKeeper connect string
*/
public String getZooKeeperConnectString() {
return this.properties.getProperty(ZOOKEEPER_CONNECT_STRING_KEY);
}
/**
* Get the ZooKeeper default port.
* @return the ZooKeeper default port
*/
public int getZooKeeperDefaultPort() {
return Integer
.parseInt(this.properties.getProperty(ZOOKEEPER_DEFAULT_PORT_KEY,
"" + Globals.ZOOKEEPER_DEFAULT_PORT_DEFAULT));
}
/**
* Get the ZooKeeper session timeout.
* @return the ZooKeeper session timeout
*/
public int getZooKeeperSessionTimeout() {
return Integer
.parseInt(this.properties.getProperty(ZOOKEEPER_SESSION_TIMEOUT_KEY,
"" + Globals.ZOOKEEPER_SESSION_TIMEOUT_DEFAULT));
}
/**
* Test if Eoulsan result files must be written using the old format.
* @return true if Eoulsan result files must be written using the old format
*/
public boolean isUseOldEoulsanResultFormat() {
return Boolean.parseBoolean(
this.properties.getProperty(USE_OLD_EOULSAN_RESULT_FORMAT_KEY,
"" + Globals.USE_OLD_EOULSAN_RESULT_FORMAT_DEFAULT));
}
/**
* Get the UI name.
* @return the UI name
*/
public String getUIName() {
return this.properties.getProperty(UI_NAME_KEY, Globals.UI_NAME_DEFAULT);
}
/**
* Get the Docker connection string.
* @return the docker connection string
*/
public String getDockerConnection() {
return this.properties.getProperty(DOCKER_URI_KEY);
}
/**
* Get the Docker connection URI.
* @return the docker connection URI
*/
public URI getDockerConnectionURI() {
final String connectionString = getDockerConnection();
if (connectionString == null || connectionString.trim().isEmpty()) {
return null;
}
try {
return new URI(connectionString);
} catch (URISyntaxException e) {
return null;
}
}
/**
* Get the format path.
* @return the format path
*/
public String getDataFormatPath() {
return this.properties.getProperty(DATA_FORMAT_PATH);
}
/**
* Get the Galaxy tool path.
* @return the Galaxy tool path
*/
public String getGalaxyToolPath() {
return this.properties.getProperty(GALAXY_TOOL_PATH);
}
/**
* Get the output tree type.
* @return the output tree type
*/
public String getOutputTreeType() {
return this.properties.getProperty(OUTPUT_TREE_TYPE,
Globals.OUTPUT_TREE_TYPE_DEFAULT);
}
/**
* Get a setting value.
* @return settingName value as a String
*/
public String getSetting(final String settingName) {
if (settingName == null) {
return null;
}
if (settingName.startsWith(MAIN_PREFIX_KEY)) {
return null;
}
return this.properties.getProperty(settingName);
}
/**
* Get the value of the setting as a integer value
* @return the value of the setting as an integer
* @throws EoulsanException if the value is not an integer
*/
public int getIntSetting(final String settingName) throws EoulsanException {
if (settingName == null) {
throw new EoulsanException("The setting name is null");
}
final String value = getSetting(settingName);
if (value == null) {
throw new EoulsanException(
"Invalid parameter, an integer parameter is need for "
+ settingName + " parameter: null");
}
try {
return Integer.parseInt(value);
} catch (NumberFormatException e) {
throw new EoulsanException(
"Invalid parameter, an integer parameter is need for "
+ settingName + " parameter: " + value);
}
}
/**
* Get the value of the setting as a double value
* @return the value of the setting as an double
* @throws EoulsanException if the value is not an double
*/
public double getDoubleSetting(final String settingName)
throws EoulsanException {
if (settingName == null) {
throw new EoulsanException("The setting name is null");
}
final String value = getSetting(settingName);
if (value == null) {
throw new EoulsanException(
"Invalid parameter, an integer parameter is need for "
+ settingName + " parameter: null");
}
try {
return Double.parseDouble(value);
} catch (NumberFormatException e) {
throw new EoulsanException(
"Invalid parameter, an integer parameter is need for "
+ settingName + " parameter: " + value);
}
}
/**
* Get the value of the setting as a boolean value
* @return the value of the setting as an integer
*/
public boolean getBooleanSetting(final String settingName) {
return Boolean.parseBoolean(getSetting(settingName));
}
/**
* Get a set of settings names.
* @return a set with all the name of the settings
*/
public Set<String> getSettingsNames() {
final Set<String> result = new HashSet<>();
for (String key : this.properties.stringPropertyNames()) {
if (!key.startsWith(MAIN_PREFIX_KEY)) {
result.add(key);
}
}
return result;
}
//
// Setters
//
/**
* Set the debug setting.
* @param debug value of the debug setting
*/
public void setDebug(final boolean debug) {
this.properties.setProperty(DEBUG_KEY, Boolean.toString(debug));
}
/**
* Set the print stack trace setting.
* @param printStackTrace value of the print stack trace setting
*/
public void setPrintStackTrace(final boolean printStackTrace) {
this.properties.setProperty(PRINT_STACK_TRACE_KEY,
Boolean.toString(printStackTrace));
}
/**
* Set the AWS access key.
* @param value the AWS access key
*/
public void setAWSAccessKey(final String value) {
if (value == null) {
return;
}
this.properties.setProperty(AWS_ACCESS_KEY, value);
this.properties.setProperty(HADOOP_AWS_ACCESS_KEY, value);
}
/**
* Set the AWS secret key.
* @param value the AWS secret key
*/
public void setAWSSecretKey(final String value) {
if (value == null) {
return;
}
this.properties.setProperty(AWS_SECRET_KEY, value);
this.properties.setProperty(HADOOP_AWS_SECRET_KEY, value);
}
/**
* Set the Hadoop log level.
* @param value the HAdoop log level
*/
public void setHadoopLogLevel(final String value) {
this.properties.setProperty(HADOOP_LOG_LEVEL_KEY, value);
}
/**
* Set the name of the cluster scheduler.
* @param schedulerName the name of the cluster scheduler
*/
public void setClusterSchedulerName(final String schedulerName) {
this.properties.setProperty(CLUSTER_SCHEDULER_NAME_KEY, schedulerName);
}
/**
* Set the default memory required for the steps in cluster mode.
* @param memory the required memory
*/
public void setDefaultClusterMemoryRequired(final int memory) {
this.properties.setProperty(CLUSTER_DEFAULT_MEMORY_REQUIRED, "" + memory);
}
/**
* Set if RServe is enabled.
* @param enable true if the RServe server is enable
*/
public void setRServeServerEnabled(final boolean enable) {
this.properties.setProperty(RSERVE_ENABLED_KEY, Boolean.toString(enable));
}
/**
* Set if save Rscripts is true
* @param krs boolean
*/
public void setSaveRscript(final boolean krs) {
this.properties.setProperty(SAVE_RSCRIPTS_KEY, Boolean.toString(krs));
}
/**
* Set if save Rscripts is true
* @param keepRServeFiles true if Rserve file must be kept
*/
public void setKeepRServeFiles(final boolean keepRServeFiles) {
this.properties.setProperty(RSERVE_KEEP_FILES_KEY,
Boolean.toString(keepRServeFiles));
}
/**
* Set the RServe server name.
* @param serverName The name of the RServe to use
*/
public void setRServeServerName(final String serverName) {
this.properties.setProperty(RSERVE_SERVER_NAME_KEY, serverName);
}
/**
* Set the temporary directory.
* @param tempDirectory The path to the temporary directory
*/
public void setTempDirectory(final String tempDirectory) {
if (tempDirectory != null) {
this.properties.setProperty(TMP_DIR_KEY, tempDirectory);
}
}
/**
* Set the temporary directory for executables.
* @param executablesTempDirectory The path to the temporary directory for
* executables
*/
public void setExecutablesTempDirectory(
final String executablesTempDirectory) {
if (executablesTempDirectory != null) {
this.properties.setProperty(EXECUTABLES_TMP_DIR_KEY,
executablesTempDirectory);
}
}
/**
* Set if the design must be obfuscated
* @param obfuscate true if the design must be obfuscated
*/
public void setObfuscateDesign(final boolean obfuscate) {
this.properties.setProperty(OBFUSCATE_DESIGN_KEY,
Boolean.toString(obfuscate));
}
/**
* Set if the replicate information must be removed from the design.
* @param remove true if the replicate information must be remove
*/
public void setObfuscateRemoveDesignInfo(final boolean remove) {
this.properties.setProperty(OBFUSCATE_DESIGN_REMOVE_REPLICATE_INFO_KEY,
Boolean.toString(remove));
}
/**
* Set the number of threads to use in local mode.
* @param threadsNumber the number of threads to use in local mode
*/
public void setLocalThreadsNumber(final int threadsNumber) {
if (threadsNumber < 0) {
return;
}
this.properties.setProperty(LOCAL_THREADS_NUMBER,
Integer.toString(threadsNumber));
}
/**
* Set the Fastq format default value.
* @param format the value to set
*/
public void setDefaultFastqFormat(final FastqFormat format) {
if (format == null) {
throw new NullPointerException("The FastqFormat is null");
}
this.properties.setProperty(DEFAULT_FASTQ_FORMAT_KEY, format.getName());
}
/**
* Set if the platform checking must be avoided.
* @param bypass true to bypass the platform checking
*/
public void setBypassPlatformChecking(final boolean bypass) {
this.properties.setProperty(BYPASS_PLATFORM_CHECKING_KEY,
Boolean.toString(bypass));
}
/**
* Set the genome index storage path.
* @param genomeMapperIndexStoragePath the path to genome index storage path
*/
public void setGenomeMapperIndexStoragePath(
final String genomeMapperIndexStoragePath) {
this.properties.setProperty(GENOME_MAPPER_INDEX_STORAGE_KEY,
genomeMapperIndexStoragePath);
}
/**
* Set the genome description storage path.
* @param genomeDescStoragePath the path to genome index storage path
*/
public void setGenomeDescStoragePath(final String genomeDescStoragePath) {
this.properties.setProperty(GENOME_DESC_STORAGE_KEY, genomeDescStoragePath);
}
/**
* Set the genome storage path.
* @param genomeStoragePath the path to genome index storage path
*/
public void setGenomeStoragePath(final String genomeStoragePath) {
this.properties.setProperty(GENOME_STORAGE_KEY, genomeStoragePath);
}
/**
* Set the GFF storage path.
* @param gffStoragePath the path to GFF index storage path
*/
public void setGFFStoragePath(final String gffStoragePath) {
this.properties.setProperty(GFF_STORAGE_KEY, gffStoragePath);
}
/**
* Set the GTF storage path.
* @param gtfStoragePath the path to GTF index storage path
*/
public void setGTFStoragePath(final String gtfStoragePath) {
this.properties.setProperty(GTF_STORAGE_KEY, gtfStoragePath);
}
/**
* Set the additional annotation storage path.
* @param additionalAnnotationStoragePath the path to the additional
* annotation index storage path
*/
public void setAdditionalAnnotationStoragePath(
final String additionalAnnotationStoragePath) {
this.properties.setProperty(ADDITIONAL_ANNOTATION_STORAGE_KEY,
additionalAnnotationStoragePath);
}
/**
* Set the additional annotation hypertext links path.
* @param additionalAnnotationHypertextLinksPath the path to the additional
* annotation hypertext links path
*/
public void setAdditionalAnnotationHypertextLinksPath(
final String additionalAnnotationHypertextLinksPath) {
this.properties.setProperty(ADDITIONAL_ANNOTATION_HYPERTEXT_LINKS_KEY,
additionalAnnotationHypertextLinksPath);
}
/**
* Set if an email must be sent at the end of the analysis.
* @param enableSendResultMail true if an email must be sent at the end of the
* analysis
*/
public void setSendResultMail(final boolean enableSendResultMail) {
this.properties.setProperty(SEND_RESULT_MAIL_KEY,
Boolean.toString(enableSendResultMail));
}
/**
* Set the mail address for eoulsan results.
* @param mail the mail address as a string
*/
public void setResultMail(final String mail) {
this.properties.setProperty(RESULT_MAIL_KEY, mail);
}
/**
* Set the SMTP server host.
* @param smtpHost the name of the SMTP server host
*/
public void setSMTPHost(final String smtpHost) {
this.properties.setProperty(SMTP_HOST_KEY, smtpHost);
}
/**
* Set the ZooKeeper connect string.
* @param connectString the ZooKeeper connect string
*/
public void setZooKeeperConnectString(final String connectString) {
this.properties.setProperty(ZOOKEEPER_CONNECT_STRING_KEY, connectString);
}
/**
* Set the ZooKeeper default port.
* @param port the ZooKeeper default port
*/
public void setZooKeeperDefaultPort(final int port) {
this.properties.setProperty(ZOOKEEPER_DEFAULT_PORT_KEY, "" + port);
}
/**
* Set the ZooKeeper session timeout.
* @param timeout the ZooKeeper session timeout
*/
public void setZooKeeperSessionTimeout(final int timeout) {
this.properties.setProperty(ZOOKEEPER_SESSION_TIMEOUT_KEY, "" + timeout);
}
/**
* Set if Eoulsan result files must be written using the old format.
* @param useOldEoulsanResultFormat true if Eoulsan result files must be
* written using the old format
*/
public void setUseOldEoulsanResultFormat(
final boolean useOldEoulsanResultFormat) {
this.properties.setProperty(USE_OLD_EOULSAN_RESULT_FORMAT_KEY,
Boolean.toString(useOldEoulsanResultFormat));
}
/**
* Set the UI name.
* @param uiName the UI name
*/
public void setUIName(final String uiName) {
this.properties.setProperty(UI_NAME_KEY, uiName);
}
/**
* Set the Docker URI.
* @param uri the Docker URI
*/
public void setDockerConnectionURI(final String uri) {
this.properties.setProperty(DOCKER_URI_KEY, uri);
}
/**
* Set the format path.
* @param path the format
*/
public void setDataFormatPath(final String path) {
this.properties.setProperty(DATA_FORMAT_PATH, path);
}
/**
* Set the Galaxy tool path.
* @param path the format
*/
public void setGalaxyToolPath(final String path) {
this.properties.setProperty(DATA_FORMAT_PATH, path);
}
/**
* Set the output tree type.
* @param outputTreeType the output tree type
*/
public void setOutputTreeType(final String outputTreeType) {
this.properties.getProperty(OUTPUT_TREE_TYPE, outputTreeType);
}
/**
* Set a setting value.
* @param settingName name of the setting to set
* @param settingValue value of the setting to set
*/
public void setSetting(final String settingName, final String settingValue) {
setSetting(settingName, settingValue, true);
}
/**
* Set a setting value.
* @param settingName name of the setting to set
* @param settingValue value of the setting to set
* @param logChange if true the change will be logged
*/
public void setSetting(final String settingName, final String settingValue,
final boolean logChange) {
if (settingName == null || settingValue == null) {
return;
}
final String key = settingName.toLowerCase();
if (FORBIDDEN_KEYS.contains(key)) {
return;
}
// Set the property with the current setting name
this.properties.setProperty(checkDeprecatedKey(key), settingValue);
if (logChange) {
logSetting(key);
}
}
//
// Other methods
//
/**
* Get the configuration file path.
* @return the configuration file path
*/
public static String getConfigurationFilePath() {
final String os = System.getProperty("os.name");
final String home = System.getProperty("user.home");
if (os.toLowerCase(Globals.DEFAULT_LOCALE).startsWith("windows")) {
return home
+ File.separator + "Application Data" + File.separator
+ Globals.APP_NAME_LOWER_CASE + ".conf";
}
return home + File.separator + "." + Globals.APP_NAME_LOWER_CASE;
}
/**
* Create a property object for javamail smtp configuration from the settings.
* @return a property object
*/
public Properties getJavaMailSMTPProperties() {
final Properties result = new Properties();
for (Map.Entry<Object, Object> e : this.properties.entrySet()) {
final String key = (String) e.getKey();
final String value = (String) e.getValue();
final String prefix = MAIN_PREFIX_KEY + "mail.smtp.";
final int keyPosStart = MAIN_PREFIX_KEY.length();
if (key != null && key.startsWith(prefix)) {
result.setProperty(key.substring(keyPosStart), value);
}
}
return result;
}
/**
* Save application options.
* @throws IOException if an error occurs while writing results
*/
public void saveSettings() throws IOException {
saveSettings(new File(getConfigurationFilePath()));
}
/**
* Save application options.
* @param file File to save
* @throws IOException if an error occurs while writing settings
*/
public void saveSettings(final File file) throws IOException {
final OutputStream os = FileUtils.createOutputStream(file);
this.properties.store(os, " "
+ Globals.APP_NAME + " version " + Globals.APP_VERSION_STRING
+ " configuration file");
os.close();
}
/**
* Load application options.
* @throws IOException if an error occurs while reading settings
* @throws EoulsanException if an invalid key is found in configuration file
*/
public void loadSettings() throws IOException, EoulsanException {
final File confFile = new File(getConfigurationFilePath());
if (confFile.exists()) {
loadSettings(confFile);
} else {
getLogger().config("No configuration file found.");
}
}
/**
* Load application options.
* @param file file to save
* @throws IOException if an error occurs while reading the file
* @throws EoulsanException if an invalid key is found in configuration file
*/
public void loadSettings(final File file)
throws IOException, EoulsanException {
getLogger().info("Load configuration file: " + file.getAbsolutePath());
final InputStream is = FileUtils.createInputStream(file);
// Load properties in a temporary object
final Properties tmpProperties = new Properties();
tmpProperties.load(FileUtils.createInputStream(file));
is.close();
for (String key : tmpProperties.stringPropertyNames()) {
// Check for forbidden settings
if (FORBIDDEN_KEYS.contains(key)) {
throw new EoulsanException(
"Forbiden key found in configuration file: " + key);
}
// Set the property with the current setting name
this.properties.setProperty(checkDeprecatedKey(key),
tmpProperties.getProperty(key));
}
}
/**
* Set the values of the settings with another Settings object.
* @param settings Settings object which values must be set in the current
* object
*/
public void setSettings(final Settings settings) {
if (settings == null) {
throw new NullPointerException("settings arguments cannot be null");
}
// Set all the values
this.properties.putAll(settings.properties);
}
private void init() {
getLogger()
.info("System temp directory: " + System.getProperty("java.io.tmpdir"));
}
/**
* Add all the settings to the log.
*/
public void logSettings() {
for (Object key : this.properties.keySet()) {
logSetting((String) key);
}
}
/**
* Log a setting value.
* @param key key to log
*/
private void logSetting(final String key) {
if (OBFUSCATED_KEYS.contains(key)) {
getLogger().info("Setting: " + key + "=xxxx value not shown xxxx");
} else {
getLogger()
.info("Setting: " + key + "=" + this.properties.getProperty(key));
}
}
/**
* Get a set with the names of the settings to obfuscate.
* @return a set of strings with the name of the settings to obfuscate
*/
public Set<String> getSettingsKeyToObfuscated() {
return OBFUSCATED_KEYS;
}
/**
* Check deprecated setting key.
* @param key the key to check
* @return the new name of the key if exists or the current key name
*/
private static String checkDeprecatedKey(final String key) {
if (key == null) {
return null;
}
final String trimmedKey = key.trim().toLowerCase();
switch (trimmedKey) {
case "main.accesskey":
printWarningRenamedSetting(trimmedKey, AWS_ACCESS_KEY);
break;
case "main.awssecretkey":
printWarningRenamedSetting(trimmedKey, AWS_SECRET_KEY);
break;
case "main.annotation.storage.path":
printWarningRenamedSetting(trimmedKey, GFF_STORAGE_KEY);
return GFF_STORAGE_KEY;
default:
return key;
}
return key;
}
/**
* Print a warning message to inform user that a setting key has been renamed.
* @param oldName the old setting key
* @param newName the new setting key
*/
private static void printWarningRenamedSetting(final String oldName,
final String newName) {
Common.printWarning("The global/configuration parameter \""
+ oldName + "\" is now deprecated. Please use the \"" + newName
+ "\" parameter instead");
}
//
// Constructor
//
/**
* Public constructor. Load application options.
* @throws IOException if an error occurs while reading settings
* @throws EoulsanException if an invalid key is found in configuration file
*/
Settings() throws IOException, EoulsanException {
this(false);
}
/**
* Public constructor. Load application options.
* @param loadDefaultConfigurationFile true if default configuration file must
* be read
* @throws IOException if an error occurs while reading settings
* @throws EoulsanException if an invalid key is found in configuration file
*/
Settings(final boolean loadDefaultConfigurationFile)
throws IOException, EoulsanException {
init();
if (!loadDefaultConfigurationFile) {
loadSettings();
}
}
/**
* Public constructor. Load application options.
* @param file file to save
* @throws IOException if an error occurs while reading the file
* @throws EoulsanException if an invalid key is found in configuration file
*/
Settings(final File file) throws IOException, EoulsanException {
init();
loadSettings(file);
}
@Override
public String toString() {
return this.properties.toString();
}
}