Changeset 17241 in josm


Ignore:
Timestamp:
2020-10-19T11:35:13+02:00 (6 weeks ago)
Author:
GerdP
Message:

see #19885: memory leak with "temporary" objects in validator and actions

  • replace ChangeCommand by ChangePropertyCommand to avoid cloning primitives

Fixes another memory leak and simplifies code

File:
1 edited

Legend:

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

    r16628 r17241  
    2020import javax.swing.JScrollPane;
    2121
    22 import org.openstreetmap.josm.command.ChangeCommand;
     22import org.openstreetmap.josm.command.ChangePropertyCommand;
    2323import org.openstreetmap.josm.command.ChangeRelationMemberRoleCommand;
    2424import org.openstreetmap.josm.command.Command;
     
    2727import org.openstreetmap.josm.data.osm.DataSet;
    2828import org.openstreetmap.josm.data.osm.DefaultNameFormatter;
    29 import org.openstreetmap.josm.data.osm.Node;
    3029import org.openstreetmap.josm.data.osm.OsmPrimitive;
    31 import org.openstreetmap.josm.data.osm.Relation;
    32 import org.openstreetmap.josm.data.osm.Way;
    3330import org.openstreetmap.josm.gui.MainApplication;
    3431import org.openstreetmap.josm.gui.correction.RoleCorrectionTable;
     
    3835import org.openstreetmap.josm.tools.ImageProvider;
    3936import org.openstreetmap.josm.tools.UserCancelException;
     37import org.openstreetmap.josm.tools.Utils;
    4038
    4139/**
     
    164162                    OsmPrimitive primitive = entry.getKey();
    165163
    166                     // create the clone
    167                     OsmPrimitive clone;
    168                     if (primitive instanceof Way) {
    169                         clone = new Way((Way) primitive);
    170                     } else if (primitive instanceof Node) {
    171                         clone = new Node((Node) primitive);
    172                     } else if (primitive instanceof Relation) {
    173                         clone = new Relation((Relation) primitive);
    174                     } else
    175                         throw new AssertionError();
    176 
    177164                    // use this structure to remember keys that have been set already so that
    178165                    // they're not dropped by a later step
    179166                    Set<String> keysChanged = new HashSet<>();
    180167
    181                     // apply all changes to this clone
     168                    // the map for the change command
     169                    Map<String, String> tagMap = new HashMap<>();
     170
    182171                    List<TagCorrection> tagCorrections = entry.getValue();
    183172                    for (int i = 0; i < tagCorrections.size(); i++) {
     
    185174                            TagCorrection tagCorrection = tagCorrections.get(i);
    186175                            if (tagCorrection.isKeyChanged() && !keysChanged.contains(tagCorrection.oldKey)) {
    187                                 clone.remove(tagCorrection.oldKey);
     176                                tagMap.put(tagCorrection.oldKey, null);
    188177                            }
    189                             clone.put(tagCorrection.newKey, tagCorrection.newValue);
     178                            tagMap.put(tagCorrection.newKey, tagCorrection.newValue);
    190179                            keysChanged.add(tagCorrection.newKey);
    191180                        }
    192181                    }
    193182
    194                     // save the clone
    195183                    if (!keysChanged.isEmpty()) {
    196                         commands.add(new ChangeCommand(dataSet, primitive, clone));
     184                        // change the properties of this object
     185                        commands.add(new ChangePropertyCommand(dataSet, Collections.singleton(primitive),
     186                                Utils.toUnmodifiableMap(tagMap)));
    197187                    }
    198188                }
Note: See TracChangeset for help on using the changeset viewer.