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