source: josm/trunk/src/org/openstreetmap/josm/actions/SessionLoadAction.java @ 11746

Last change on this file since 11746 was 11746, checked in by Don-vip, 2 years ago

PMD - Strict Exceptions

  • Property svn:eol-style set to native
File size: 7.0 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.actions;
3
4import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
5import static org.openstreetmap.josm.tools.I18n.tr;
6
7import java.awt.event.ActionEvent;
8import java.io.File;
9import java.io.IOException;
10import java.io.InputStream;
11import java.net.URI;
12import java.nio.file.Files;
13import java.nio.file.StandardCopyOption;
14import java.util.Arrays;
15import java.util.List;
16
17import javax.swing.JFileChooser;
18import javax.swing.JOptionPane;
19import javax.swing.SwingUtilities;
20
21import org.openstreetmap.josm.Main;
22import org.openstreetmap.josm.data.ViewportData;
23import org.openstreetmap.josm.gui.HelpAwareOptionPane;
24import org.openstreetmap.josm.gui.PleaseWaitRunnable;
25import org.openstreetmap.josm.gui.layer.Layer;
26import org.openstreetmap.josm.gui.progress.ProgressMonitor;
27import org.openstreetmap.josm.gui.util.FileFilterAllFiles;
28import org.openstreetmap.josm.gui.widgets.AbstractFileChooser;
29import org.openstreetmap.josm.io.IllegalDataException;
30import org.openstreetmap.josm.io.session.SessionImporter;
31import org.openstreetmap.josm.io.session.SessionReader;
32import org.openstreetmap.josm.tools.CheckParameterUtil;
33import org.openstreetmap.josm.tools.JosmRuntimeException;
34import org.openstreetmap.josm.tools.Utils;
35
36/**
37 * Loads a JOSM session.
38 * @since 4668
39 */
40public class SessionLoadAction extends DiskAccessAction {
41
42    /**
43     * Constructs a new {@code SessionLoadAction}.
44     */
45    public SessionLoadAction() {
46        super(tr("Load Session"), "open", tr("Load a session from file."), null, true, "load-session", true);
47        putValue("help", ht("/Action/SessionLoad"));
48    }
49
50    @Override
51    public void actionPerformed(ActionEvent e) {
52        AbstractFileChooser fc = createAndOpenFileChooser(true, false, tr("Open session"),
53                Arrays.asList(SessionImporter.FILE_FILTER, FileFilterAllFiles.getInstance()),
54                SessionImporter.FILE_FILTER, JFileChooser.FILES_ONLY, "lastDirectory");
55        if (fc == null)
56            return;
57        File file = fc.getSelectedFile();
58        boolean zip = Utils.hasExtension(file, "joz");
59        Main.worker.submit(new Loader(file, zip));
60    }
61
62    /**
63     * JOSM session loader
64     */
65    public static class Loader extends PleaseWaitRunnable {
66
67        private boolean canceled;
68        private File file;
69        private final URI uri;
70        private final InputStream is;
71        private final boolean zip;
72        private List<Layer> layers;
73        private Layer active;
74        private List<Runnable> postLoadTasks;
75        private ViewportData viewport;
76
77        /**
78         * Constructs a new {@code Loader} for local session file.
79         * @param file The JOSM session file
80         * @param zip {@code true} if the file is a session archive file (*.joz)
81         */
82        public Loader(File file, boolean zip) {
83            super(tr("Loading session ''{0}''", file.getName()));
84            CheckParameterUtil.ensureParameterNotNull(file, "file");
85            this.file = file;
86            this.uri = null;
87            this.is = null;
88            this.zip = zip;
89        }
90
91        /**
92         * Constructs a new {@code Loader} for session file input stream (may be a remote file).
93         * @param is The input stream to session file
94         * @param uri The file URI
95         * @param zip {@code true} if the file is a session archive file (*.joz)
96         * @since 6245
97         */
98        public Loader(InputStream is, URI uri, boolean zip) {
99            super(tr("Loading session ''{0}''", uri));
100            CheckParameterUtil.ensureParameterNotNull(is, "is");
101            CheckParameterUtil.ensureParameterNotNull(uri, "uri");
102            this.file = null;
103            this.uri = uri;
104            this.is = is;
105            this.zip = zip;
106        }
107
108        @Override
109        public void cancel() {
110            canceled = true;
111        }
112
113        @Override
114        protected void finish() {
115            SwingUtilities.invokeLater(() -> {
116                if (canceled)
117                    return;
118                addLayers();
119                runPostLoadTasks();
120            });
121        }
122
123        private void addLayers() {
124            if (layers != null && !layers.isEmpty()) {
125                boolean noMap = Main.map == null;
126                for (Layer l : layers) {
127                    if (canceled)
128                        return;
129                    Main.getLayerManager().addLayer(l);
130                }
131                if (active != null) {
132                    Main.getLayerManager().setActiveLayer(active);
133                }
134                if (noMap) {
135                    Main.map.mapView.scheduleZoomTo(viewport);
136                }
137            }
138        }
139
140        private void runPostLoadTasks() {
141            if (postLoadTasks != null) {
142                for (Runnable task : postLoadTasks) {
143                    if (canceled)
144                        return;
145                    if (task == null) {
146                        continue;
147                    }
148                    task.run();
149                }
150            }
151        }
152
153        @Override
154        protected void realRun() {
155            try {
156                ProgressMonitor monitor = getProgressMonitor();
157                SessionReader reader = new SessionReader();
158                boolean tempFile = false;
159                try {
160                    if (file == null) {
161                        // Download and write entire joz file as a temp file on disk as we need random access later
162                        file = File.createTempFile("session_", ".joz", Utils.getJosmTempDir());
163                        tempFile = true;
164                        Files.copy(is, file.toPath(), StandardCopyOption.REPLACE_EXISTING);
165                    }
166                    reader.loadSession(file, zip, monitor);
167                    layers = reader.getLayers();
168                    active = reader.getActive();
169                    postLoadTasks = reader.getPostLoadTasks();
170                    viewport = reader.getViewport();
171                } finally {
172                    if (tempFile) {
173                        Utils.deleteFile(file);
174                        file = null;
175                    }
176                }
177            } catch (IllegalDataException e) {
178                handleException(tr("Data Error"), e);
179            } catch (IOException e) {
180                handleException(tr("IO Error"), e);
181            } catch (JosmRuntimeException | IllegalArgumentException | IllegalStateException e) {
182                cancel();
183                throw e;
184            }
185        }
186
187        private void handleException(String dialogTitle, Exception e) {
188            Main.error(e);
189            HelpAwareOptionPane.showMessageDialogInEDT(
190                    Main.parent,
191                    tr("<html>Could not load session file ''{0}''.<br>Error is:<br>{1}</html>",
192                            uri != null ? uri : file.getName(), e.getMessage()),
193                    dialogTitle,
194                    JOptionPane.ERROR_MESSAGE,
195                    null
196                    );
197            cancel();
198        }
199    }
200}
Note: See TracBrowser for help on using the repository browser.