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

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

sonar - Immutable Field

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