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.ArrayList; 007 import java.util.HashMap; 008 import java.util.HashSet; 009 import java.util.List; 010 import java.util.Map; 011 012 import org.openstreetmap.josm.data.osm.Node; 013 import org.openstreetmap.josm.data.validation.Severity; 014 import org.openstreetmap.josm.data.validation.Test; 015 import org.openstreetmap.josm.data.validation.TestError; 016 import org.openstreetmap.josm.gui.progress.ProgressMonitor; 017 018 public class NodesWithSameName extends Test { 019 protected static final int SAME_NAME = 801; 020 021 private Map<String, List<Node>> namesToNodes; 022 023 public NodesWithSameName() { 024 super(tr("Nodes with same name"), 025 tr("This test finds nodes that have the same name (might be duplicates).")); 026 } 027 028 @Override public void startTest(ProgressMonitor monitor) { 029 super.startTest(monitor); 030 namesToNodes = new HashMap<String, List<Node>>(); 031 } 032 033 @Override public void visit(Node n) { 034 if (!n.isUsable()) return; 035 036 String name = n.get("name"); 037 String sign = n.get("traffic_sign"); 038 String highway = n.get("highway"); 039 if (name == null 040 || (sign != null && sign.equals("city_limit")) 041 || (highway != null && highway.equals("bus_stop"))) 042 return; 043 044 List<Node> nodes = namesToNodes.get(name); 045 if (nodes == null) { 046 namesToNodes.put(name, nodes = new ArrayList<Node>()); 047 } 048 049 nodes.add(n); 050 } 051 052 @Override public void endTest() { 053 for (List<Node> nodes : namesToNodes.values()) { 054 if (nodes.size() > 1) { 055 // Report the same-name nodes, unless each has a unique ref=*. 056 HashSet<String> refs = new HashSet<String>(); 057 058 for (Node n : nodes) { 059 String ref = n.get("ref"); 060 if (ref == null || !refs.add(ref)) { 061 errors.add(new TestError(this, Severity.OTHER, 062 tr("Nodes with same name"), SAME_NAME, nodes)); 063 break; 064 } 065 } 066 } 067 } 068 super.endTest(); 069 namesToNodes = null; 070 } 071 }