source: josm/trunk/src/org/openstreetmap/josm/actions/CloseChangesetAction.java@ 8250

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

fix #8885 (see #4614) - add offline mode with new command line argument --offline which can take one of several of these values (comma separated):

  • josm_website: to disable all accesses to JOSM website (when not cached, disables Getting Started page, help, plugin list, styles, imagery, presets, rules)
  • osm_api: to disable all accesses to OSM API (disables download, upload, changeset queries, history, user message notification)
  • all: alias to disable all values. Currently equivalent to "josm_website,osm_api"

Plus improved javadoc, fixed EDT violations, and fixed a bug with HTTP redirection sent without "Location" header

  • Property svn:eol-style set to native
File size: 5.4 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.awt.event.KeyEvent;
9import java.io.IOException;
10import java.util.Collection;
11import java.util.List;
12
13import javax.swing.JOptionPane;
14import javax.swing.SwingUtilities;
15
16import org.openstreetmap.josm.Main;
17import org.openstreetmap.josm.data.osm.Changeset;
18import org.openstreetmap.josm.data.osm.ChangesetCache;
19import org.openstreetmap.josm.data.osm.UserInfo;
20import org.openstreetmap.josm.gui.ExceptionDialogUtil;
21import org.openstreetmap.josm.gui.PleaseWaitRunnable;
22import org.openstreetmap.josm.gui.io.CloseChangesetDialog;
23import org.openstreetmap.josm.gui.io.CloseChangesetTask;
24import org.openstreetmap.josm.io.ChangesetQuery;
25import org.openstreetmap.josm.io.OnlineResource;
26import org.openstreetmap.josm.io.OsmServerChangesetReader;
27import org.openstreetmap.josm.io.OsmServerUserInfoReader;
28import org.openstreetmap.josm.io.OsmTransferException;
29import org.openstreetmap.josm.tools.Shortcut;
30import org.xml.sax.SAXException;
31
32public class CloseChangesetAction extends JosmAction {
33
34 /**
35 * Constructs a new {@code CloseChangesetAction}.
36 */
37 public CloseChangesetAction() {
38 super(tr("Close open changesets"),
39 "closechangeset",
40 tr("Closes open changesets"),
41 Shortcut.registerShortcut("system:closechangeset",
42 tr("File: {0}", tr("Closes open changesets")),
43 KeyEvent.VK_Q, Shortcut.ALT_CTRL),
44 true
45 );
46 putValue("help", ht("/Action/CloseChangeset"));
47 setEnabled(!Main.isOffline(OnlineResource.OSM_API));
48
49 }
50 @Override
51 public void actionPerformed(ActionEvent e) {
52 Main.worker.submit(new DownloadOpenChangesetsTask());
53 }
54
55 protected void onPostDownloadOpenChangesets() {
56 List<Changeset> openChangesets = ChangesetCache.getInstance().getOpenChangesets();
57 if (openChangesets.isEmpty()) {
58 JOptionPane.showMessageDialog(
59 Main.parent,
60 tr("There are no open changesets"),
61 tr("No open changesets"),
62 JOptionPane.INFORMATION_MESSAGE
63 );
64 return;
65 }
66
67 CloseChangesetDialog dialog = new CloseChangesetDialog();
68 dialog.setChangesets(openChangesets);
69 dialog.setVisible(true);
70 if (dialog.isCanceled())
71 return;
72
73 Collection<Changeset> changesetsToClose = dialog.getSelectedChangesets();
74 CloseChangesetTask closeChangesetTask = new CloseChangesetTask(changesetsToClose);
75 Main.worker.submit(closeChangesetTask);
76 }
77
78 private class DownloadOpenChangesetsTask extends PleaseWaitRunnable {
79
80 private boolean canceled;
81 private OsmServerChangesetReader reader;
82 private List<Changeset> changesets;
83 private Exception lastException;
84 private UserInfo userInfo;
85
86 public DownloadOpenChangesetsTask() {
87 super(tr("Downloading open changesets ...", false /* don't ignore exceptions */));
88 }
89
90 @Override
91 protected void cancel() {
92 this.canceled = true;
93 reader.cancel();
94 }
95
96 @Override
97 protected void finish() {
98 SwingUtilities.invokeLater(
99 new Runnable() {
100 @Override
101 public void run() {
102 if (lastException != null) {
103 ExceptionDialogUtil.explainException(lastException);
104 }
105 ChangesetCache.getInstance().update(changesets);
106 if (!canceled && lastException == null) {
107 onPostDownloadOpenChangesets();
108 }
109 }
110 }
111 );
112 }
113
114 /**
115 * Fetch the user info from the server. This is necessary if we don't know
116 * the users id yet
117 *
118 * @return the user info
119 * @throws OsmTransferException thrown in case of any communication exception
120 */
121 protected UserInfo fetchUserInfo() throws OsmTransferException {
122 OsmServerUserInfoReader reader = new OsmServerUserInfoReader();
123 return reader.fetchUserInfo(getProgressMonitor().createSubTaskMonitor(1, false));
124 }
125
126 @Override
127 protected void realRun() throws SAXException, IOException, OsmTransferException {
128 try {
129 userInfo = fetchUserInfo();
130 if (canceled)
131 return;
132 reader = new OsmServerChangesetReader();
133 ChangesetQuery query = new ChangesetQuery().forUser(userInfo.getId()).beingOpen(true);
134 changesets = reader.queryChangesets(
135 query,
136 getProgressMonitor().createSubTaskMonitor(1, false /* not internal */)
137 );
138 } catch(Exception e) {
139 if (canceled)
140 return;
141 lastException = e;
142 }
143 }
144
145 public boolean isCanceled() {
146 return canceled;
147 }
148
149 public Exception getLastException() {
150 return lastException;
151 }
152 }
153}
Note: See TracBrowser for help on using the repository browser.