Ignore:
Timestamp:
2024-03-03T10:25:25+01:00 (16 months ago)
Author:
GerdP
Message:

fix #23521: fix some memory leaks

  • dispose dialogs
  • either avoid to create clones of ways or relations or use setNodes(null) / setMembers(null)
  • replaces most ChangeCommand instances by better specialized alternatives
  • add some comments
  • fix some checkstyle / sonar issues
File:
1 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/reltoolbox/src/relcontext/relationfix/BoundaryFixer.java

    r36103 r36217  
    44import static org.openstreetmap.josm.tools.I18n.tr;
    55
    6 import org.openstreetmap.josm.command.ChangeCommand;
     6import java.util.ArrayList;
     7import java.util.List;
     8
     9import org.openstreetmap.josm.command.ChangeMembersCommand;
    710import org.openstreetmap.josm.command.Command;
    811import org.openstreetmap.josm.data.osm.DataSet;
     
    3740    public boolean isRelationGood(Relation rel) {
    3841        for (RelationMember m : rel.getMembers()) {
    39             if (m.getType().equals(OsmPrimitiveType.RELATION) && !"subarea".equals(m.getRole())) {
     42            if (m.getType() == OsmPrimitiveType.RELATION && !"subarea".equals(m.getRole())) {
    4043                setWarningMessage(tr("Relation without ''subarea'' role found"));
    4144                return false;
    4245            }
    43             if (m.getType().equals(OsmPrimitiveType.NODE) && !("label".equals(m.getRole()) || "admin_centre".equals(m.getRole()))) {
     46            if (m.getType() == OsmPrimitiveType.NODE && !("label".equals(m.getRole()) || "admin_centre".equals(m.getRole()))) {
    4447                setWarningMessage(tr("Node without ''label'' or ''admin_centre'' role found"));
    4548                return false;
    4649            }
    47             if (m.getType().equals(OsmPrimitiveType.WAY) && !("outer".equals(m.getRole()) || "inner".equals(m.getRole()))) {
     50            if (m.getType() == OsmPrimitiveType.WAY && !("outer".equals(m.getRole()) || "inner".equals(m.getRole()))) {
    4851                setWarningMessage(tr("Way without ''inner'' or ''outer'' role found"));
    4952                return false;
     
    5659    @Override
    5760    public Command fixRelation(Relation rel) {
    58         Relation r = rel;
    59         Relation rr = fixMultipolygonRoles(r);
    60         boolean fixed = false;
    61         if (rr != null) {
    62             fixed = true;
    63             r = rr;
     61        List<RelationMember> members = fixMultipolygonRoles(rel.getMembers());
     62        if (members.isEmpty()) {
     63            members = rel.getMembers();
    6464        }
    65         rr = fixBoundaryRoles(r);
    66         if (rr != null) {
    67             fixed = true;
    68             r = rr;
    69         }
    70         if (fixed) {
     65        members = fixBoundaryRoles(members);
     66        if (!members.equals(rel.getMembers())) {
    7167            final DataSet ds = Utils.firstNonNull(rel.getDataSet(), MainApplication.getLayerManager().getEditDataSet());
    72             return new ChangeCommand(ds, rel, r);
     68            return new ChangeMembersCommand(ds, rel, members);
    7369        }
    7470        return null;
    7571    }
    7672
    77     private Relation fixBoundaryRoles(Relation source) {
    78         Relation r = new Relation(source);
    79         boolean fixed = false;
    80         for (int i = 0; i < r.getMembersCount(); i++) {
    81             RelationMember m = r.getMember(i);
     73    /**
     74     * Possibly change roles of non-way members.
     75     * @param origMembers original list of relation members
     76     * @return either the original and unmodified list or a new one with at least one new item
     77     */
     78    private static List<RelationMember> fixBoundaryRoles(List<RelationMember> origMembers) {
     79        List<RelationMember> members = origMembers;
     80        for (int i = 0; i < members.size(); i++) {
     81            RelationMember m = members.get(i);
    8282            String role = null;
    8383            if (m.isRelation()) {
    8484                role = "subarea";
    85             } else if (m.isNode()) {
     85            } else if (m.isNode() && !m.getMember().isIncomplete()) {
    8686                Node n = (Node) m.getMember();
    87                 if (!n.isIncomplete()) {
    88                     if (n.hasKey("place")) {
    89                         String place = n.get("place");
    90                         if (place.equals("state") || place.equals("country") ||
    91                                 place.equals("county") || place.equals("region")) {
    92                             role = "label";
    93                         } else {
    94                             role = "admin_centre";
    95                         }
     87                if (n.hasKey("place")) {
     88                    String place = n.get("place");
     89                    if ("state".equals(place) || "country".equals(place) ||
     90                            "county".equals(place) || "region".equals(place)) {
     91                        role = "label";
    9692                    } else {
    97                         role = "label";
     93                        role = "admin_centre";
    9894                    }
     95                } else {
     96                    role = "label";
    9997                }
    10098            }
    10199            if (role != null && !role.equals(m.getRole())) {
    102                 r.setMember(i, new RelationMember(role, m.getMember()));
    103                 fixed = true;
     100                if (members == origMembers) {
     101                    members = new ArrayList<>(origMembers); // don't modify original list
     102                }
     103                members.set(i, new RelationMember(role, m.getMember()));
    104104            }
    105105        }
    106         return fixed ? r : null;
     106        return members;
    107107    }
    108108}
Note: See TracChangeset for help on using the changeset viewer.