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

Last change on this file since 12158 was 11848, checked in by Don-vip, 7 years ago

fix #14613 - Special HTML characters not escaped in GUI error messages

  • 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(), Utils.escapeReservedCharactersHTML(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.