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

Last change on this file since 10252 was 10212, checked in by Don-vip, 8 years ago

sonar - squid:S2221 - "Exception" should not be caught when not required by called methods

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