Changeset 17358 in josm for trunk/src/org/openstreetmap/josm/command
- Timestamp:
- 2020-11-25T11:50:22+01:00 (4 years ago)
- Location:
- trunk/src/org/openstreetmap/josm/command
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/command/ChangePropertyCommand.java
r16800 r17358 8 8 import java.util.Collection; 9 9 import java.util.Collections; 10 import java.util.HashMap; 10 11 import java.util.LinkedList; 11 12 import java.util.List; 12 13 import java.util.Map; 14 import java.util.Map.Entry; 13 15 import java.util.NoSuchElementException; 14 16 import java.util.Objects; … … 21 23 import org.openstreetmap.josm.data.osm.OsmPrimitive; 22 24 import org.openstreetmap.josm.data.osm.OsmPrimitiveType; 25 import org.openstreetmap.josm.data.osm.Tagged; 23 26 import org.openstreetmap.josm.tools.I18n; 24 27 import org.openstreetmap.josm.tools.ImageProvider; … … 73 76 * @param ds The target data set. Must not be {@code null} 74 77 * @param objects the objects to modify. Must not be empty 75 * @param tags the tags to set 78 * @param tags the tags to set. Caller must make sure that the tas are not changed once the command was executed. 76 79 * @since 12726 77 80 */ … … 86 89 * 87 90 * @param objects the objects to modify. Must not be empty, and objects must belong to a data set 88 * @param tags the tags to set 91 * @param tags the tags to set. Caller must make sure that the tas are not changed once the command was executed. 89 92 * @throws NullPointerException if objects is null or contain null item 90 93 * @throws NoSuchElementException if objects is empty … … 287 290 Objects.equals(tags, that.tags); 288 291 } 292 293 /** 294 * Calculate the {@link ChangePropertyCommand} that is needed to change the tags in source to be equal to those in target. 295 * @param source the source primitive 296 * @param target the target primitive 297 * @return null if no changes are needed, else a {@link ChangePropertyCommand} 298 * @since 17357 299 */ 300 public static Command build(OsmPrimitive source, Tagged target) { 301 Map<String, String> changedTags = new HashMap<>(); 302 // find tags which have to be changed or removed 303 for (Entry<String, String> tag : source.getKeys().entrySet()) { 304 String key = tag.getKey(); 305 String val = target.get(key); 306 if (!tag.getValue().equals(val)) 307 changedTags.put(key, val); // null or a different value 308 } 309 // find tags which exist only in target, they have to be added 310 for (Entry<String, String> tag : target.getKeys().entrySet()) { 311 String key = tag.getKey(); 312 if (!source.hasTag(key)) 313 changedTags.put(key, tag.getValue()); 314 } 315 if (changedTags.isEmpty()) 316 return null; 317 if (changedTags.size() == 1) { 318 Entry<String, String> tag = changedTags.entrySet().iterator().next(); 319 return new ChangePropertyCommand(Collections.singleton(source), tag.getKey(), tag.getValue()); 320 } 321 return new ChangePropertyCommand(Collections.singleton(source), new HashMap<>(changedTags)); 322 } 289 323 } -
trunk/src/org/openstreetmap/josm/command/SplitWayCommand.java
r17163 r17358 17 17 import java.util.HashSet; 18 18 import java.util.Iterator; 19 import java.util.LinkedHashSet; 19 20 import java.util.LinkedList; 20 21 import java.util.List; … … 90 91 * @param newSelection The new list of selected primitives ids (which is saved for later retrieval with {@link #getNewSelection}) 91 92 * @param originalWay The original way being split (which is saved for later retrieval with {@link #getOriginalWay}) 92 * @param newWays The resulting new ways (which is saved for later retrieval with {@link #get OriginalWay})93 * @param newWays The resulting new ways (which is saved for later retrieval with {@link #getNewWays}) 93 94 */ 94 95 public SplitWayCommand(String name, Collection<Command> commandList, … … 402 403 } catch (OsmTransferException e) { 403 404 ExceptionDialogUtil.explainException(e); 405 analysis.cleanup(); 404 406 return Optional.empty(); 405 407 } 406 408 // If missing relation members were downloaded, perform the analysis again to find the relation 407 409 // member order for all relations. 410 analysis.cleanup(); 408 411 analysis = analyseSplit(way, wayToKeep, newWays); 409 return Optional.of(splitBasedOnAnalyses(way, newWays, newSelection, analysis, indexOfWayToKeep));412 break; 410 413 case GO_AHEAD_WITHOUT_DOWNLOADS: 411 414 // Proceed with the split with the information we have. 412 415 // This can mean that there are no missing members we want, or that the user chooses to continue 413 416 // the split without downloading them. 414 return Optional.of(splitBasedOnAnalyses(way, newWays, newSelection, analysis, indexOfWayToKeep));417 break; 415 418 case USER_ABORTED: 416 419 default: 417 420 return Optional.empty(); 421 } 422 try { 423 return Optional.of(splitBasedOnAnalyses(way, newWays, newSelection, analysis, indexOfWayToKeep)); 424 } finally { 425 // see #19885 426 wayToKeep.setNodes(null); 427 analysis.cleanup(); 418 428 } 419 429 } … … 465 475 } 466 476 if (c == null) { 467 c = new Relation(r); 477 c = new Relation(r); // #19885: will be removed later 468 478 } 469 479 … … 552 562 } 553 563 } 554 555 if (c != null) {556 commandList.add(new ChangeCommand(r.getDataSet(), r, c));557 }558 564 } 559 565 changedWay.setNodes(null); // see #19885 … … 575 581 warningTypes = warnings; 576 582 this.numberOfRelations = numberOfRelations; 583 } 584 585 /** 586 * Unlink temporary copies of relations. See #19885 587 */ 588 void cleanup() { 589 for (RelationAnalysis ra : relationAnalyses) { 590 if (ra.relation.getDataSet() == null) 591 ra.relation.setMembers(null); 592 } 577 593 } 578 594 … … 688 704 } 689 705 706 Set<Relation> modifiedRelations = new LinkedHashSet<>(); 690 707 // Perform the split. 691 708 for (RelationAnalysis relationAnalysis : analysis.getRelationAnalyses()) { … … 729 746 } 730 747 } 748 modifiedRelations.add(relation); 749 } 750 for (Relation r : modifiedRelations) { 751 DataSet ds = way.getDataSet(); 752 Relation orig = (Relation) ds.getPrimitiveById(r); 753 analysis.getCommands().add(new ChangeMembersCommand(orig, new ArrayList<>(r.getMembers()))); 754 r.setMembers(null); // see #19885 731 755 } 732 756
Note:
See TracChangeset
for help on using the changeset viewer.