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

Last change on this file since 6798 was 6643, checked in by Don-vip, 10 years ago

global replacement of e.printStackTrace() by Main.error(e)

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