Changeset 19446 in josm


Ignore:
Timestamp:
2025-11-13T08:25:40+01:00 (6 weeks ago)
Author:
GerdP
Message:

fix #24485: DataIntegrityProblemException: Primitive cannot be modified in read-only dataset

  • create copies of nodes before adding them to a temporary way. This should also fix a memory leak.
Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/tools/Geometry.java

    r19399 r19446  
    15631563        for (Pair<Node, Node> nodes : way.getNodePairs(false)) {
    15641564            Way tWay = new Way();
    1565             tWay.addNode(nodes.a);
    1566             tWay.addNode(nodes.b);
     1565            tWay.addNode(new Node(nodes.a));
     1566            tWay.addNode(new Node(nodes.b));
    15671567            double distance = getDistance(tWay, primitive);
    15681568            if (distance < lowestDistance) {
  • trunk/test/unit/org/openstreetmap/josm/tools/GeometryTest.java

    r19336 r19446  
    3737import org.openstreetmap.josm.data.osm.RelationMember;
    3838import org.openstreetmap.josm.data.osm.Way;
     39import org.openstreetmap.josm.data.osm.WaySegment;
    3940import org.openstreetmap.josm.data.osm.search.SearchCompiler;
    4041import org.openstreetmap.josm.data.projection.Projection;
     
    636637        assertTrue(new EastNorth(0, 0).equalsEpsilon(centroid3, 1e-9));
    637638    }
     639
     640    /**
     641     * A non-regression test for an issue found in #24485
     642     * Test of {@link Geometry#getClosestWaySegment} method when DataSet is read-only.
     643     */
     644    @Test
     645    void testNonRegression24485() {
     646        Node node1 = new Node(new LatLon(0, 0));
     647        Node node2 = new Node(new LatLon(0, 1));
     648        Node node3 = new Node(new LatLon(0.3, 0.5));
     649        Node node4 = new Node(new LatLon(0.1, 0));
     650        Way way1 = TestUtils.newWay("", node1, node2, node3, node4);
     651
     652        DataSet ds = new DataSet();
     653        way1.getNodes().forEach(n -> ds.addPrimitive(n));
     654        ds.addPrimitive(way1);
     655        ds.lock();
     656        WaySegment closestSegment = Geometry.getClosestWaySegment(way1, new Node(new LatLon(0, 0.5)));
     657        ds.unlock();
     658        Way closestSegmentWay = closestSegment.toWay();
     659        assertTrue(closestSegmentWay.containsNode(node1));
     660        assertTrue(closestSegmentWay.containsNode(node2));
     661    }
     662
    638663}
Note: See TracChangeset for help on using the changeset viewer.