001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.gui; 003 004import static org.openstreetmap.josm.tools.I18n.tr; 005 006import java.io.IOException; 007import java.nio.file.InvalidPathException; 008 009import org.openstreetmap.josm.data.Preferences; 010import org.openstreetmap.josm.data.cache.JCSCacheManager; 011import org.openstreetmap.josm.io.ChangesetUpdater; 012import org.openstreetmap.josm.io.MessageNotifier; 013import org.openstreetmap.josm.io.remotecontrol.RemoteControl; 014import org.openstreetmap.josm.tools.ImageProvider; 015import org.openstreetmap.josm.tools.Logging; 016 017/** 018 * JOSM termination sequence. 019 * @since 14140 020 */ 021public class MainTermination implements Runnable { 022 023 @Override 024 public void run() { 025 ChangesetUpdater.stop(); 026 MessageNotifier.stop(); 027 RemoteControl.stop(); 028 029 try { 030 MainApplication.worker.shutdown(); 031 } catch (SecurityException e) { 032 Logging.log(Logging.LEVEL_ERROR, "Unable to shutdown worker", e); 033 } 034 JCSCacheManager.shutdown(); 035 036 if (MainApplication.getMainFrame() != null) { 037 MainApplication.getMainFrame().storeState(); 038 } 039 if (MainApplication.getMap() != null) { 040 MainApplication.getMap().rememberToggleDialogWidth(); 041 } 042 // Remove all layers because somebody may rely on layerRemoved events (like AutosaveTask) 043 MainApplication.getLayerManager().resetState(); 044 ImageProvider.shutdown(false); 045 try { 046 Preferences.main().saveDefaults(); 047 } catch (IOException | InvalidPathException ex) { 048 Logging.log(Logging.LEVEL_WARN, tr("Failed to save default preferences."), ex); 049 } 050 ImageProvider.shutdown(true); 051 052 try { 053 // in case the current task still hasn't finished 054 MainApplication.worker.shutdownNow(); 055 } catch (SecurityException e) { 056 Logging.log(Logging.LEVEL_ERROR, "Unable to shutdown worker", e); 057 } 058 } 059} 060