Changeset 2563 in josm for trunk/src/org/openstreetmap/josm/data/osm/DataSetMerger.java
- Timestamp:
- 03.12.2009 19:02:25 (2 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/data/osm/DataSetMerger.java
r2512 r2563 38 38 * to relation members) after the first phase of merging 39 39 */ 40 private Set< Long> childrenToMerge;40 private Set<PrimitiveId> objectsWithChildrenToMerge; 41 41 private Set<OsmPrimitive> deletedObjectsToUnlink; 42 42 … … 57 57 conflicts = new ConflictCollection(); 58 58 mergedMap = new HashMap<Long, Long>(); 59 childrenToMerge = new HashSet<Long>();59 objectsWithChildrenToMerge = new HashSet<PrimitiveId>(); 60 60 deletedObjectsToUnlink = new HashSet<OsmPrimitive>(); 61 61 } … … 75 75 * @param source the other primitive 76 76 */ 77 protected <P extends OsmPrimitive> void mergePrimitive(Psource) {77 protected void mergePrimitive(OsmPrimitive source) { 78 78 if (!source.isNew() ) { 79 79 // try to merge onto a matching primitive with the same … … 112 112 target.setTimestamp(source.getTimestamp()); 113 113 target.setModified(source.isModified()); 114 childrenToMerge.add(source.getUniqueId());114 objectsWithChildrenToMerge.add(source.getPrimitiveId()); 115 115 } 116 116 return; … … 131 131 targetDataSet.addPrimitive(target); 132 132 mergedMap.put(source.getUniqueId(), target.getUniqueId()); 133 childrenToMerge.add(source.getUniqueId());133 objectsWithChildrenToMerge.add(source.getPrimitiveId()); 134 134 } 135 135 … … 154 154 155 155 /** 156 * A way in the target dataset might be incomplete because at least of of its nodes is incomplete. 157 * The nodes might have become complete because a complete node was merged onto into in the 158 * merge operation. 159 * 160 * This method loops over all parent ways of such nodes and turns them into complete ways 161 * if necessary. 162 * 163 * @param other 164 */ 165 protected void fixIncompleteParentWays(Node other) { 166 Node myNode = (Node)getMergeTarget(other); 167 if (myNode == null) 168 throw new RuntimeException(tr("Missing merge target for node with id {0}", other.getUniqueId())); 169 if (myNode.incomplete || myNode.isDeleted() || !myNode.isVisible()) return; 170 wayloop: for (Way w: OsmPrimitive.getFilteredList(myNode.getReferrers(), Way.class)) { 171 if (w.isDeleted() || ! w.isVisible() || ! w.incomplete) { 172 continue; 173 } 174 for (Node n: w.getNodes()) { 175 if (n.incomplete) { 176 continue wayloop; 177 } 178 } 179 // all nodes are complete - set the way complete too 180 w.incomplete = false; 181 } 182 } 183 184 /** 156 185 * Postprocess the dataset and fix all merged references to point to the actual 157 186 * data. … … 159 188 public void fixReferences() { 160 189 for (Way w : sourceDataSet.getWays()) { 161 if (!conflicts.hasConflictForTheir(w) && childrenToMerge.contains(w.getUniqueId())) {190 if (!conflicts.hasConflictForTheir(w) && objectsWithChildrenToMerge.contains(w.getPrimitiveId())) { 162 191 mergeNodeList(w); 163 192 fixIncomplete(w); … … 165 194 } 166 195 for (Relation r : sourceDataSet.getRelations()) { 167 if (!conflicts.hasConflictForTheir(r) && childrenToMerge.contains(r.getUniqueId())) {196 if (!conflicts.hasConflictForTheir(r) && objectsWithChildrenToMerge.contains(r.getPrimitiveId())) { 168 197 mergeRelationMembers(r); 169 198 } … … 175 204 targetDataSet.unlinkReferencesToPrimitive(target); 176 205 } 206 // objectsWithChildrenToMerge also includes complete nodes which have 207 // been merged into their incomplete equivalents. 208 // 209 for (PrimitiveId id: objectsWithChildrenToMerge) { 210 if (!id.getType().equals(OsmPrimitiveType.NODE)) { 211 continue; 212 } 213 Node n = (Node)sourceDataSet.getPrimitiveById(id); 214 if (!conflicts.hasConflictForTheir(n)) { 215 fixIncompleteParentWays(n); 216 } 217 } 218 177 219 } 178 220 … … 269 311 // 270 312 target.mergeFrom(source); 271 childrenToMerge.add(source.getUniqueId());313 objectsWithChildrenToMerge.add(source.getPrimitiveId()); 272 314 } else if (!target.incomplete && source.incomplete) { 273 315 // target is complete and source is incomplete … … 282 324 // otherwise too many conflicts when refreshing from the server 283 325 } else if (target.isDeleted() != source.isDeleted()) { 284 // differences in deleted state have to be resolved manually 326 // differences in deleted state have to be resolved manually. This can 327 // happen if one layer is merged onto another layer 285 328 // 286 329 conflicts.add(target,source); … … 288 331 // target not modified. We can assume that source is the most recent version. 289 332 // clone it into target. But check first, whether source is deleted. if so, 290 // make sure that target is not referenced any more in myDataSet.333 // make sure that target is not referenced any more in myDataSet. 291 334 // 292 335 if (source.isDeleted()) { … … 294 337 } 295 338 target.mergeFrom(source); 296 childrenToMerge.add(source.getUniqueId());339 objectsWithChildrenToMerge.add(source.getPrimitiveId()); 297 340 } else if (! target.isModified() && !source.isModified() && target.getVersion() == source.getVersion()) { 298 341 // both not modified. Keep mine … … 302 345 // 303 346 target.mergeFrom(source); 304 childrenToMerge.add(source.getUniqueId());347 objectsWithChildrenToMerge.add(source.getPrimitiveId()); 305 348 } else if (target.isModified() && ! source.isModified() && target.getVersion() == source.getVersion()) { 306 349 // target is same as source but target is modified … … 318 361 target.mergeFrom(source); 319 362 target.setModified(true); 320 childrenToMerge.add(source.getUniqueId());363 objectsWithChildrenToMerge.add(source.getPrimitiveId()); 321 364 } 322 365 return true;
Note: See TracChangeset
for help on using the changeset viewer.
