- Timestamp:
- 2020-11-23T20:45:59+01:00 (4 years ago)
- Location:
- trunk/src/org/openstreetmap/josm
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/actions/relation/DownloadMembersAction.java
r14397 r17341 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 /** … … 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 } -
trunk/src/org/openstreetmap/josm/data/osm/DataSetMerger.java
r17136 r17341 302 302 return true; 303 303 304 if (target.isIncomplete() && !source.isIncomplete()) { 305 // target is incomplete, source completes it 306 // => merge source into target 307 // 308 target.mergeFrom(source); 309 objectsWithChildrenToMerge.add(source.getPrimitiveId()); 310 } else if (!target.isIncomplete() && source.isIncomplete()) { 311 // target is complete and source is incomplete 312 // => keep target, it has more information already 313 // 314 } else if (target.isIncomplete() && source.isIncomplete()) { 315 // target and source are incomplete. Doesn't matter which one to 316 // take. We take target. 317 // 318 } else if (!target.isModified() && !source.isModified() && target.isVisible() != source.isVisible() 319 && target.getVersion() == source.getVersion()) { 304 boolean mergeFromSource = false; 305 boolean haveSameVersion = target.getVersion() == source.getVersion(); 306 307 if (haveSameVersion && !target.isModified() && !source.isModified() 308 && target.isVisible() != source.isVisible()) { 320 309 // Same version, but different "visible" attribute and neither of them are modified. 321 310 // It indicates a serious problem in datasets. … … 324 313 throw new DataIntegrityProblemException(tr("Conflict in ''visible'' attribute for object of type {0} with id {1}", 325 314 target.getType(), target.getId())); 326 } else if (target.isDeleted() && !source.isDeleted() && target.getVersion() == source.getVersion()) { 315 } 316 317 if (!target.isModified() && source.isDeleted()) { 318 // target not modified and source is deleted 319 // So mark it to be deleted. See #20091 320 // 321 objectsToDelete.add(target); 322 } else if (source.isIncomplete()) { 323 // source is incomplete. Nothing to do. 324 // 325 } else if (target.isIncomplete()) { 326 // target is incomplete, source completes it 327 // => merge source into target 328 // 329 mergeFromSource = true; 330 } else if (target.isDeleted() && source.isDeleted() && !haveSameVersion) { 331 // both deleted. Source is newer. Take source. See #19783 332 mergeFromSource = true; 333 } else if (target.isDeleted() && !source.isDeleted() && haveSameVersion) { 327 334 // same version, but target is deleted. Assume target takes precedence 328 335 // otherwise too many conflicts when refreshing from the server … … 340 347 } 341 348 } 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 349 } else if (!target.isModified() && source.isModified()) { 348 350 // target not modified. We can assume that source is the most recent version. 349 351 // clone it into target. 350 target.mergeFrom(source); 351 objectsWithChildrenToMerge.add(source.getPrimitiveId()); 352 } else if (!target.isModified() && !source.isModified() && target.getVersion() == source.getVersion()) { 353 // both not modified. Merge nevertheless. 352 mergeFromSource = true; 353 } else if (!target.isModified() && !source.isModified()) { 354 // both not modified. Merge nevertheless, even if versions are the same 354 355 // This helps when updating "empty" relations, see #4295 355 target.mergeFrom(source); 356 objectsWithChildrenToMerge.add(source.getPrimitiveId()); 357 } else if (!target.isModified() && !source.isModified() && target.getVersion() < source.getVersion()) { 358 // my not modified but other is newer. clone other onto mine. 359 // 360 target.mergeFrom(source); 361 objectsWithChildrenToMerge.add(source.getPrimitiveId()); 362 } else if (target.isModified() && !source.isModified() && target.getVersion() == source.getVersion()) { 356 mergeFromSource = true; 357 } else if (target.isModified() && !source.isModified() && haveSameVersion) { 363 358 // target is same as source but target is modified 364 359 // => keep target and reset modified flag if target and source are semantically equal … … 368 363 } else if (source.isDeleted() != target.isDeleted()) { 369 364 // target is modified and deleted state differs. 370 // this ha veto be resolved manually.365 // this has to be resolved manually. 371 366 // 372 367 addConflict(target, source); … … 381 376 // attributes should already be equal if we get here. 382 377 // 378 mergeFromSource = true; 379 } 380 if (mergeFromSource) { 383 381 target.mergeFrom(source); 384 382 objectsWithChildrenToMerge.add(source.getPrimitiveId());
Note:
See TracChangeset
for help on using the changeset viewer.