Ticket #20091: 20091-full.patch
| File 20091-full.patch, 6.8 KB (added by , 5 years ago) |
|---|
-
src/org/openstreetmap/josm/actions/relation/DownloadMembersAction.java
6 6 7 7 import java.awt.event.ActionEvent; 8 8 import java.util.Collection; 9 import java.util.List; 10 import java.util.stream.Collectors; 9 11 10 12 import org.openstreetmap.josm.data.osm.IPrimitive; 11 import org.openstreetmap.josm.data.osm. Relation;13 import org.openstreetmap.josm.data.osm.PrimitiveId; 12 14 import org.openstreetmap.josm.gui.MainApplication; 13 import org.openstreetmap.josm.gui. dialogs.relation.DownloadRelationTask;15 import org.openstreetmap.josm.gui.io.DownloadPrimitivesTask; 14 16 import org.openstreetmap.josm.tools.ImageProvider; 15 import org.openstreetmap.josm.tools.SubclassFilteredCollection;16 import org.openstreetmap.josm.tools.Utils;17 17 18 18 /** 19 19 * The action for downloading members of relations … … 34 34 @Override 35 35 public void actionPerformed(ActionEvent e) { 36 36 if (!isEnabled() || relations.isEmpty() || !MainApplication.isDisplayingMapView()) return; 37 MainApplication.worker.submit(new DownloadRelationTask( 38 Utils.filteredCollection(relations, Relation.class), MainApplication.getLayerManager().getEditLayer())); 37 List<PrimitiveId> members = relations.stream() 38 .flatMap(r -> r.getMemberPrimitivesList().stream().filter(osm -> !osm.isNew()).map(IPrimitive::getOsmPrimitiveId)) 39 .distinct() 40 .collect(Collectors.toList()); 41 42 MainApplication.worker.submit(new DownloadPrimitivesTask(MainApplication.getLayerManager().getEditLayer(), members, false)); 39 43 } 40 44 41 45 @Override 42 46 public void setPrimitives(Collection<? extends IPrimitive> primitives) { 43 // selected non-new relations 44 this.relations = SubclassFilteredCollection.filter(getRelations(primitives), r -> !r.isNew()); 47 this.relations = getRelations(primitives); 45 48 updateEnabledState(); 46 49 } 47 50 -
src/org/openstreetmap/josm/data/osm/DataSetMerger.java
9 9 import java.util.HashMap; 10 10 import java.util.HashSet; 11 11 import java.util.Iterator; 12 import java.util.LinkedHashSet; 12 13 import java.util.LinkedList; 13 14 import java.util.List; 14 15 import java.util.Map; … … 63 64 conflicts = new ConflictCollection(); 64 65 mergedMap = new HashMap<>(); 65 66 objectsWithChildrenToMerge = new HashSet<>(); 66 objectsToDelete = new HashSet<>();67 objectsToDelete = new LinkedHashSet<>(); 67 68 } 68 69 69 70 /** … … 297 298 // found a corresponding target, remember it 298 299 mergedMap.put(source.getPrimitiveId(), target.getPrimitiveId()); 299 300 301 boolean mergeFromSource = false; 300 302 if (target.getVersion() > source.getVersion()) 301 303 // target.version > source.version => keep target version 302 304 return true; 303 305 304 if (target.isIncomplete() && !source.isIncomplete()) { 306 if (!target.isModified() && source.isDeleted()) { 307 // target not modified. We can assume that source is the most recent version, 308 // so mark it to be deleted. 309 // 310 objectsToDelete.add(target); 311 } else if (target.isIncomplete() && !source.isIncomplete()) { 305 312 // target is incomplete, source completes it 306 313 // => merge source into target 307 314 // 308 target.mergeFrom(source); 309 objectsWithChildrenToMerge.add(source.getPrimitiveId()); 315 mergeFromSource = true; 310 316 } else if (!target.isIncomplete() && source.isIncomplete()) { 311 317 // target is complete and source is incomplete 312 318 // => keep target, it has more information already … … 323 329 // We shouldn't merge that datasets. 324 330 throw new DataIntegrityProblemException(tr("Conflict in ''visible'' attribute for object of type {0} with id {1}", 325 331 target.getType(), target.getId())); 332 } else if (target.isDeleted() && source.isDeleted() && target.getVersion() < source.getVersion()) { 333 // both deleted. Source is newer. Take source. See #19783 334 mergeFromSource = true; 326 335 } else if (target.isDeleted() && !source.isDeleted() && target.getVersion() == source.getVersion()) { 327 336 // same version, but target is deleted. Assume target takes precedence 328 337 // otherwise too many conflicts when refreshing from the server … … 339 348 break; 340 349 } 341 350 } 342 } else if (!target.isModified() && source.isDeleted()) {343 // target not modified. We can assume that source is the most recent version,344 // so mark it to be deleted.345 //346 objectsToDelete.add(target);347 351 } else if (!target.isModified() && source.isModified()) { 348 352 // target not modified. We can assume that source is the most recent version. 349 353 // clone it into target. 350 target.mergeFrom(source); 351 objectsWithChildrenToMerge.add(source.getPrimitiveId()); 354 mergeFromSource = true; 352 355 } else if (!target.isModified() && !source.isModified() && target.getVersion() == source.getVersion()) { 353 356 // both not modified. Merge nevertheless. 354 357 // This helps when updating "empty" relations, see #4295 355 target.mergeFrom(source); 356 objectsWithChildrenToMerge.add(source.getPrimitiveId()); 358 mergeFromSource = true; 357 359 } else if (!target.isModified() && !source.isModified() && target.getVersion() < source.getVersion()) { 358 360 // my not modified but other is newer. clone other onto mine. 359 361 // 360 target.mergeFrom(source); 361 objectsWithChildrenToMerge.add(source.getPrimitiveId()); 362 mergeFromSource = true; 362 363 } else if (target.isModified() && !source.isModified() && target.getVersion() == source.getVersion()) { 363 364 // target is same as source but target is modified 364 365 // => keep target and reset modified flag if target and source are semantically equal … … 380 381 // technical attributes like timestamp or user information. Semantic 381 382 // attributes should already be equal if we get here. 382 383 // 384 mergeFromSource = true; 385 } 386 if (mergeFromSource) { 383 387 target.mergeFrom(source); 384 388 objectsWithChildrenToMerge.add(source.getPrimitiveId()); 385 389 }
