source: josm/trunk/src/org/openstreetmap/josm/gui/io/DownloadPrimitivesWithReferrersTask.java@ 7592

Last change on this file since 7592 was 7592, checked in by stoecker, 10 years ago

fix JavaDoc

  • Property svn:eol-style set to native
File size: 8.8 KB
Line 
1package org.openstreetmap.josm.gui.io;
2
3import static org.openstreetmap.josm.tools.I18n.tr;
4import static org.openstreetmap.josm.tools.I18n.trn;
5
6import java.awt.Font;
7import java.awt.GridBagLayout;
8import java.io.IOException;
9import java.util.ArrayList;
10import java.util.HashSet;
11import java.util.List;
12import java.util.Set;
13
14import javax.swing.JLabel;
15import javax.swing.JOptionPane;
16import javax.swing.JPanel;
17import javax.swing.JScrollPane;
18
19import org.openstreetmap.josm.Main;
20import org.openstreetmap.josm.actions.downloadtasks.DownloadReferrersTask;
21import org.openstreetmap.josm.data.osm.DataSet;
22import org.openstreetmap.josm.data.osm.OsmPrimitive;
23import org.openstreetmap.josm.data.osm.PrimitiveId;
24import org.openstreetmap.josm.gui.ExtendedDialog;
25import org.openstreetmap.josm.gui.PleaseWaitRunnable;
26import org.openstreetmap.josm.gui.layer.OsmDataLayer;
27import org.openstreetmap.josm.gui.progress.ProgressMonitor;
28import org.openstreetmap.josm.gui.util.GuiHelper;
29import org.openstreetmap.josm.gui.widgets.HtmlPanel;
30import org.openstreetmap.josm.gui.widgets.JosmTextArea;
31import org.openstreetmap.josm.io.OsmTransferException;
32import org.openstreetmap.josm.tools.GBC;
33import org.openstreetmap.josm.tools.Utils;
34import org.xml.sax.SAXException;
35
36/**
37 * Task for downloading a set of primitives with all referrers.
38 */
39public class DownloadPrimitivesWithReferrersTask extends PleaseWaitRunnable {
40 /** If true download into a new layer */
41 private final boolean newLayer;
42 /** List of primitives id to download */
43 private final List<PrimitiveId> ids;
44 /** If true, download members for relation */
45 private final boolean full;
46 /** If true, download also referrers */
47 private final boolean downloadReferrers;
48
49 /** Temporary layer where downloaded primitives are put */
50 private OsmDataLayer tmpLayer;
51 /** Reference to the task that download requested primitives */
52 private DownloadPrimitivesTask mainTask;
53 /** Flag indicated that user ask for cancel this task */
54 private boolean canceled = false;
55 /** Reference to the task currently running */
56 private PleaseWaitRunnable currentTask = null;
57
58 /**
59 * Constructor
60 *
61 * @param newLayer if the data should be downloaded into a new layer
62 * @param ids List of primitive id to download
63 * @param downloadReferrers if the referrers of the object should be downloaded as well,
64 * i.e., parent relations, and for nodes, additionally, parent ways
65 * @param full if the members of a relation should be downloaded as well
66 * @param monitor ProgressMonitor to use, or null to create a new one
67 */
68 public DownloadPrimitivesWithReferrersTask(boolean newLayer, List<PrimitiveId> ids, boolean downloadReferrers,
69 boolean full, ProgressMonitor monitor) {
70 super(tr("Download objects"), monitor, false);
71 this.ids = ids;
72 this.downloadReferrers = downloadReferrers;
73 this.full = full;
74 this.newLayer = newLayer;
75 // All downloaded primitives are put in a tmpLayer
76 tmpLayer = new OsmDataLayer(new DataSet(), OsmDataLayer.createNewName(), null);
77 }
78
79 /**
80 * Cancel recursively the task. Do not call directly
81 * @see DownloadPrimitivesWithReferrersTask#operationCanceled()
82 */
83 @Override
84 protected void cancel() {
85 synchronized(this) {
86 canceled = true;
87 if(currentTask != null)
88 currentTask.operationCanceled();
89 }
90 }
91
92 @Override
93 protected void realRun() throws SAXException, IOException, OsmTransferException {
94 getProgressMonitor().setTicksCount(ids.size()+1);
95 // First, download primitives
96 mainTask = new DownloadPrimitivesTask(tmpLayer, ids, full, getProgressMonitor().createSubTaskMonitor(1, false));
97 synchronized(this) {
98 currentTask = mainTask;
99 if(canceled) {
100 currentTask = null;
101 return;
102 }
103 }
104 currentTask.run();
105 // Then, download referrers for each primitive
106 if(downloadReferrers)
107 for(PrimitiveId id : ids) {
108 synchronized(this) {
109 if(canceled) {
110 currentTask = null;
111 return;
112 }
113 currentTask = new DownloadReferrersTask(
114 tmpLayer, id, getProgressMonitor().createSubTaskMonitor(1, false));
115 }
116 currentTask.run();
117 }
118 currentTask = null;
119 }
120
121 @Override
122 protected void finish() {
123 synchronized(this) {
124 if(canceled)
125 return;
126 }
127
128 // Append downloaded data to JOSM
129 OsmDataLayer layer = Main.main.getEditLayer();
130 if(layer == null || this.newLayer)
131 Main.main.addLayer(tmpLayer);
132 else
133 layer.mergeFrom(tmpLayer);
134
135 // Warm about missing primitives
136 final Set<PrimitiveId> errs = mainTask.getMissingPrimitives();
137 if (errs != null && !errs.isEmpty())
138 GuiHelper.runInEDTAndWait(new Runnable() {
139 @Override
140 public void run() {
141 reportProblemDialog(errs,
142 trn("Object could not be downloaded", "Some objects could not be downloaded", errs.size()),
143 trn("One object could not be downloaded.<br>",
144 "{0} objects could not be downloaded.<br>",
145 errs.size(),
146 errs.size())
147 + tr("The server replied with response code 404.<br>"
148 + "This usually means, the server does not know an object with the requested id."),
149 tr("missing objects:"),
150 JOptionPane.ERROR_MESSAGE
151 ).showDialog();
152 }
153 });
154
155 // Warm about deleted primitives
156 final Set<PrimitiveId> del = new HashSet<>();
157 DataSet ds = Main.main.getCurrentDataSet();
158 for (PrimitiveId id : ids) {
159 OsmPrimitive osm = ds.getPrimitiveById(id);
160 if (osm != null && osm.isDeleted()) {
161 del.add(id);
162 }
163 }
164 if (!del.isEmpty())
165 GuiHelper.runInEDTAndWait(new Runnable() {
166 @Override
167 public void run() {
168 reportProblemDialog(del,
169 trn("Object deleted", "Objects deleted", del.size()),
170 trn(
171 "One downloaded object is deleted.",
172 "{0} downloaded objects are deleted.",
173 del.size(),
174 del.size()),
175 null,
176 JOptionPane.WARNING_MESSAGE
177 ).showDialog();
178 }
179 });
180 }
181
182 /**
183 * Return id of really downloaded primitives.
184 * @return List of primitives id or null if no primitives was downloaded
185 */
186 public List<PrimitiveId> getDownloadedId() {
187 synchronized(this) {
188 if(canceled)
189 return null;
190 }
191 ArrayList<PrimitiveId> downloaded = new ArrayList<>(ids);
192 downloaded.removeAll(mainTask.getMissingPrimitives());
193 return downloaded;
194 }
195
196 /**
197 * Dialog for report a problem during download.
198 * @param errs Primitives involved
199 * @param title Title of dialog
200 * @param text Detail message
201 * @param listLabel List of primitives description
202 * @param msgType Type of message, see {@link JOptionPane}
203 * @return The Dialog object
204 */
205 private static ExtendedDialog reportProblemDialog(Set<PrimitiveId> errs,
206 String title, String text, String listLabel, int msgType) {
207 JPanel p = new JPanel(new GridBagLayout());
208 p.add(new HtmlPanel(text), GBC.eop());
209 if (listLabel != null) {
210 JLabel missing = new JLabel(listLabel);
211 missing.setFont(missing.getFont().deriveFont(Font.PLAIN));
212 p.add(missing, GBC.eol());
213 }
214 JosmTextArea txt = new JosmTextArea();
215 txt.setFont(new Font("Monospaced", txt.getFont().getStyle(), txt.getFont().getSize()));
216 txt.setEditable(false);
217 txt.setBackground(p.getBackground());
218 txt.setColumns(40);
219 txt.setRows(1);
220 txt.setText(Utils.join(", ", errs));
221 JScrollPane scroll = new JScrollPane(txt);
222 p.add(scroll, GBC.eop().weight(1.0, 0.0).fill(GBC.HORIZONTAL));
223
224 return new ExtendedDialog(
225 Main.parent,
226 title,
227 new String[] { tr("Ok") })
228 .setButtonIcons(new String[] { "ok" })
229 .setIcon(msgType)
230 .setContent(p, false);
231 }
232}
Note: See TracBrowser for help on using the repository browser.