/* * 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.OutputStream; import java.io.OutputStreamWriter; import java.io.Writer; import java.util.Date; import java.util.Properties; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import fr.ens.biologie.genomique.eoulsan.core.workflow.StepObserverRegistry; import fr.ens.biologie.genomique.eoulsan.util.FileUtils; import fr.ens.biologie.genomique.eoulsan.util.StringUtils; /** * This class define common constants. * @since 1.0 * @author Laurent Jourdren */ public final class Common { /** * Write log data. * @param os OutputStream of the log file * @param data data to write * @throws IOException if an error occurs while writing log file */ public static void writeLog(final OutputStream os, final long startTime, final String data) throws IOException { final long endTime = System.currentTimeMillis(); final long duration = endTime - startTime; final Writer writer = new OutputStreamWriter(os, Globals.DEFAULT_CHARSET); writer.write("Start time: " + new Date(startTime) + "\nEnd time: " + new Date(endTime) + "\nDuration: " + StringUtils.toTimeHumanReadable(duration) + "\n"); writer.write(data); writer.close(); } /** * Write log data. * @param file the log file * @param data data to write * @throws IOException if an error occurs while writing log file */ public static void writeLog(final File file, final long startTime, final String data) throws IOException { if (file == null) { throw new NullPointerException("File for log file is null."); } writeLog(FileUtils.createOutputStream(file), startTime, data); } /** * Show a message and then exit. * @param message the message to show */ public static void showMessageAndExit(final String message) { System.out.println(message); exit(0); } /** * Show and log an error message. * @param message message to show and log */ public static void showAndLogErrorMessage(final String message) { getLogger().severe(message); System.err.println(message); } /** * Show a message and then exit. * @param message the message to show */ public static void showErrorMessageAndExit(final String message) { System.err.println(message); exit(1); } /** * Print error message to the user and exits the application. * @param e Exception * @param message message to show to the use */ public static void errorExit(final Throwable e, final String message) { errorExit(e, message, true); } /** * Print error message to the user and exits the application. * @param e Exception * @param message message to show to the use * @param logMessage true if message must be logged */ public static void errorExit(final Throwable e, final String message, final boolean logMessage) { if (logMessage) { getLogger().severe(message); } System.err.println("\n=== " + Globals.APP_NAME + " Error ==="); System.err.println(message); if (!EoulsanRuntime.isRuntime() || EoulsanRuntime.getSettings().isPrintStackTrace()) { printStackTrace(e); } exit(1); } /** * Print error message to the user and halts the application. * @param e Exception * @param message message to show to the use */ public static void errorHalt(final Throwable e, final String message) { errorHalt(e, message, true); } /** * Print error message to the user and halts the application. * @param e Exception * @param message message to show to the use * @param logMessage true if message must be logged */ public static void errorHalt(final Throwable e, final String message, final boolean logMessage) { if (logMessage) { getLogger().severe(message); } System.err.println("\n=== " + Globals.APP_NAME + " Error ==="); System.err.println(message); if (!EoulsanRuntime.isRuntime() || EoulsanRuntime.getSettings().isPrintStackTrace()) { printStackTrace(e); } halt(1); } /** * Print the stack trace for an exception. * @param e Exception */ private static void printStackTrace(final Throwable e) { System.err.println("\n=== " + Globals.APP_NAME + " Debug Stack Trace ==="); e.printStackTrace(); System.err.println(); } /** * Exit the application. * @param exitCode exit code */ public static void exit(final int exitCode) { System.exit(exitCode); } /** * Exit the application. * @param exitCode exit code */ public static void halt(final int exitCode) { Runtime.getRuntime().halt(exitCode); } public static void sendMail(final String subject, final String message) { if (!EoulsanRuntime.isRuntime()) { return; } final Settings settings = EoulsanRuntime.getSettings(); final boolean sendMail = settings.isSendResultMail(); final Properties properties = settings.getJavaMailSMTPProperties(); final String userMail = settings.getResultMail(); if (!sendMail) { return; } if (!properties.containsKey("mail.smtp.host")) { getLogger().warning("No SMTP server set"); return; } if (userMail == null) { getLogger().warning("No user mail set"); return; } final Session session = Session.getInstance(properties); try { // Instantiate a message Message msg = new MimeMessage(session); // Set message attributes msg.setFrom(new InternetAddress(userMail)); InternetAddress[] address = {new InternetAddress(userMail)}; msg.setRecipients(Message.RecipientType.TO, address); msg.setSubject(subject); msg.setSentDate(new Date()); // Set message content msg.setText(message); // Send the message Transport.send(msg); } catch (MessagingException mex) { getLogger().warning("Error while sending mail: " + mex.getMessage()); // Prints all nested (chained) exceptions as well if (!EoulsanRuntime.isRuntime() || EoulsanRuntime.getSettings().isPrintStackTrace()) { mex.printStackTrace(); } } } /** * Get the number of threads to use from localThreads, maxLocalThreads and * global threads number. * @param localThreads number of threads * @param maxLocalThreads maximum number of threads * @return the number of threads to use */ public static final int getThreadsNumber(final int localThreads, final int maxLocalThreads) { int threads = EoulsanRuntime.getSettings().getLocalThreadsNumber(); if (localThreads > 0) { threads = localThreads; } if (maxLocalThreads > 0) { threads = Math.min(threads, maxLocalThreads); } return threads; } /** * Print warning. * @param message message to print */ public static void printWarning(final String message) { if (message == null) { return; } // Currently only print warning messages when no UI has been set if (StepObserverRegistry.getInstance().getObservers().isEmpty()) { System.err.println(message); } } // // Constructor // private Common() { throw new IllegalStateException(); } }