001 // License: GPL. See LICENSE file for details. 002 package org.openstreetmap.josm.data.validation.tests; 003 004 import static org.openstreetmap.josm.tools.I18n.tr; 005 006 import java.util.Arrays; 007 import java.util.HashSet; 008 009 import org.openstreetmap.josm.data.osm.Node; 010 import org.openstreetmap.josm.data.osm.Way; 011 import org.openstreetmap.josm.data.validation.Severity; 012 import org.openstreetmap.josm.data.validation.Test; 013 import org.openstreetmap.josm.data.validation.TestError; 014 015 /** 016 * Checks for self-intersecting ways. 017 */ 018 public class SelfIntersectingWay extends Test { 019 020 protected static final int SELF_INTERSECT = 401; 021 022 public SelfIntersectingWay() { 023 super(tr("Self-intersecting ways"), 024 tr("This test checks for ways " + 025 "that contain some of their nodes more than once.")); 026 } 027 028 @Override public void visit(Way w) { 029 HashSet<Node> nodes = new HashSet<Node>(); 030 031 for (int i = 1; i < w.getNodesCount() - 1; i++) { 032 Node n = w.getNode(i); 033 if (nodes.contains(n)) { 034 errors.add(new TestError(this, 035 Severity.WARNING, tr("Self-intersecting ways"), SELF_INTERSECT, 036 Arrays.asList(w), Arrays.asList(n))); 037 break; 038 } else { 039 nodes.add(n); 040 } 041 } 042 } 043 }