Changeset 17141 in josm


Ignore:
Timestamp:
2020-10-10T11:48:49+02:00 (2 weeks ago)
Author:
GerdP
Message:

see #19885: memory leak with "temporary" objects in validator and actions
next bunch of changes:

  • use ChangeNodesCommand instead of ChangeCommand
  • further simplifications
Location:
trunk/src/org/openstreetmap/josm
Files:
7 edited

Legend:

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

    r14134 r17141  
    1212
    1313import org.openstreetmap.josm.actions.mapmode.DrawAction;
    14 import org.openstreetmap.josm.command.ChangeCommand;
     14import org.openstreetmap.josm.command.ChangeNodesCommand;
    1515import org.openstreetmap.josm.command.SelectCommand;
    1616import org.openstreetmap.josm.command.SequenceCommand;
     
    109109        }
    110110        if (newPoint != null) {
    111             Way newFollower = new Way(follower);
     111            List<Node> modNodes = follower.getNodes();
    112112            if (reversed) {
    113                 newFollower.addNode(0, newPoint);
     113                modNodes.add(0, newPoint);
    114114            } else {
    115                 newFollower.addNode(newPoint);
     115                modNodes.add(newPoint);
    116116            }
     117            boolean isClosed = modNodes.size() >= 3 && modNodes.get(modNodes.size()-1) == modNodes.get(0);
    117118            UndoRedoHandler.getInstance().add(new SequenceCommand(tr("Follow line"),
    118                     new ChangeCommand(ds, follower, newFollower),
    119                     new SelectCommand(ds, newFollower.isClosed() // see #10028 - unselect last node when closing a way
     119                    new ChangeNodesCommand(ds, follower, modNodes),
     120                    new SelectCommand(ds, isClosed // see #10028 - unselect last node when closing a way
    120121                            ? Arrays.<OsmPrimitive>asList(follower)
    121122                            : Arrays.<OsmPrimitive>asList(follower, newPoint)
  • trunk/src/org/openstreetmap/josm/actions/JoinAreasAction.java

    r16365 r17141  
    2727import org.openstreetmap.josm.command.AddCommand;
    2828import org.openstreetmap.josm.command.ChangeCommand;
     29import org.openstreetmap.josm.command.ChangeNodesCommand;
    2930import org.openstreetmap.josm.command.Command;
    3031import org.openstreetmap.josm.command.DeleteCommand;
     
    793794            discardedWays.remove(oldest);
    794795            discardedWays.add(way);
    795             Way copy = new Way(oldest);
    796             copy.setNodes(way.getNodes());
    797             cmds.add(new ChangeCommand(oldest, copy));
     796            cmds.add(new ChangeNodesCommand(oldest, way.getNodes()));
    798797            return oldest;
    799798        }
     
    875874                }
    876875
    877                 Way newWay = new Way(way);
    878                 newWay.setNodes(newNodes);
    879                 cmds.add(new ChangeCommand(way, newWay));
     876                cmds.add(new ChangeNodesCommand(way, newNodes));
    880877                ++totalWaysModified;
    881878            }
  • trunk/src/org/openstreetmap/josm/actions/JoinNodeWayAction.java

    r16202 r17141  
    2323import javax.swing.JOptionPane;
    2424
    25 import org.openstreetmap.josm.command.ChangeCommand;
     25import org.openstreetmap.josm.command.ChangeNodesCommand;
    2626import org.openstreetmap.josm.command.Command;
    2727import org.openstreetmap.josm.command.MoveCommand;
     
    192192                wayNodes.addAll(segmentIndex + 1, nodesToAdd);
    193193            }
    194             Way wnew = new Way(w);
    195             wnew.setNodes(wayNodes);
    196             cmds.add(new ChangeCommand(ds, w, wnew));
     194            cmds.add(new ChangeNodesCommand(ds, w, wayNodes));
    197195        }
    198196
  • trunk/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java

    r16438 r17141  
    3131import org.openstreetmap.josm.actions.MergeNodesAction;
    3232import org.openstreetmap.josm.command.AddCommand;
    33 import org.openstreetmap.josm.command.ChangeCommand;
     33import org.openstreetmap.josm.command.ChangeNodesCommand;
    3434import org.openstreetmap.josm.command.Command;
    3535import org.openstreetmap.josm.command.MoveCommand;
     
    586586            EastNorth b = ws.getSecondNode().getEastNorth();
    587587            n.setEastNorth(Geometry.closestPointToSegment(a, b, n.getEastNorth()));
    588             Way wnew = new Way(ws.way);
    589             wnew.addNode(ws.lowerIndex+1, n);
     588            List<Node> modnodes = ws.way.getNodes();
     589            modnodes.add(ws.lowerIndex+1, n);
    590590            DataSet ds = ws.way.getDataSet();
    591591            UndoRedoHandler.getInstance().add(new SequenceCommand(tr("Add a new node to an existing way"),
    592                     new AddCommand(ds, n), new ChangeCommand(ds, ws.way, wnew)));
     592                    new AddCommand(ds, n), new ChangeNodesCommand(ds, ws.way, modnodes)));
    593593        }
    594594    }
     
    634634        // create extrusion
    635635        Collection<Command> cmds = new LinkedList<>();
    636         Way wnew = new Way(selectedSegment.way);
     636        List<Node> modNodes = selectedSegment.way.getNodes();
    637637        boolean wayWasModified = false;
    638         boolean wayWasSingleSegment = wnew.getNodesCount() == 2;
     638        boolean wayWasSingleSegment = modNodes.size() == 2;
    639639        int insertionPoint = selectedSegment.lowerIndex + 1;
    640640
     
    656656            Node n1Old = selectedSegment.getFirstNode();
    657657            Node n1New = new Node(ProjectionRegistry.getProjection().eastNorth2latlon(newN1en));
    658             wnew.addNode(insertionPoint, n1New);
    659             wnew.removeNode(n1Old);
     658            modNodes.add(insertionPoint, n1New);
     659            modNodes.remove(n1Old);
    660660            wayWasModified = true;
    661661            cmds.add(new AddCommand(ds, n1New));
     
    664664            //introduce new node
    665665            Node n1New = new Node(ProjectionRegistry.getProjection().eastNorth2latlon(newN1en));
    666             wnew.addNode(insertionPoint, n1New);
     666            modNodes.add(insertionPoint, n1New);
    667667            wayWasModified = true;
    668668            insertionPoint++;
     
    686686            Node n2Old = selectedSegment.getSecondNode();
    687687            Node n2New = new Node(ProjectionRegistry.getProjection().eastNorth2latlon(newN2en));
    688             wnew.addNode(insertionPoint, n2New);
    689             wnew.removeNode(n2Old);
     688            modNodes.add(insertionPoint, n2New);
     689            modNodes.remove(n2Old);
    690690            wayWasModified = true;
    691691            cmds.add(new AddCommand(ds, n2New));
     
    694694            //introduce new node
    695695            Node n2New = new Node(ProjectionRegistry.getProjection().eastNorth2latlon(newN2en));
    696             wnew.addNode(insertionPoint, n2New);
     696            modNodes.add(insertionPoint, n2New);
    697697            wayWasModified = true;
    698698            cmds.add(new AddCommand(ds, n2New));
     
    702702        //the way was a single segment, close the way
    703703        if (wayWasSingleSegment) {
    704             wnew.addNode(selectedSegment.getFirstNode());
     704            modNodes.add(modNodes.get(0));
    705705            wayWasModified = true;
    706706        }
    707707        if (wayWasModified) {
    708708            // we only need to change the way if its node list was really modified
    709             cmds.add(new ChangeCommand(selectedSegment.way, wnew));
     709            cmds.add(new ChangeNodesCommand(selectedSegment.way, modNodes));
    710710        }
    711711        Command c = new SequenceCommand(tr("Extrude Way"), cmds);
  • trunk/src/org/openstreetmap/josm/actions/mapmode/ImproveWayAccuracyAction.java

    r17110 r17141  
    2424
    2525import org.openstreetmap.josm.command.AddCommand;
    26 import org.openstreetmap.josm.command.ChangeCommand;
     26import org.openstreetmap.josm.command.ChangeNodesCommand;
    2727import org.openstreetmap.josm.command.Command;
    2828import org.openstreetmap.josm.command.DeleteCommand;
     
    461461                for (WaySegment virtualSegment : virtualSegments) {
    462462                    Way w = virtualSegment.way;
    463                     Way wnew = new Way(w);
    464                     wnew.addNode(virtualSegment.lowerIndex + 1, virtualNode);
    465                     virtualCmds.add(new ChangeCommand(w, wnew));
     463                    List<Node> modNodes = w.getNodes();
     464                    modNodes.add(virtualSegment.lowerIndex + 1, virtualNode);
     465                    virtualCmds.add(new ChangeNodesCommand(w, modNodes));
    466466                }
    467467
     
    481481                if (referrersCount != 1 || referrerWayCount != 1) {
    482482                    // detach node from way
    483                     final Way newWay = new Way(targetWay);
    484                     final List<Node> nodes = newWay.getNodes();
     483                    final List<Node> nodes = targetWay.getNodes();
    485484                    nodes.remove(candidateNode);
    486                     newWay.setNodes(nodes);
    487485                    if (nodes.size() < 2) {
    488486                        final Command deleteCmd = DeleteCommand.delete(Collections.singleton(targetWay), true);
     
    490488                            UndoRedoHandler.getInstance().add(deleteCmd);
    491489                        }
    492                         newWay.setNodes(null);
    493490                    } else {
    494                         UndoRedoHandler.getInstance().add(new ChangeCommand(targetWay, newWay));
     491                        UndoRedoHandler.getInstance().add(new ChangeNodesCommand(targetWay, nodes));
    495492                    }
    496493                } else if (candidateNode.isTagged()) {
  • trunk/src/org/openstreetmap/josm/data/validation/tests/DuplicatedWayNodes.java

    r11129 r17141  
    44import static org.openstreetmap.josm.tools.I18n.tr;
    55
     6import java.util.ArrayList;
    67import java.util.Collections;
    78import java.util.Iterator;
     9import java.util.List;
    810
    9 import org.openstreetmap.josm.command.ChangeCommand;
     11import org.openstreetmap.josm.command.ChangeNodesCommand;
    1012import org.openstreetmap.josm.command.Command;
    1113import org.openstreetmap.josm.data.osm.Node;
     
    5961        if (it.hasNext()) {
    6062            Way w = (Way) it.next();
    61             Way wnew = new Way(w);
    62             wnew.setNodes(null);
    6363            Node lastN = null;
     64            List<Node> modNodes = new ArrayList<>();
    6465            for (Node n : w.getNodes()) {
    65                 if (lastN == null) {
    66                     wnew.addNode(n);
    67                 } else if (n == lastN) {
    68                     // Skip this node
    69                 } else {
    70                     wnew.addNode(n);
     66                if (n != lastN) {
     67                    modNodes.add(n);
    7168                }
    7269                lastN = n;
    7370            }
    74             if (wnew.getNodesCount() < 2)
     71            if (modNodes.size() < 2)
    7572                // Empty way, delete
    7673                return deletePrimitivesIfNeeded(Collections.singleton(w));
    7774            else
    78                 return new ChangeCommand(w, wnew);
     75                return new ChangeNodesCommand(w, modNodes);
    7976        }
    8077        return null;
  • trunk/src/org/openstreetmap/josm/tools/Geometry.java

    r16436 r17141  
    2222
    2323import org.openstreetmap.josm.command.AddCommand;
    24 import org.openstreetmap.josm.command.ChangeCommand;
     24import org.openstreetmap.josm.command.ChangeNodesCommand;
    2525import org.openstreetmap.josm.command.Command;
    2626import org.openstreetmap.josm.data.coor.EastNorth;
     
    231231
    232232        for (int pos = 0; pos < ways.size(); pos++) {
    233             if (!changedWays[pos]) {
    234                 continue;
    235             }
    236 
    237             Way way = ways.get(pos);
    238             Way newWay = new Way(way);
    239             newWay.setNodes(newNodes[pos]);
    240 
    241             cmds.add(new ChangeCommand(dataset, way, newWay));
     233            if (changedWays[pos]) {
     234                cmds.add(new ChangeNodesCommand(dataset, ways.get(pos), newNodes[pos]));
     235            }
    242236        }
    243237
Note: See TracChangeset for help on using the changeset viewer.