Changeset 16317 in josm for trunk/src/org/openstreetmap


Ignore:
Timestamp:
2020-04-17T07:11:26+02:00 (4 years ago)
Author:
GerdP
Message:

fix #19104: Unglue node may remove way members from relations

  • fix and simplify update of relations
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/actions/UnGlueAction.java

    r16303 r16317  
    1111import java.util.Collection;
    1212import java.util.Collections;
    13 import java.util.HashMap;
    1413import java.util.HashSet;
    1514import java.util.LinkedList;
    1615import java.util.List;
    17 import java.util.Map;
    1816import java.util.Set;
    1917import java.util.stream.Collectors;
     
    397395                continue;
    398396            }
    399             Relation newRel = null;
    400             Map<String, Integer> rolesToReAdd = null; // <role name, index>
    401             int i = 0;
    402             for (RelationMember rm : r.getMembers()) {
    403                 if (rm.isNode() && rm.getMember() == originalNode) {
    404                     if (newRel == null) {
    405                         newRel = new Relation(r);
    406                         rolesToReAdd = new HashMap<>();
    407                     }
    408                     if (rolesToReAdd != null) {
    409                         rolesToReAdd.put(rm.getRole(), i);
    410                     }
    411                 }
    412                 i++;
    413             }
    414             if (newRel != null) {
    415                 if (rolesToReAdd != null) {
    416                     for (Map.Entry<String, Integer> role : rolesToReAdd.entrySet()) {
    417                         for (Node n : newNodes) {
    418                             newRel.addMember(role.getValue() + 1, new RelationMember(role.getKey(), n));
    419                         }
    420                         if (ExistingBothNew.NEW == memberships) {
    421                             // remove old member
    422                             newRel.removeMember(role.getValue());
    423                         }
    424                     }
    425                 }
     397            Relation newRel = new Relation(r);
     398            // loop backwards because we add or remove members, works also when nodes appear
     399            // multiple times in the same relation
     400            boolean changed = false;
     401            for (int i = r.getMembersCount() - 1; i >= 0; i--) {
     402                RelationMember rm = r.getMember(i);
     403                if (rm.getMember() != originalNode)
     404                    continue;
     405                for (Node n : newNodes) {
     406                    newRel.addMember(i + 1, new RelationMember(rm.getRole(), n));
     407                }
     408                if (ExistingBothNew.NEW == memberships) {
     409                    // remove old member
     410                    newRel.removeMember(i);
     411                }
     412                changed = true;
     413            }
     414            if (changed) {
    426415                cmds.add(new ChangeCommand(r, newRel));
    427416            }
Note: See TracChangeset for help on using the changeset viewer.