Ticket #17810: 17810.patch
| File 17810.patch, 5.4 KB (added by , 7 years ago) |
|---|
-
src/org/openstreetmap/josm/command/SplitWayCommand.java
42 42 43 43 private static volatile Consumer<String> warningNotifier = Logging::warn; 44 44 45 private static final class RelationInformation { 46 Boolean warnme = false; 47 Boolean insert = false; 48 Relation relation; 49 } 50 45 51 /** 46 52 * Sets the global warning notifier. 47 53 * @param notifier warning notifier in charge of displaying warning message, if any. Must not be null … … 319 325 if (rm.isWay() && rm.getMember() == way) { 320 326 boolean insert = true; 321 327 if (relationSpecialTypes.containsKey(type) && "restriction".equals(relationSpecialTypes.get(type))) { 322 Map<String, Boolean> rValue = treatAsRestriction(r, rm, c, newWays, way, changedWay); 323 warnme = rValue.containsKey("warnme") ? rValue.get("warnme") : warnme; 324 insert = rValue.containsKey("insert") ? rValue.get("insert") : insert; 328 RelationInformation rValue = treatAsRestriction(r, rm, c, newWays, way, changedWay); 329 warnme = rValue.warnme; 330 insert = rValue.insert; 331 c = rValue.relation; 325 332 } else if (!("route".equals(type)) && !("multipolygon".equals(type))) { 326 333 warnme = true; 327 334 } … … 409 416 ); 410 417 } 411 418 412 private static Map<String, Boolean>treatAsRestriction(Relation r,419 private static RelationInformation treatAsRestriction(Relation r, 413 420 RelationMember rm, Relation c, Collection<Way> newWays, Way way, 414 421 Way changedWay) { 415 HashMap<String, Boolean> rMap = new HashMap<>();422 RelationInformation relationInformation = new RelationInformation(); 416 423 /* this code assumes the restriction is correct. No real error checking done */ 417 424 String role = rm.getRole(); 418 425 String type = Optional.ofNullable(r.get("type")).orElse(""); … … 447 454 } 448 455 c.addMember(new RelationMember(role, res)); 449 456 c.removeMembersFor(way); 450 r Map.put("insert", false);457 relationInformation.insert = false; 451 458 } 452 459 } else { 453 r Map.put("insert", false);460 relationInformation.insert = false; 454 461 } 455 462 } else if (!"via".equals(role)) { 456 r Map.put("warnme", true);463 relationInformation.warnme = true; 457 464 } 458 return rMap; 465 relationInformation.relation = c; 466 return relationInformation; 459 467 } 460 468 461 469 static OsmPrimitive findVia(Relation r, String type) { -
test/unit/org/openstreetmap/josm/actions/SplitWayActionTest.java
6 6 7 7 import java.util.Arrays; 8 8 9 import org.junit.Assert; 9 10 import org.junit.Rule; 10 11 import org.junit.Test; 12 import org.openstreetmap.josm.TestUtils; 11 13 import org.openstreetmap.josm.data.coor.EastNorth; 14 import org.openstreetmap.josm.data.coor.LatLon; 12 15 import org.openstreetmap.josm.data.osm.DataSet; 13 16 import org.openstreetmap.josm.data.osm.Node; 17 import org.openstreetmap.josm.data.osm.Relation; 18 import org.openstreetmap.josm.data.osm.RelationMember; 14 19 import org.openstreetmap.josm.data.osm.Way; 15 20 import org.openstreetmap.josm.testutils.JOSMTestRules; 16 21 … … 78 83 w1.getNode(i), w1NodesArray[i]); 79 84 } 80 85 } 86 87 /** 88 * Test case: when a way is split with a turn restriction relation, 89 * the relation should not be broken. 90 * see #17810 91 */ 92 @Test 93 public void testTicket17810() { 94 DataSet dataSet = new DataSet(); 95 Way from = TestUtils.newWay("highway=residential", new Node(new LatLon(0.0, 0.0)), 96 new Node(new LatLon(0.00033, 0.00033)), new Node(new LatLon(0.00066, 0.00066)), 97 new Node(new LatLon(0.001, 0.001))); 98 from.getNodes().forEach(node -> dataSet.addPrimitive(node)); 99 dataSet.addPrimitive(from); 100 Node via = from.lastNode(); 101 Way to = TestUtils.newWay("highway=residential", new Node(new LatLon(0.002, 0.001)), via); 102 to.getNodes().forEach(node -> {if (!dataSet.containsNode(node)) {dataSet.addPrimitive(node);}}); 103 dataSet.addPrimitive(to); 104 Relation restriction = TestUtils.newRelation("type=restriction restriction=no_left_turn", 105 new RelationMember("from", from), new RelationMember("to", to), 106 new RelationMember("via", via)); 107 dataSet.addPrimitive(restriction); 108 dataSet.clearSelection(); 109 dataSet.addSelected(from.getNode(2), from); 110 SplitWayAction.runOn(dataSet); 111 for (RelationMember member : restriction.getMembers()) { 112 if ("from".equals(member.getRole())) { 113 Assert.assertTrue(member.getWay().containsNode(via)); 114 } 115 } 116 } 81 117 }
