Index: src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java =================================================================== --- src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java (revision 2083) +++ src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java (working copy) @@ -30,6 +30,7 @@ import org.openstreetmap.josm.data.osm.DataSet; import org.openstreetmap.josm.data.osm.Node; import org.openstreetmap.josm.data.osm.OsmPrimitive; +import org.openstreetmap.josm.data.osm.OsmUtils; import org.openstreetmap.josm.data.osm.Relation; import org.openstreetmap.josm.data.osm.RelationMember; import org.openstreetmap.josm.data.osm.Way; @@ -658,6 +659,7 @@ } if(!toWay.isFirstLastNode(viaNode)) { r.putError(tr("The \"to\" way doesn't start or end at a \"via\" node."), true); + return; } } else @@ -665,17 +667,40 @@ Way viaWay = (Way) via; Node firstNode = viaWay.firstNode(); Node lastNode = viaWay.lastNode(); - if(fromWay.isFirstLastNode(firstNode)) { - viaNode = firstNode; - } else if(fromWay.isFirstLastNode(lastNode)) { - viaNode = firstNode; - } else { - r.putError(tr("The \"from\" way doesn't start or end at the \"via\" way."), true); - return; + String oneway = viaWay.get("oneway"); + if (oneway == null) { + oneway = OsmUtils.falseval; + } else if (oneway.equals("-1")) { + oneway = OsmUtils.trueval; } - if(!toWay.isFirstLastNode(viaNode == firstNode ? lastNode : firstNode)) { - r.putError(tr("The \"to\" way doesn't start or end at the \"via\" way."), true); + if (OsmUtils.getOsmBoolean(oneway)) { + if (fromWay.isFirstLastNode(firstNode)) { + viaNode = firstNode; + } else { + r.putError(tr("The \"from\" way doesn't start or end at the \"via\" way."), true); + return; + } + + if (!toWay.isFirstLastNode(lastNode)) { + r.putError(tr("The \"to\" way doesn't start or end at the \"via\" way."), true); + return; + } + } else { + if (fromWay.isFirstLastNode(firstNode)) { + viaNode = firstNode; + } else if (fromWay.isFirstLastNode(lastNode)) { + viaNode = lastNode; + } else { + r.putError(tr("The \"from\" way doesn't start or end at the \"via\" way."), true); + return; + } + + if (!toWay.isFirstLastNode(viaNode == firstNode ? lastNode : firstNode)) { + r.putError(tr("The \"to\" way doesn't start or end at the \"via\" way."), true); + return; + } } + via = viaNode; } /* find the "direct" nodes before the via node */