/* * 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 java.io.IOException; import java.net.URL; import java.nio.charset.Charset; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.HashSet; import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.jar.Attributes; import java.util.jar.Manifest; import java.util.logging.Formatter; import java.util.logging.Level; import java.util.logging.LogRecord; import fr.ens.biologie.genomique.eoulsan.bio.FastqFormat; import fr.ens.biologie.genomique.eoulsan.core.Version; import fr.ens.biologie.genomique.eoulsan.io.FileCharsets; /** * This class contains globals constants for the application. * @since 1.0 * @author Laurent Jourdren */ public final class Globals { private static Attributes manifestAttributes; private static final String MANIFEST_FILE = "/META-INF/MANIFEST.MF"; /** The name of the application. */ public static final String APP_NAME = "Eoulsan"; /** The name of the application. */ public static final String APP_NAME_LOWER_CASE = APP_NAME.toLowerCase(); /** The prefix of the parameters of the application. */ public static final String PARAMETER_PREFIX = "fr.ens.biologie.genomique." + APP_NAME_LOWER_CASE; /** The version of the application. */ public static final String APP_VERSION_STRING = getVersion(); /** The version of the application. */ public static final Version APP_VERSION = new Version(APP_VERSION_STRING); /** The built number of the application. */ public static final String APP_BUILD_NUMBER = getBuiltNumber(); /** The built commit of the application. */ public static final String APP_BUILD_COMMIT = getBuiltCommit(); /** The built host of the application. */ public static final String APP_BUILD_HOST = getBuiltHost(); /** The build date of the application. */ public static final String APP_BUILD_DATE = getBuiltDate(); /** The build year of the application. */ public static final String APP_BUILD_YEAR = getBuiltYear(); /** The welcome message. */ public static final String WELCOME_MSG = Globals.APP_NAME + " version " + Globals.APP_VERSION_STRING + " (" + APP_BUILD_COMMIT + ", " + Globals.APP_BUILD_NUMBER + " build on " + APP_BUILD_HOST + ", " + Globals.APP_BUILD_DATE + ")"; /** The prefix for temporary files. */ public static final String TEMP_PREFIX = APP_NAME_LOWER_CASE + "-" + APP_VERSION_STRING + "-" + APP_BUILD_NUMBER + "-"; /** The log level of the application. */ public static final Level LOG_LEVEL = Level.INFO; // Level.OFF; /** Set the debug mode. */ public static final boolean DEBUG = APP_VERSION_STRING.endsWith("-SNAPSHOT") || "UNKNOWN_VERSION".equals(APP_VERSION_STRING); /** Bypass platform checking. */ public static final boolean BYPASS_PLATFORM_CHECKING = false; /** Minimal java version required by Eoulsan. */ public static final int MINIMAL_JAVA_VERSION_REQUIRED = 7; /** Platforms where the application is available. */ public static final Set<String> AVAILABLE_BINARY_ARCH = Collections.unmodifiableSet(new HashSet<>( Arrays.asList(new String[] {"linux\tamd64", "linux\tx86_64"}))); /** Platforms alias. */ public static final Map<String, String> AVAILABLE_BINARY_ARCH_ALIAS = Collections.unmodifiableMap( Collections.singletonMap("linux\tx86_64", "linux\tamd64")); /** Default locale of the application. */ public static final Locale DEFAULT_LOCALE = Locale.US; /** Format of the log. */ public static final Formatter LOG_FORMATTER = new Formatter() { private final DateFormat df = new SimpleDateFormat("yyyy.MM.dd kk:mm:ss", DEFAULT_LOCALE); @Override public String format(final LogRecord record) { return record.getLevel() + "\t" + this.df.format(new Date(record.getMillis())) + "\t" + record.getMessage() + "\n"; } }; private static final String WEBSITE_URL_DEFAULT = "http://outils.genomique.biologie.ens.fr/" + APP_NAME_LOWER_CASE; /** Application Website url. */ public static final String WEBSITE_URL = getWebSiteURL(); private static final String COPYRIGHT_DATE = "2010-" + APP_BUILD_YEAR; /** Licence text. */ public static final String LICENSE_TXT = "This program is developed under the GNU Lesser General Public License" + " version 2.1 or later and CeCILL-C."; /** About string, plain text version. */ public static final String ABOUT_TXT = Globals.APP_NAME + " version " + Globals.APP_VERSION_STRING + " (" + APP_BUILD_COMMIT + ", " + Globals.APP_BUILD_NUMBER + ")" + " is a pipeline for NGS analysis.\n" + "This version has been built on " + APP_BUILD_DATE + ".\n\n" + "Authors:\n" + " Laurent Jourdren <jourdren@biologie.ens.fr>\n" + " Maria Bernard <mbernard@biologie.ens.fr>\n" + " Stéphane Le Crom <lecrom@biologie.ens.fr>\n" + " Claire Wallon <wallon@biologie.ens.fr>\n" + " Vivien Deshaies <deshaies@biologie.ens.fr>\n" + " Sandrine Perrin <sperrin@biologie.ens.fr>\n" + "Contacts:\n" + " Mail: " + APP_NAME_LOWER_CASE + "@biologie.ens.fr\n" + " Google group: http://groups.google.com/group/" + APP_NAME_LOWER_CASE + "\n" + " Website: " + WEBSITE_URL + "\n" + "Copyright " + COPYRIGHT_DATE + " IBENS genomic platform\n" + LICENSE_TXT + "\n"; /** Default standard output state. */ public static final boolean STD_OUTPUT_DEFAULT = false; /** Design file version. */ public static final double DESIGN_FILE_VERSION = 1.1; /** * The name of the system property that contains the list of libraries to * repack for hadoop mode. */ public static final String LIBS_TO_HADOOP_REPACK_PROPERTY = APP_NAME_LOWER_CASE + ".hadoop.libs"; /** Launch mode property. */ public static final String LAUNCH_MODE_PROPERTY = APP_NAME_LOWER_CASE + ".launch.mode"; /** Launch script path. */ public static final String LAUNCH_SCRIPT_PATH = APP_NAME_LOWER_CASE + ".launch.script.path"; /** Print stack trace default. */ public static final boolean PRINT_STACK_TRACE_DEFAULT = DEBUG; /** Default UI name. */ public static final String UI_NAME_DEFAULT = "lanterna"; /** FASTA file width. */ public static final int FASTA_FILE_WIDTH = 60; /** Default fastq format. */ static final FastqFormat FASTQ_FORMAT_DEFAULT = FastqFormat.FASTQ_SANGER; /** Obfuscate design default. */ public static final boolean OBFUSCATE_DESIGN_DEFAULT = true; /** Remove design replicate info when obfuscate design default. */ public static final boolean OBFUSCATE_DESIGN_REMOVE_REPLICATE_INFO_DEFAULT = true; /** ZooKeeper default port. */ public static final int ZOOKEEPER_DEFAULT_PORT_DEFAULT = 2181; /** ZooKeeper default session timeout. */ public static final int ZOOKEEPER_SESSION_TIMEOUT_DEFAULT = 10000; /** Write results using old Eoulsan format. */ public static final boolean USE_OLD_EOULSAN_RESULT_FORMAT_DEFAULT = false; /** Eoulsan log filename. */ public static final String LOG_FILENAME = APP_NAME_LOWER_CASE + ".log"; /** Other log filename. */ public static final String OTHER_LOG_FILENAME = "additional.log"; /** Output tree type. */ public static final String OUTPUT_TREE_TYPE_DEFAULT = "step"; // // Files encoding // /** Default file encoding. */ public static final String DEFAULT_FILE_ENCODING = FileCharsets.UTF8_FILE_ENCODING; /** Default charset. */ public static final Charset DEFAULT_CHARSET = Charset.forName(DEFAULT_FILE_ENCODING); // // Default file extensions // /** Log extension. */ public static final String LOG_EXTENSION = ".log"; /** Step log extension. */ public static final String STEP_LOG_EXTENSION = ".step.log"; /** Step result extension. */ public static final String STEP_RESULT_EXTENSION = ".step.result"; /** Old step result format extension. */ public static final String STEP_RESULT_OLD_FORMAT_EXTENSION = ".log"; /** Task context extension. */ public static final String TASK_CONTEXT_EXTENSION = ".task.context"; /** Task result extension. */ public static final String TASK_RESULT_EXTENSION = ".task.result"; /** Task done extension. */ public static final String TASK_LOG_EXTENSION = ".task.log"; /** Task output data extension. */ public static final String TASK_DATA_EXTENSION = ".task.data"; /** Task done extension. */ public static final String TASK_DONE_EXTENSION = ".task.done"; /** Task stdout extension. */ public static final String TASK_STDOUT_EXTENSION = ".task.out"; /** Task stderr extension. */ public static final String TASK_STDERR_EXTENSION = ".task.err"; /** Step output directory suffix. */ public static final String STEP_OUTPUT_DIRECTORY_SUFFIX = "_output"; // // Private constants // private static final String UNKNOWN_VERSION = "UNKNOWN_VERSION"; private static final String UNKNOWN_BUILD = "UNKNOWN_BUILD"; private static final String UNKNOWN_DATE = "UNKNOWN_DATE"; private static final String UNKNOWN_YEAR = "UNKNOWN_YEAR"; private static final String UNKNOWN_BUILD_COMMIT = "UNKNOWN_COMMIT"; private static final String UNKNOWN_BUILD_HOST = "UNKNOWN_HOST"; // // Methods // private static String getVersion() { final String version = getManifestProperty("Specification-Version"); return version != null ? version : UNKNOWN_VERSION; } private static String getBuiltNumber() { final String builtNumber = getManifestProperty("Implementation-Version"); return builtNumber != null ? builtNumber : UNKNOWN_BUILD; } private static String getBuiltDate() { final String builtDate = getManifestProperty("Built-Date"); return builtDate != null ? builtDate : UNKNOWN_DATE; } private static String getBuiltYear() { final String builtYear = getManifestProperty("Built-Year"); return builtYear != null ? builtYear : UNKNOWN_YEAR; } private static String getWebSiteURL() { final String url = getManifestProperty("url"); return url != null ? url : WEBSITE_URL_DEFAULT; } private static String getBuiltCommit() { final String buildCommit = getManifestProperty("Built-Commit"); return buildCommit != null ? buildCommit : UNKNOWN_BUILD_COMMIT; } private static String getBuiltHost() { final String buildHost = getManifestProperty("Built-Host"); return buildHost != null ? buildHost : UNKNOWN_BUILD_HOST; } private static String getManifestProperty(final String propertyKey) { if (propertyKey == null) { return null; } readManifest(); if (manifestAttributes == null) { return null; } return manifestAttributes.getValue(propertyKey); } private static synchronized void readManifest() { if (manifestAttributes != null) { return; } try { Class<?> clazz = Globals.class; String className = clazz.getSimpleName() + ".class"; String classPath = clazz.getResource(className).toString(); final String manifestPath; if (!classPath.startsWith("jar")) { // Class not from JAR String basePath = classPath.substring(0, classPath.length() - clazz.getName().length() - ".class".length()); manifestPath = basePath + MANIFEST_FILE; } else { manifestPath = classPath.substring(0, classPath.lastIndexOf("!") + 1) + MANIFEST_FILE; } Manifest manifest = new Manifest(new URL(manifestPath).openStream()); manifestAttributes = manifest.getMainAttributes(); } catch (IOException e) { } } /** * Set the default Local of the application */ public static void setDefaultLocale() { Locale.setDefault(DEFAULT_LOCALE); } // // Constructor // /** * Private constructor. */ private Globals() { throw new IllegalStateException(); } }