Changeset 2689 in josm for trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetHeaderDownloadTask.java
- Timestamp:
- 28.12.2009 00:16:04 (2 years ago)
- File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetHeaderDownloadTask.java
r2672 r2689 4 4 import static org.openstreetmap.josm.tools.I18n.tr; 5 5 6 import java.awt.Component; 6 7 import java.io.IOException; 8 import java.lang.reflect.InvocationTargetException; 7 9 import java.util.Collection; 10 import java.util.Collections; 8 11 import java.util.HashSet; 9 import java.util.List;10 12 import java.util.Set; 11 13 12 14 import javax.swing.SwingUtilities; 13 15 16 import org.openstreetmap.josm.Main; 14 17 import org.openstreetmap.josm.data.osm.Changeset; 15 18 import org.openstreetmap.josm.data.osm.ChangesetCache; … … 18 21 import org.openstreetmap.josm.io.OsmServerChangesetReader; 19 22 import org.openstreetmap.josm.io.OsmTransferException; 23 import org.openstreetmap.josm.tools.BugReportExceptionHandler; 24 import org.openstreetmap.josm.tools.CheckParameterUtil; 25 import org.openstreetmap.josm.tools.ExceptionUtil; 20 26 import org.xml.sax.SAXException; 21 27 22 public class DownloadChangesetsTask extends PleaseWaitRunnable{ 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 {@see ChangesetCache}. 34 * 35 */ 36 public 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 {@see 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 {@see Changeset#isNew()} == true. 54 * 55 * @param parent the parent component relative to which the {@see 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 23 81 24 82 private Set<Integer> idsToDownload; 25 83 private OsmServerChangesetReader reader; 26 private boolean cancel led;84 private boolean canceled; 27 85 private Exception lastException; 28 private List<Changeset> downloadedChangesets; 29 30 public DownloadChangesetsTask(Collection<Integer> ids) { 31 super(tr("Download changesets")); 86 private Set<Changeset> downloadedChangesets; 87 88 protected void init(Collection<Integer> ids) { 89 if (ids == null) { 90 ids = Collections.emptyList(); 91 } 32 92 idsToDownload = new HashSet<Integer>(); 33 93 if (ids == null || ids.isEmpty()) … … 41 101 } 42 102 103 /** 104 * Creates the download task for a collection of changeset ids. Uses a {@see PleaseWaitDialog} 105 * whose parent is {@see Main#parent}. 106 * 107 * Null ids or or ids <= 0 in the id collection are ignored. 108 * 109 * @param ids the collection of ids. Empty collection assumed if null. 110 */ 111 public ChangesetHeaderDownloadTask(Collection<Integer> ids) { 112 // parent for dialog is Main.parent 113 super(tr("Download changesets"), false /* don't ignore exceptions */); 114 init(ids); 115 } 116 117 /** 118 * Creates the download task for a collection of changeset ids. Uses a {@see PleaseWaitDialog} 119 * whose parent is the parent window of <code>dialogParent</code>. 120 * 121 * Null ids or or ids <= 0 in the id collection are ignored. 122 * 123 * @param dialogParent the parent reference component for the {@see PleaseWaitDialog}. Must not be null. 124 * @param ids the collection of ids. Empty collection assumed if null. 125 * @throws IllegalArgumentException thrown if dialogParent is null 126 */ 127 public ChangesetHeaderDownloadTask(Component dialogParent, Collection<Integer> ids) throws IllegalArgumentException{ 128 super(dialogParent,tr("Download changesets"), false /* don't ignore exceptions */); 129 init(ids); 130 } 131 43 132 @Override 44 133 protected void cancel() { 45 cancel led = true;134 canceled = true; 46 135 synchronized (this) { 47 136 if (reader != null) { … … 53 142 @Override 54 143 protected void finish() { 55 if (cancel led)144 if (canceled) 56 145 return; 57 146 if (lastException != null) { … … 67 156 r.run(); 68 157 } else { 69 SwingUtilities.invokeLater(r); 158 try { 159 SwingUtilities.invokeAndWait(r); 160 } catch(InterruptedException e) { 161 e.printStackTrace(); 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 } 70 172 } 71 173 } … … 77 179 reader = new OsmServerChangesetReader(); 78 180 } 79 downloadedChangesets = reader.readChangesets(idsToDownload, getProgressMonitor().createSubTaskMonitor(0, false)); 80 } catch(Exception e) { 81 if (cancelled) 181 downloadedChangesets = new HashSet<Changeset>(); 182 downloadedChangesets.addAll(reader.readChangesets(idsToDownload, getProgressMonitor().createSubTaskMonitor(0, false))); 183 } catch(OsmTransferException e) { 184 if (canceled) 82 185 // ignore exception if cancelled 83 186 return; 84 if (e instanceof RuntimeException) 85 throw (RuntimeException)e; 187 // remember other exceptions 86 188 lastException = e; 87 189 } 88 190 } 191 192 /* ------------------------------------------------------------------------------- */ 193 /* interface ChangesetDownloadTask */ 194 /* ------------------------------------------------------------------------------- */ 195 public Set<Changeset> getDownloadedChangesets() { 196 return downloadedChangesets; 197 } 198 199 public boolean isCanceled() { 200 return canceled; 201 } 202 203 public boolean isFailed() { 204 return lastException != null; 205 } 89 206 }
Note: See TracChangeset
for help on using the changeset viewer.
