/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.petah.spring.bai;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.PrintStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import org.petah.common.option.Option;
import org.petah.common.option.OptionsManager;
import org.petah.common.util.FileUtil;
import org.petah.common.util.profiler.Memory;
import org.petah.common.util.profiler.Profiler;
import org.petah.spring.bai.delegate.AIDelegate;
import org.petah.spring.bai.gui.GUIManager;
import org.petah.spring.bai.log.Log;
import org.petah.spring.bai.util.CustomLogHandler;
import org.petah.spring.bai.util.CustomProfileHandler;
/**
*
* @author Petah
*/
public class InformationLogger {
// Files
private static Option<File> errorLogFile;
private static Option<File> outputLogFile;
private static Option<File> settingsFile;
// Directorys
private static Option<File> aiDirectory;
private static Option<File> logDirectory;
private static Option<File> logArchiveDirectory;
private static Option<File> settingsDirectory;
private static Option<File> cacheDirectory;
// Formatting options
public static Option<String> timeStampFormat = OptionsManager.getOption(
new Option<String>("InformationLogger.timeStampFormat", "HH-mm-ss__MMM-d-yyyy"));
// Output filters
private static Option<Boolean> logToFile = OptionsManager.getOption(
new Option<Boolean>("InformationLogger.logToFile", true));
private static Option<Level> loggerLevel = OptionsManager.getOption(
new Option<Level>("InformationLogger.loggerLevel", Level.ALL));
private static Option<Boolean> profilerEnabled = OptionsManager.getOption(
new Option<Boolean>("InformationLogger.profilerEnabled", true));
/**
* Static constructor
*/
static {
setDirectorys();
setFiles();
}
private static void setDirectorys() {
File jarFile = new File(AIDelegate.class.getProtectionDomain().getCodeSource().getLocation().getFile());
if (jarFile.isDirectory()) {
aiDirectory = OptionsManager.getOption(new Option<File>("InformationLogger.aiDirectory", jarFile),
new Option<Boolean>("transient", true));
} else {
aiDirectory = OptionsManager.getOption(new Option<File>("InformationLogger.aiDirectory", jarFile.getParentFile()),
new Option<Boolean>("transient", true));
}
logDirectory = OptionsManager.getOption(
new Option<File>("InformationLogger.logDirectory", new File(aiDirectory.getValue().getPath() + File.separator + "logs")),
new Option<Boolean>("transient", true));
logArchiveDirectory = OptionsManager.getOption(
new Option<File>("InformationLogger.logArchiveDirectory", new File(logDirectory.getValue().getPath() + File.separator + "archive")),
new Option<Boolean>("transient", true));
settingsDirectory = OptionsManager.getOption(
new Option<File>("InformationLogger.settingsDirectory", new File(aiDirectory.getValue().getPath() + File.separator + "settings")),
new Option<Boolean>("transient", true));
cacheDirectory = OptionsManager.getOption(
new Option<File>("InformationLogger.cacheDirectory", new File(aiDirectory.getValue().getPath() + File.separator + "cache")),
new Option<Boolean>("transient", true));
logDirectory.getValue().mkdirs();
logArchiveDirectory.getValue().mkdirs();
settingsDirectory.getValue().mkdirs();
cacheDirectory.getValue().mkdirs();
}
private static void setFiles() {
String dir = logDirectory.getValue().getAbsolutePath() + File.separator;
SimpleDateFormat formatter = new SimpleDateFormat(timeStampFormat.getValue());
outputLogFile = OptionsManager.getOption(
new Option<File>("InformationLogger.outputLogFile", new File(dir + "output_" + formatter.format(new Date()) + ".txt")),
new Option<Boolean>("transient", true));
errorLogFile = OptionsManager.getOption(
new Option<File>("InformationLogger.errorLogFile", new File(dir + "errorlog_" + formatter.format(new Date()) + ".txt")),
new Option<Boolean>("transient", true));
settingsFile = OptionsManager.getOption(
new Option<File>("InformationLogger.settingsFile", new File(settingsDirectory.getValue().getAbsolutePath() + File.separator + "settings.xml")),
new Option<Boolean>("transient", true));
}
public static void init() {
Log.entry(InformationLogger.class, "init");
// Set up the loggers
Logger.getLogger(InformationLogger.class.getName()).entering(InformationLogger.class.getName(), "init()");
Logger.getLogger("org.petah").addHandler(new CustomLogHandler());
Logger.getLogger("org.petah").setUseParentHandlers(false);
Logger.getLogger("org.petah").setLevel(loggerLevel.getValue());
// Setup logging to file
if (logToFile.getValue()) {
// Moves old logs to the archive directory
moveOldLogs();
// Redirect output streams to files
redirectOutputStreams();
}
// Setup the profiler
Profiler.setProfileHandler(new CustomProfileHandler());
Profiler.setActive(profilerEnabled.getValue());
// Log memory information
Memory memory = new Memory();
memory.update();
Logger.getLogger(InformationLogger.class.getName()).info("Memory: free: " + memory.getFree() + " used: " + memory.getUsed()
+ " allocated: " + memory.getAllocated() + " maximum: " + memory.getMaximum());
}
/**
* Moves old logs to the archive directory
*/
private static void moveOldLogs() {
try {
FileUtil.moveAllFiles(logDirectory.getValue().getAbsoluteFile(),
logArchiveDirectory.getValue().getAbsoluteFile(),
new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith(".txt");
}
});
} catch (Exception ex) {
JOptionPane.showMessageDialog(null, "Error archiving old log files: " + ex.getMessage(), "BAI Error", JOptionPane.ERROR_MESSAGE);
Logger.getLogger(InformationLogger.class.getName()).log(Level.SEVERE, "Could not archive log files.", ex);
}
}
/**
* Redirect output streams to files
*/
private static void redirectOutputStreams() {
try {
System.setOut(new PrintStream(new FileOutputStream(outputLogFile.getValue())));
System.setErr(new PrintStream(new FileOutputStream(errorLogFile.getValue())));
} catch (FileNotFoundException ex) {
JOptionPane.showMessageDialog(null, "Error creating log files: " + ex.getMessage(), "BAI Error", JOptionPane.ERROR_MESSAGE);
Logger.getLogger(InformationLogger.class.getName()).log(Level.SEVERE, "Could not create log files.", ex);
}
}
public static File getErrorLogFile() {
return errorLogFile.getValue();
}
public static File getAiDirectory() {
return aiDirectory.getValue();
}
public static File getLogArchiveDirectory() {
return logArchiveDirectory.getValue();
}
public static File getLogDirectory() {
return logDirectory.getValue();
}
public static File getSettingsDirectory() {
return settingsDirectory.getValue();
}
public static File getSettingsFile() {
return settingsFile.getValue();
}
public static File getCacheDirectory() {
return cacheDirectory.getValue();
}
}