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/actions/ReconstructRouteAction.java

    r36102 r36217  
    1313import javax.swing.AbstractAction;
    1414
    15 import org.openstreetmap.josm.command.ChangeCommand;
    16 import org.openstreetmap.josm.command.Command;
     15import org.openstreetmap.josm.command.ChangeMembersCommand;
    1716import org.openstreetmap.josm.data.UndoRedoHandler;
    1817import org.openstreetmap.josm.data.coor.EastNorth;
     
    3534 */
    3635public class ReconstructRouteAction extends AbstractAction implements ChosenRelationListener {
    37     private final ChosenRelation rel;
    38 
     36    private final transient ChosenRelation rel;
     37
     38    /**
     39     * Reconstruct route relation to scheme of public_transport.
     40     * @param rel chosen relation
     41     */
    3942    public ReconstructRouteAction(ChosenRelation rel) {
    4043        super(tr("Reconstruct route"));
     
    4952    public void actionPerformed(ActionEvent e) {
    5053        Relation r = rel.get();
    51         Relation recRel = new Relation(r);
    52         recRel.removeMembersFor(recRel.getMemberPrimitives());
     54        List<RelationMember> recMembers = new ArrayList<>();
    5355
    5456        Map<OsmPrimitive, RelationMember> stopMembers = new LinkedHashMap<>();
     
    118120                    nIndex += increment) {
    119121                Node refNode = w.getNode(nIndex);
    120                 if (PublicTransportHelper.isNodeStop(refNode)) {
    121                     if (stopMembers.containsKey(refNode)) {
    122                         recRel.addMember(stopMembers.get(refNode));
    123                         stopMembers.remove(refNode);
    124                         String stopName = PublicTransportHelper.getNameViaStoparea(refNode);
    125                         if (stopName == null) {
    126                             stopName = "";
     122                if (!(PublicTransportHelper.isNodeStop(refNode) && stopMembers.containsKey(refNode)))
     123                    continue;
     124                recMembers.add(stopMembers.get(refNode));
     125                stopMembers.remove(refNode);
     126                String stopName = PublicTransportHelper.getNameViaStoparea(refNode);
     127                if (stopName == null) {
     128                    stopName = "";
     129                }
     130                boolean existsPlatform = platformMembers.containsKey(stopName);
     131                if (!existsPlatform) {
     132                    stopName = ""; // find of the nameless
     133                }
     134                if (existsPlatform || platformMembers.containsKey(stopName)) {
     135                    List<RelationMember> lMember = platformMembers.get(stopName);
     136                    if (lMember.size() == 1) {
     137                        recMembers.add(lMember.get(0));
     138                        lMember.remove(0);
     139                    } else {
     140                        // choose closest
     141                        RelationMember candidat = getClosestPlatform(lMember, refNode);
     142                        if (candidat != null) {
     143                            recMembers.add(candidat);
     144                            lMember.remove(candidat);
    127145                        }
    128                         boolean existsPlatform = platformMembers.containsKey(stopName);
    129                         if (!existsPlatform) {
    130                             stopName = ""; // find of the nameless
    131                         }
    132                         if (existsPlatform || platformMembers.containsKey(stopName)) {
    133                             List<RelationMember> lMember = platformMembers.get(stopName);
    134                             if (lMember.size() == 1) {
    135                                 recRel.addMember(lMember.get(0));
    136                                 lMember.remove(0);
    137                             } else {
    138                                 // choose closest
    139                                 RelationMember candidat = getClosestPlatform(lMember, refNode);
    140                                 if (candidat != null) {
    141                                     recRel.addMember(candidat);
    142                                     lMember.remove(candidat);
    143                                 }
    144                             }
    145                             if (lMember.isEmpty()) {
    146                                 platformMembers.remove(stopName);
    147                             }
    148                         }
     146                    }
     147                    if (lMember.isEmpty()) {
     148                        platformMembers.remove(stopName);
    149149                    }
    150150                }
     
    153153
    154154        for (RelationMember stop : stopMembers.values()) {
    155             recRel.addMember(stop);
     155            recMembers.add(stop);
    156156            String stopName = PublicTransportHelper.getNameViaStoparea(stop);
    157157            boolean existsPlatform = platformMembers.containsKey(stopName);
     
    162162                List<RelationMember> lMember = platformMembers.get(stopName);
    163163                if (lMember.size() == 1) {
    164                     recRel.addMember(lMember.get(0));
     164                    recMembers.add(lMember.get(0));
    165165                    lMember.remove(0);
    166166                } else {
     
    168168                    RelationMember candidat = getClosestPlatform(lMember, stop.getNode());
    169169                    if (candidat != null) {
    170                         recRel.addMember(candidat);
     170                        recMembers.add(candidat);
    171171                        lMember.remove(candidat);
    172172                    }
     
    180180        for (List<RelationMember> lPlatforms : platformMembers.values()) {
    181181            for (RelationMember platform : lPlatforms) {
    182                 recRel.addMember(platform);
     182                recMembers.add(platform);
    183183            }
    184184        }
    185185
    186186        for (RelationMember route : routeMembers) {
    187             recRel.addMember(route);
     187            recMembers.add(route);
    188188        }
    189189        for (RelationMember wtf : wtfMembers) {
    190             recRel.addMember(wtf);
    191         }
    192         Command command = new ChangeCommand(r, recRel);
    193         UndoRedoHandler.getInstance().add(command);
     190            recMembers.add(wtf);
     191        }
     192        UndoRedoHandler.getInstance().add(new ChangeMembersCommand(r, recMembers));
    194193    }
    195194
    196195    private static final double maxSqrDistBetweenStopAndPlatform = 2000; // ~ 26m
    197     private RelationMember getClosestPlatform(List<RelationMember> members, Node stop) {
     196   
     197    private static RelationMember getClosestPlatform(List<RelationMember> members, Node stop) {
    198198        if (stop == null || members.isEmpty()) return null;
    199199        double maxDist = maxSqrDistBetweenStopAndPlatform;
     
    229229    }
    230230
    231     private boolean isSuitableRelation(Relation newRelation) {
     231    private static boolean isSuitableRelation(Relation newRelation) {
    232232        return !(newRelation == null || !"route".equals(newRelation.get("type")) || newRelation.getMembersCount() == 0);
    233233    }
Note: See TracChangeset for help on using the changeset viewer.