source: josm/trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetHeaderDownloadTask.java@ 6830

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

javadoc fixes for jdk8 compatibility

  • Property svn:eol-style set to native
File size: 7.4 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.dialogs.changeset;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.Component;
7import java.io.IOException;
8import java.lang.reflect.InvocationTargetException;
9import java.util.Collection;
10import java.util.Collections;
11import java.util.HashSet;
12import java.util.Set;
13
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.gui.ExceptionDialogUtil;
20import org.openstreetmap.josm.gui.PleaseWaitRunnable;
21import org.openstreetmap.josm.io.OsmServerChangesetReader;
22import org.openstreetmap.josm.io.OsmTransferException;
23import org.openstreetmap.josm.tools.BugReportExceptionHandler;
24import org.openstreetmap.josm.tools.CheckParameterUtil;
25import org.openstreetmap.josm.tools.ExceptionUtil;
26import org.xml.sax.SAXException;
27
28/**
29 * This is an asynchronous task for downloading a collection of changests from the OSM
30 * server.
31 *
32 * The task only downloads the changeset properties without the changeset content. It
33 * updates the global {@link ChangesetCache}.
34 *
35 */
36public class ChangesetHeaderDownloadTask extends PleaseWaitRunnable implements ChangesetDownloadTask{
37
38 /**
39 * Builds a download task from for a collection of changesets.
40 *
41 * Ignores null values and changesets with {@link Changeset#isNew()} == true.
42 *
43 * @param changesets the collection of changesets. Assumes an empty collection if null.
44 * @return the download task
45 */
46 static public ChangesetHeaderDownloadTask buildTaskForChangesets(Collection<Changeset> changesets) {
47 return buildTaskForChangesets(Main.parent, changesets);
48 }
49
50 /**
51 * Builds a download task from for a collection of changesets.
52 *
53 * Ignores null values and changesets with {@link Changeset#isNew()} == true.
54 *
55 * @param parent the parent component relative to which the {@link org.openstreetmap.josm.gui.PleaseWaitDialog} is displayed.
56 * Must not be null.
57 * @param changesets the collection of changesets. Assumes an empty collection if null.
58 * @return the download task
59 * @throws IllegalArgumentException thrown if parent is null
60 */
61 static public ChangesetHeaderDownloadTask buildTaskForChangesets(Component parent, Collection<Changeset> changesets) {
62 CheckParameterUtil.ensureParameterNotNull(parent, "parent");
63 if (changesets == null) {
64 changesets = Collections.emptyList();
65 }
66
67 HashSet<Integer> ids = new HashSet<Integer>();
68 for (Changeset cs: changesets) {
69 if (cs == null || cs.isNew()) {
70 continue;
71 }
72 ids.add(cs.getId());
73 }
74 if (parent == null)
75 return new ChangesetHeaderDownloadTask(ids);
76 else
77 return new ChangesetHeaderDownloadTask(parent, ids);
78
79 }
80
81 private Set<Integer> idsToDownload;
82 private OsmServerChangesetReader reader;
83 private boolean canceled;
84 private Exception lastException;
85 private Set<Changeset> downloadedChangesets;
86
87 protected void init(Collection<Integer> ids) {
88 if (ids == null) {
89 ids = Collections.emptyList();
90 }
91 idsToDownload = new HashSet<Integer>();
92 if (ids == null || ids.isEmpty())
93 return;
94 for (int id: ids) {
95 if (id <= 0) {
96 continue;
97 }
98 idsToDownload.add(id);
99 }
100 }
101
102 /**
103 * Creates the download task for a collection of changeset ids. Uses a {@link org.openstreetmap.josm.gui.PleaseWaitDialog}
104 * whose parent is {@link Main#parent}.
105 *
106 * Null ids or or ids &lt;= 0 in the id collection are ignored.
107 *
108 * @param ids the collection of ids. Empty collection assumed if null.
109 */
110 public ChangesetHeaderDownloadTask(Collection<Integer> ids) {
111 // parent for dialog is Main.parent
112 super(tr("Download changesets"), false /* don't ignore exceptions */);
113 init(ids);
114 }
115
116 /**
117 * Creates the download task for a collection of changeset ids. Uses a {@link org.openstreetmap.josm.gui.PleaseWaitDialog}
118 * whose parent is the parent window of <code>dialogParent</code>.
119 *
120 * Null ids or or ids &lt;= 0 in the id collection are ignored.
121 *
122 * @param dialogParent the parent reference component for the {@link org.openstreetmap.josm.gui.PleaseWaitDialog}. Must not be null.
123 * @param ids the collection of ids. Empty collection assumed if null.
124 * @throws IllegalArgumentException thrown if dialogParent is null
125 */
126 public ChangesetHeaderDownloadTask(Component dialogParent, Collection<Integer> ids) throws IllegalArgumentException{
127 super(dialogParent,tr("Download changesets"), false /* don't ignore exceptions */);
128 init(ids);
129 }
130
131 @Override
132 protected void cancel() {
133 canceled = true;
134 synchronized (this) {
135 if (reader != null) {
136 reader.cancel();
137 }
138 }
139 }
140
141 @Override
142 protected void finish() {
143 if (canceled)
144 return;
145 if (lastException != null) {
146 ExceptionDialogUtil.explainException(lastException);
147 }
148 Runnable r = new Runnable() {
149 @Override
150 public void run() {
151 ChangesetCache.getInstance().update(downloadedChangesets);
152 }
153 };
154
155 if (SwingUtilities.isEventDispatchThread()) {
156 r.run();
157 } else {
158 try {
159 SwingUtilities.invokeAndWait(r);
160 } catch(InterruptedException e) {
161 Main.warn("InterruptedException in "+getClass().getSimpleName()+" while updating changeset cache");
162 } catch(InvocationTargetException e) {
163 Throwable t = e.getTargetException();
164 if (t instanceof RuntimeException) {
165 BugReportExceptionHandler.handleException(t);
166 } else if (t instanceof Exception){
167 ExceptionUtil.explainException(e);
168 } else {
169 BugReportExceptionHandler.handleException(t);
170 }
171 }
172 }
173 }
174
175 @Override
176 protected void realRun() throws SAXException, IOException, OsmTransferException {
177 try {
178 synchronized (this) {
179 reader = new OsmServerChangesetReader();
180 }
181 downloadedChangesets = new HashSet<Changeset>();
182 downloadedChangesets.addAll(reader.readChangesets(idsToDownload, getProgressMonitor().createSubTaskMonitor(0, false)));
183 } catch(OsmTransferException e) {
184 if (canceled)
185 // ignore exception if canceled
186 return;
187 // remember other exceptions
188 lastException = e;
189 }
190 }
191
192 /* ------------------------------------------------------------------------------- */
193 /* interface ChangesetDownloadTask */
194 /* ------------------------------------------------------------------------------- */
195 @Override
196 public Set<Changeset> getDownloadedChangesets() {
197 return downloadedChangesets;
198 }
199
200 @Override
201 public boolean isCanceled() {
202 return canceled;
203 }
204
205 @Override
206 public boolean isFailed() {
207 return lastException != null;
208 }
209}
Note: See TracBrowser for help on using the repository browser.