/*
* Freeplane - mind map editor
* Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
*
* This file is modified by Dimitry Polivaev in 2008.
*
* 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 2 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, see <http://www.gnu.org/licenses/>.
*/
package org.freeplane.core.util;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.io.File;
import java.io.PrintStream;
import java.util.logging.ConsoleHandler;
import java.util.logging.FileHandler;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.freeplane.core.resources.ResourceController;
/**
* Utilities for logging to the standard logfile.
* <p>
* In scripts this class can be accessed via the "global" variable <code>logger</code>,
* so this is the way to log in scripts:
* <pre>
* try {
* logger.info("this node as date: " + node.to.date)
* } catch (Exception ex) {
* logger.severe('error on conversion of "' + node.text + '" to date', ex)
* }
* </pre>
*
* @author foltin
*/
public class LogUtils {
private static final Logger LOGGER = Logger.global;
static private boolean loggerCreated = false;
public static void createLogger() {
if (loggerCreated) {
return;
}
loggerCreated = true;
FileHandler mFileHandler = null;
final Logger parentLogger = Logger.getAnonymousLogger().getParent();
final Handler[] handlers = parentLogger.getHandlers();
for (int i = 0; i < handlers.length; i++) {
final Handler handler = handlers[i];
if (handler instanceof ConsoleHandler) {
parentLogger.removeHandler(handler);
}
}
try {
final String logDirectoryPath = getLogDirectory();
final File logDirectory = new File(logDirectoryPath);
logDirectory.mkdirs();
if(logDirectory.isDirectory()){
final String pathPattern = logDirectoryPath + File.separatorChar + "log";
mFileHandler = new FileHandler(pathPattern, 1400000, 5, false);
mFileHandler.setFormatter(new StdFormatter());
parentLogger.addHandler(mFileHandler);
}
final ConsoleHandler stdConsoleHandler = new ConsoleHandler();
stdConsoleHandler.setFormatter(new StdFormatter());
if(System.getProperty("java.util.logging.config.file", null) == null){
mFileHandler.setLevel(Level.INFO);
stdConsoleHandler.setLevel(Level.INFO);
}
parentLogger.addHandler(stdConsoleHandler);
LoggingOutputStream los;
Logger logger = Logger.getLogger(StdFormatter.STDOUT.getName());
los = new LoggingOutputStream(logger, StdFormatter.STDOUT);
System.setOut(new PrintStream(los, true));
logger = Logger.getLogger(StdFormatter.STDERR.getName());
los = new LoggingOutputStream(logger, StdFormatter.STDERR);
System.setErr(new PrintStream(los, true));
}
catch (final Exception e) {
LogUtils.warn("Error creating logging File Handler", e);
}
}
public static String getLogDirectory() {
final String logDirectory = ResourceController.getResourceController().getFreeplaneUserDirectory() + File.separatorChar + "logs";
return logDirectory;
}
public static void info(final String string) {
LOGGER.log(Level.INFO, string);
}
public static void info(final Transferable t) {
System.out.println();
System.out.println("BEGIN OF Transferable:\t" + t);
final DataFlavor[] dataFlavors = t.getTransferDataFlavors();
for (int i = 0; i < dataFlavors.length; i++) {
System.out.println(" Flavor:\t" + dataFlavors[i]);
System.out.println(" Supported:\t" + t.isDataFlavorSupported(dataFlavors[i]));
try {
System.out.println(" Content:\t" + t.getTransferData(dataFlavors[i]));
}
catch (final Exception e) {
}
}
System.out.println("END OF Transferable");
System.out.println();
}
public static void severe(final String message) {
LOGGER.log(Level.SEVERE, message);
}
public static void severe(final String comment, final Throwable e) {
if(e instanceof SecurityException || e.getCause() instanceof SecurityException)
warn(comment, e);
else
LOGGER.log(Level.SEVERE, comment, e);
}
public static void severe(final Throwable e) {
LogUtils.severe("", e);
}
public static void warn(final String msg) {
LOGGER.log(Level.WARNING, msg);
}
public static void warn(final String comment, final Throwable e) {
LOGGER.log(Level.WARNING, comment, e);
}
public static void warn(final Throwable e) {
LogUtils.warn("", e);
}
public static Logger getLogger() {
return LOGGER;
}
}