/* GanttProject is an opensource project management tool. Copyright (C) 2011 Dmitry Barashev 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package net.sourceforge.ganttproject; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.security.AccessControlException; import java.util.Map; import java.util.logging.ConsoleHandler; import java.util.logging.FileHandler; import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.LogManager; import java.util.logging.Logger; import com.google.common.collect.Maps; import net.sourceforge.ganttproject.gui.UIFacade; public class GPLogger { private static final Logger ourLogger = Logger.getLogger("net.sourceforge.ganttproject"); private static Handler ourHandler; private static UIFacade ourUIFacade; private static Map<String, Logger> ourLoggers = Maps.newHashMap(); private static String ourLogFileName; static { ourHandler = new ConsoleHandler(); ourLogger.addHandler(ourHandler); ourLogger.setLevel(Level.ALL); ourHandler.setFormatter(new java.util.logging.SimpleFormatter()); } public static boolean log(Throwable e) { if (ourUIFacade != null) { if (e instanceof NullPointerException) { StackTraceElement[] stackTrace = e.getStackTrace(); if ("initiateToolTip".equals(stackTrace[0].getMethodName()) && "javax.swing.ToolTipManager".equals(stackTrace[0].getClassName())) { // We will not show that stupid NPEs from TooltipManager return true; } } ourUIFacade.showErrorDialog(e); return true; } return logToLogger(e); } public static boolean logToLogger(String message) { if (ourHandler == null) { return false; } ourLogger.log(Level.WARNING, message); return true; } public static boolean logToLogger(Throwable e) { if (ourHandler == null) { return false; } ourLogger.log(Level.WARNING, e.getMessage(), e); return true; } public static void log(String message) { ourLogger.log(Level.INFO, message); } public static Logger getLogger(Object o) { assert o != null; return getLogger(o.getClass()); } public static Logger getLogger(String name) { Logger logger = ourLoggers.get(name); if (logger == null) { logger = Logger.getLogger(name); logger.addHandler(ourHandler); ourLoggers.put(name, logger); } return logger; } public static Logger getLogger(Class<?> clazz) { return getLogger(clazz.getName()); } public static void setUIFacade(UIFacade uifacade) { ourUIFacade = uifacade; } public static void debug(Logger logger, String format, Object... args) { if (logger.isLoggable(Level.FINE)) { logger.fine(String.format(format, args)); } } public static void setLogFile(String logFileName) { try { Handler fileHandler = new FileHandler(logFileName, true); fileHandler.setFormatter(new java.util.logging.SimpleFormatter()); ourLogger.removeHandler(ourHandler); ourLogger.addHandler(fileHandler); ourHandler = fileHandler; ourLogFileName = logFileName; } catch (SecurityException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static void readConfiguration(URL configuration) throws IOException { InputStream input = configuration.openStream(); LogManager.getLogManager().readConfiguration(input); } public static String readLog() { if (ourLogFileName != null) { ourHandler.flush(); File f = new File(ourLogFileName); try { if (!f.exists()) { return "Log file not found at " + f.getAbsolutePath() + " Check that you have appropriate access permissions for writing and reading this file"; } if (!f.canRead()) { return "Can't read log file. Try reading it manually from " + f.getAbsolutePath(); } BufferedReader reader = new BufferedReader(new FileReader(f)); StringBuilder buffer = new StringBuilder(f.getAbsolutePath()); buffer.append("\n\n"); for (String s = reader.readLine(); s != null; s = reader.readLine()) { buffer.append(s).append("\n"); } return buffer.toString(); } catch (FileNotFoundException e) { log(e); return "Log file not found at " + f.getAbsolutePath() + " Check that you have appropriate access permissions for writing and reading this file"; } catch (IOException e) { log(e); return "Can't read log file. Try reading it manually from " + f.getAbsolutePath(); } } return "Log to file has not been configured, sorry. If you started GanttProject from console, try looking there"; } private static String[] SYSTEM_PROPERTIES = new String[] { "java.class.path", "java.home", "java.ext.dirs", "java.io.tmpdir", "java.runtime.version", "java.vendor", "java.vm.name", "java.vm.vendor", "java.vm.version", "os.arch", "os.name", "os.version", "sun.java.command", "user.country", "user.dir", "user.home", "user.language", "user.timezone" }; public static void logSystemInformation() { try { StringBuilder result = new StringBuilder(); result.append("GanttProject " + GPVersion.CURRENT).append("\n"); File optionsFile = GanttOptions.getOptionsFile(); result.append("Settings file:\n"); result.append("\tlocation: ").append(optionsFile.getAbsolutePath()).append("\n"); result.append("\tsize:").append(optionsFile.length()).append("\n"); result.append("\tis readable: ").append(optionsFile.canRead()).append("\n"); for (String name : SYSTEM_PROPERTIES) { result.append(name).append(": ").append(System.getProperty(name)).append("\n"); } System.err.println(result.toString()); } catch (AccessControlException e) { // This can happen when running in a sandbox (Java WebStart) System.err.println(e + ": " + e.getMessage()); } } public static void close() { ourHandler.flush(); } }