Ignore:
Timestamp:
2024-03-03T10:25:25+01:00 (22 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/PublicTransportFixer.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;
     
    1114import org.openstreetmap.josm.data.osm.RelationMember;
    1215import org.openstreetmap.josm.gui.MainApplication;
     16import org.openstreetmap.josm.tools.Utils;
    1317
    14 import org.openstreetmap.josm.tools.Utils;
    1518import relcontext.actions.PublicTransportHelper;
    1619
     
    2629    }
    2730
    28     /*protected PublicTransportFixer(String...types) {
    29         super(types);
    30     }*/
    31 
    3231    @Override
    3332    public boolean isRelationGood(Relation rel) {
    3433        for (RelationMember m : rel.getMembers()) {
    35             if (m.getType().equals(OsmPrimitiveType.NODE)
     34            if (m.getType() == OsmPrimitiveType.NODE
    3635                    && !(m.getRole().startsWith(PublicTransportHelper.STOP) || m.getRole().startsWith(PublicTransportHelper.PLATFORM))) {
    3736                setWarningMessage(tr("Node without ''stop'' or ''platform'' role found"));
    3837                return false;
    3938            }
    40             if (m.getType().equals(OsmPrimitiveType.WAY)
     39            if (m.getType() == OsmPrimitiveType.WAY
    4140                    && PublicTransportHelper.isWayPlatform(m)
    4241                    && !m.getRole().startsWith(PublicTransportHelper.PLATFORM)) {
     
    4948    }
    5049
    51     /*@Override
    52     public boolean isFixerApplicable(Relation rel) {
    53         return true;
    54     }*/
    55 
    5650    @Override
    5751    public Command fixRelation(Relation rel) {
    58         Relation r = rel;
    59         Relation rr = fixStopPlatformRole(r);
    60         boolean fixed = false;
    61         if (rr != null) {
    62             fixed = true;
    63             r = rr;
    64         }
    65         if (fixed) {
     52        List<RelationMember> members = fixStopPlatformRole(rel.getMembers());
     53        if (!members.equals(rel.getMembers())) {
    6654            final DataSet ds = Utils.firstNonNull(rel.getDataSet(), MainApplication.getLayerManager().getEditDataSet());
    67             return new ChangeCommand(ds, rel, r);
     55            return new ChangeMembersCommand(ds, rel, rel.getMembers());
    6856        }
    6957        return null;
    7058    }
    7159
    72     private Relation fixStopPlatformRole(Relation source) {
    73         Relation r = new Relation(source);
    74         boolean fixed = false;
    75         for (int i = 0; i < r.getMembersCount(); i++) {
    76             RelationMember m = r.getMember(i);
     60    /**
     61     * Fix roles of members.
     62     * @param origMembers original list of relation members
     63     * @return either the original and unmodified list or a new one with at least one new item
     64     */
     65    private static List<RelationMember> fixStopPlatformRole(List<RelationMember> origMembers) {
     66        List<RelationMember> members = origMembers;
     67        for (int i = 0; i < members.size(); i++) {
     68            RelationMember m = members.get(i);
    7769            String role = PublicTransportHelper.getRoleByMember(m);
    7870
    7971            if (role != null && !m.getRole().startsWith(role)) {
    80                 r.setMember(i, new RelationMember(role, m.getMember()));
    81                 fixed = true;
     72                if (members == origMembers) {
     73                    members = new ArrayList<>(origMembers);
     74                }
     75                members.set(i, new RelationMember(role, m.getMember()));
    8276            }
    8377        }
    84         return fixed ? r : null;
     78        return members;
    8579    }
    8680}
Note: See TracChangeset for help on using the changeset viewer.