source: josm/trunk/src/org/openstreetmap/josm/gui/layer/gpx/DownloadWmsAlongTrackAction.java@ 14427

Last change on this file since 14427 was 14427, checked in by wiktorn, 5 years ago

Fix canceling precaching imageries along GPX track

  • when GPX is big it was possibile to cancel task before precacheTask was set in

PrecacheWmsTask.realRun(). This caused NPE and prevented cleaning download
queue

  • PrecacheTask.tileLoadingFinished updated progress monitor even if task was

already cancelled and this led to invalid state exception in ProgressMonitor,
as there are many download tasks run in parallel and we do not cancel them if
they already started. Now, after download is cancelled, no updates are issued

Closes: #16966

  • Property svn:eol-style set to native
File size: 4.8 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.layer.gpx;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.event.ActionEvent;
7import java.io.IOException;
8import java.util.ArrayList;
9import java.util.List;
10
11import javax.swing.AbstractAction;
12import javax.swing.JOptionPane;
13
14import org.openstreetmap.gui.jmapviewer.tilesources.AbstractTMSTileSource;
15import org.openstreetmap.josm.actions.AbstractMergeAction;
16import org.openstreetmap.josm.data.coor.LatLon;
17import org.openstreetmap.josm.data.gpx.GpxData;
18import org.openstreetmap.josm.data.gpx.GpxTrack;
19import org.openstreetmap.josm.data.gpx.GpxTrackSegment;
20import org.openstreetmap.josm.data.gpx.WayPoint;
21import org.openstreetmap.josm.gui.MainApplication;
22import org.openstreetmap.josm.gui.PleaseWaitRunnable;
23import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer;
24import org.openstreetmap.josm.gui.progress.ProgressTaskId;
25import org.openstreetmap.josm.gui.progress.ProgressTaskIds;
26import org.openstreetmap.josm.io.OsmTransferException;
27import org.openstreetmap.josm.tools.ImageProvider;
28import org.openstreetmap.josm.tools.Logging;
29import org.xml.sax.SAXException;
30
31/**
32 * Class downloading WMS and TMS along the GPX track.
33 * @since 5715
34 */
35public class DownloadWmsAlongTrackAction extends AbstractAction {
36
37 private final transient GpxData data;
38
39 /**
40 * @param data that represents GPX track, along which data should be downloaded
41 */
42 public DownloadWmsAlongTrackAction(final GpxData data) {
43 super(tr("Precache imagery tiles along this track"));
44 new ImageProvider("downloadalongtrack").getResource().attachImageIcon(this, true);
45 this.data = data;
46 }
47
48 static class PrecacheWmsTask extends PleaseWaitRunnable {
49
50 private final AbstractTileSourceLayer<? extends AbstractTMSTileSource> layer;
51 private final List<LatLon> points;
52 private AbstractTileSourceLayer<? extends AbstractTMSTileSource>.PrecacheTask precacheTask;
53
54 protected PrecacheWmsTask(AbstractTileSourceLayer<? extends AbstractTMSTileSource> layer, List<LatLon> points) {
55 super(tr("Precaching WMS"));
56 this.layer = layer;
57 this.points = points;
58 }
59
60 @Override
61 protected void realRun() throws SAXException, IOException, OsmTransferException {
62 precacheTask = layer.getDownloadAreaToCacheTask(progressMonitor, points, 0, 0);
63 precacheTask.run();
64 synchronized (this) {
65 try {
66 while (!precacheTask.isFinished() && !progressMonitor.isCanceled()) {
67 wait(200);
68 }
69 } catch (InterruptedException ex) {
70 Logging.warn("InterruptedException in "+getClass().getSimpleName()+" while precaching WMS");
71 Thread.currentThread().interrupt();
72 }
73 }
74 }
75
76 @Override
77 protected void finish() {
78 // Do nothing
79 }
80
81 @Override
82 protected void cancel() {
83 precacheTask.cancel();
84 }
85
86 @Override
87 public ProgressTaskId canRunInBackground() {
88 return ProgressTaskIds.PRECACHE_WMS;
89 }
90 }
91
92 PrecacheWmsTask createTask() {
93 List<LatLon> points = new ArrayList<>();
94 for (GpxTrack trk : data.tracks) {
95 for (GpxTrackSegment segment : trk.getSegments()) {
96 for (WayPoint p : segment.getWayPoints()) {
97 points.add(p.getCoor());
98 }
99 }
100 }
101 for (WayPoint p : data.waypoints) {
102 points.add(p.getCoor());
103 }
104 AbstractTileSourceLayer<? extends AbstractTMSTileSource> layer = askedLayer();
105 return layer != null ? new PrecacheWmsTask(layer, points) : null;
106 }
107
108 @Override
109 public void actionPerformed(ActionEvent e) {
110 PrecacheWmsTask task = createTask();
111 if (task != null) {
112 MainApplication.worker.execute(task);
113 }
114 }
115
116 @SuppressWarnings({ "rawtypes", "unchecked" })
117 protected AbstractTileSourceLayer<? extends AbstractTMSTileSource> askedLayer() {
118 List<AbstractTileSourceLayer> targetLayers = MainApplication.getLayerManager().getLayersOfType(AbstractTileSourceLayer.class);
119 if (targetLayers.isEmpty()) {
120 warnNoImageryLayers();
121 return null;
122 }
123 return AbstractMergeAction.askTargetLayer(targetLayers.toArray(new AbstractTileSourceLayer[0]),
124 tr("Please select the imagery layer."),
125 tr("Select imagery layer"),
126 tr("Download"), "dialogs/down");
127 }
128
129 protected void warnNoImageryLayers() {
130 JOptionPane.showMessageDialog(MainApplication.getMainFrame(),
131 tr("There are no imagery layers."), tr("No imagery layers"), JOptionPane.WARNING_MESSAGE);
132 }
133}
Note: See TracBrowser for help on using the repository browser.