/*
* This file is part of muCommander, http://www.mucommander.com
* Copyright (C) 2002-2016 Maxence Bernard
*
* muCommander 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.
*
* muCommander 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 com.mucommander;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.mucommander.auth.CredentialsManager;
import com.mucommander.bookmark.BookmarkManager;
import com.mucommander.command.CommandManager;
import com.mucommander.conf.MuConfigurations;
import com.mucommander.shell.ShellHistoryManager;
import com.mucommander.ui.action.ActionKeymapIO;
import com.mucommander.ui.main.commandbar.CommandBarIO;
import com.mucommander.ui.main.toolbar.ToolBarIO;
import com.mucommander.ui.main.tree.TreeIOThreadManager;
import com.mucommander.ui.theme.ThemeManager;
/**
* The run method of this thread is called when the program shuts down, either because
* the user chose to quit the program or because the program was interrupted by a logoff.
* @author Maxence Bernard
*/
public class ShutdownHook extends Thread {
private static final Logger LOGGER = LoggerFactory.getLogger(ShutdownHook.class);
/** Whether shutdown tasks have been performed already. */
private static boolean shutdownTasksPerformed;
/**
* Creates a new <code>ShutdownHook</code>.
*/
public ShutdownHook() {
super(ShutdownHook.class.getName());
}
/**
* Shuts down muCommander.
*/
public static void initiateShutdown() {
LOGGER.info("shutting down");
// // No need to call System.exit() under Java 1.4, application will naturally exit
// // when no there is no more window showing and no non-daemon thread still running.
// // However, natural application death will not trigger ShutdownHook so we need to explicitly
// // perform shutdown tasks.
// performShutdownTasks();
// System.exit() will trigger ShutdownHook and perform shutdown tasks
System.exit(0);
}
/**
* Called by the VM when the program shuts down, this method writes the configuration.
*/
@Override
public void run() {
performShutdownTasks();
}
/**
* Performs tasks before shut down, such as writing the configuration file. This method can only
* be called once, any further call will be ignored (no-op).
*/
private synchronized static void performShutdownTasks() {
// Return if shutdown tasks have already been performed
if(shutdownTasksPerformed)
return;
TreeIOThreadManager.getInstance().interrupt();
// Save snapshot
try{MuConfigurations.saveSnapshot();}
catch(Exception e) {LOGGER.warn("Failed to save snapshot", e);}
// Save preferences
try {MuConfigurations.savePreferences();}
catch(Exception e) {LOGGER.warn("Failed to save configuration", e);}
// Save shell history
try {ShellHistoryManager.writeHistory();}
catch(Exception e) {LOGGER.warn("Failed to save shell history", e);}
// Write credentials file to disk, only if changes were made
try {CredentialsManager.writeCredentials(false);}
catch(Exception e) {LOGGER.warn("Failed to save credentials", e);}
// Write bookmarks file to disk, only if changes were made
try {BookmarkManager.writeBookmarks(false);}
catch(Exception e) {LOGGER.warn("Failed to save bookmarks", e);}
// Saves the current theme.
try {ThemeManager.saveCurrentTheme();}
catch(Exception e) {LOGGER.warn("Failed to save user theme", e);}
// Saves the file associations.
try {CommandManager.writeCommands();}
catch(Exception e) {LOGGER.warn("Failed to save commands", e);}
try {CommandManager.writeAssociations();}
catch(Exception e) {LOGGER.warn("Failed to save associations", e);}
// Saves the action keymap.
try { ActionKeymapIO.saveActionKeymap(); }
catch(Exception e) {LOGGER.warn("Failed to save action keymap", e);}
// Saves the command bar.
try { CommandBarIO.saveCommandBar(); }
catch(Exception e) {LOGGER.warn("Failed to save command bar", e); }
// Saves the tool bar.
try { ToolBarIO.saveToolBar(); }
catch(Exception e) {LOGGER.warn("Failed to save toolbar", e); }
// Shutdown tasks should only be performed once
shutdownTasksPerformed = true;
}
}