source: josm/trunk/src/org/openstreetmap/josm/gui/io/UpdatePrimitivesTask.java@ 4932

Last change on this file since 4932 was 4191, checked in by stoecker, 13 years ago

remove old debug stuff

  • Property svn:eol-style set to native
File size: 6.6 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.io;
3
4import static org.openstreetmap.josm.tools.CheckParameterUtil.ensureParameterNotNull;
5import static org.openstreetmap.josm.tools.I18n.tr;
6
7import java.io.IOException;
8import java.lang.reflect.InvocationTargetException;
9import java.util.Collection;
10import java.util.Collections;
11
12import javax.swing.SwingUtilities;
13
14import org.openstreetmap.josm.data.osm.DataSet;
15import org.openstreetmap.josm.data.osm.DataSetMerger;
16import org.openstreetmap.josm.data.osm.Node;
17import org.openstreetmap.josm.data.osm.OsmPrimitive;
18import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
19import org.openstreetmap.josm.data.osm.Relation;
20import org.openstreetmap.josm.data.osm.Way;
21import org.openstreetmap.josm.gui.ExceptionDialogUtil;
22import org.openstreetmap.josm.gui.PleaseWaitRunnable;
23import org.openstreetmap.josm.gui.layer.OsmDataLayer;
24import org.openstreetmap.josm.gui.progress.ProgressMonitor;
25import org.openstreetmap.josm.io.MultiFetchServerObjectReader;
26import org.openstreetmap.josm.io.OsmServerObjectReader;
27import org.openstreetmap.josm.io.OsmTransferException;
28import org.xml.sax.SAXException;
29
30/**
31 * The asynchronous task for updating a collection of objects using multi fetch.
32 *
33 */
34public class UpdatePrimitivesTask extends PleaseWaitRunnable {
35 private DataSet ds;
36 private boolean canceled;
37 private Exception lastException;
38 private Collection<? extends OsmPrimitive> toUpdate;
39 private OsmDataLayer layer;
40 private MultiFetchServerObjectReader multiObjectReader;
41 private OsmServerObjectReader objectReader;
42
43 /**
44 * Creates the task
45 *
46 * @param layer the layer in which primitives are updated. Must not be null.
47 * @param toUpdate a collection of primitives to update from the server. Set to
48 * the empty collection if null.
49 * @throws IllegalArgumentException thrown if layer is null.
50 */
51 public UpdatePrimitivesTask(OsmDataLayer layer, Collection<? extends OsmPrimitive> toUpdate) throws IllegalArgumentException{
52 super(tr("Update objects"), false /* don't ignore exception */);
53 ensureParameterNotNull(layer, "layer");
54 if (toUpdate == null) {
55 toUpdate = Collections.emptyList();
56 }
57 this.layer = layer;
58 this.toUpdate = toUpdate;
59 }
60
61 @Override
62 protected void cancel() {
63 canceled = true;
64 synchronized(this) {
65 if (multiObjectReader != null) {
66 multiObjectReader.cancel();
67 }
68 if (objectReader != null) {
69 objectReader.cancel();
70 }
71 }
72 }
73
74 @Override
75 protected void finish() {
76 if (canceled)
77 return;
78 if (lastException != null) {
79 ExceptionDialogUtil.explainException(lastException);
80 return;
81 }
82 Runnable r = new Runnable() {
83 public void run() {
84 layer.mergeFrom(ds);
85 layer.onPostDownloadFromServer();
86 }
87 };
88
89 if (SwingUtilities.isEventDispatchThread()) {
90 r.run();
91 } else {
92 try {
93 SwingUtilities.invokeAndWait(r);
94 } catch(InterruptedException e) {
95 e.printStackTrace();
96 } catch(InvocationTargetException e) {
97 e.printStackTrace();
98 }
99 }
100 }
101
102 protected void initMultiFetchReaderWithNodes(MultiFetchServerObjectReader reader) {
103 getProgressMonitor().indeterminateSubTask(tr("Initializing nodes to update ..."));
104 for (OsmPrimitive primitive : toUpdate) {
105 if (primitive instanceof Node && !primitive.isNew()) {
106 reader.append((Node)primitive);
107 } else if (primitive instanceof Way) {
108 Way way = (Way)primitive;
109 for (Node node: way.getNodes()) {
110 if (!node.isNew()) {
111 reader.append(node);
112 }
113 }
114 }
115 }
116 }
117
118 protected void initMultiFetchReaderWithWays(MultiFetchServerObjectReader reader) {
119 getProgressMonitor().indeterminateSubTask(tr("Initializing ways to update ..."));
120 for (OsmPrimitive primitive : toUpdate) {
121 if (primitive instanceof Way && !primitive.isNew()) {
122 reader.append((Way)primitive);
123 }
124 }
125 }
126
127 protected void initMultiFetchReaderWithRelations(MultiFetchServerObjectReader reader) {
128 getProgressMonitor().indeterminateSubTask(tr("Initializing relations to update ..."));
129 for (OsmPrimitive primitive : toUpdate) {
130 if (primitive instanceof Relation && !primitive.isNew()) {
131 reader.append((Relation)primitive);
132 }
133 }
134 }
135
136 @Override
137 protected void realRun() throws SAXException, IOException, OsmTransferException {
138 this.ds = new DataSet();
139 DataSet theirDataSet;
140 try {
141 synchronized(this) {
142 if (canceled) return;
143 multiObjectReader = new MultiFetchServerObjectReader();
144 }
145 initMultiFetchReaderWithNodes(multiObjectReader);
146 initMultiFetchReaderWithWays(multiObjectReader);
147 initMultiFetchReaderWithRelations(multiObjectReader);
148 theirDataSet = multiObjectReader.parseOsm(progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false));
149 synchronized(this) {
150 multiObjectReader = null;
151 }
152 DataSetMerger merger = new DataSetMerger(ds, theirDataSet);
153 merger.merge();
154 // a way loaded with MultiFetch may have incomplete nodes because at least one of its
155 // nodes isn't present in the local data set. We therefore fully load all
156 // ways with incomplete nodes.
157 //
158 for (Way w : ds.getWays()) {
159 if (canceled) return;
160 if (w.hasIncompleteNodes()) {
161 synchronized(this) {
162 if (canceled) return;
163 objectReader = new OsmServerObjectReader(w.getId(), OsmPrimitiveType.WAY, true /* full */);
164 }
165 theirDataSet = objectReader.parseOsm(progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false));
166 synchronized (this) {
167 objectReader = null;
168 }
169 merger = new DataSetMerger(ds, theirDataSet);
170 merger.merge();
171 }
172 }
173 } catch(Exception e) {
174 if (canceled)
175 return;
176 lastException = e;
177 }
178 }
179}
Note: See TracBrowser for help on using the repository browser.