001 // License: GPL. For details, see LICENSE file. 002 package org.openstreetmap.josm.data.validation.tests; 003 004 import static org.openstreetmap.josm.tools.I18n.tr; 005 006 import java.util.HashSet; 007 import java.util.Set; 008 009 import org.openstreetmap.josm.data.osm.Node; 010 import org.openstreetmap.josm.data.osm.OsmPrimitive; 011 import org.openstreetmap.josm.data.osm.Way; 012 import org.openstreetmap.josm.data.validation.Severity; 013 import org.openstreetmap.josm.data.validation.Test; 014 import org.openstreetmap.josm.data.validation.TestError; 015 016 /** 017 * Warn when a node has the same tags as its parent way. The check is rather 018 * conservative: it warns only when the tags are identical and important (i.e., 019 * no warning for a way and a node that only have a "source=PGS" tag). 020 * <p> 021 * See JOSM ticket #7639 for the original request. 022 * 023 * @author Mrwojo 024 */ 025 public class NodesDuplicatingWayTags extends Test { 026 027 protected static final int NODE_DUPING_PARENT_WAY_TAGS = 2401; 028 029 public NodesDuplicatingWayTags() { 030 super(tr("Nodes duplicating way tags"), 031 tr("Checks for nodes that have the same tags as their parent way.")); 032 } 033 034 @Override 035 public void visit(Way way) { 036 // isTagged represents interesting tags (not "source", "created_by", ...) 037 if (!way.isUsable() || !way.isTagged()) 038 return; 039 040 // Use a set so you don't report the same node of an area/loop more than once. 041 Set<OsmPrimitive> dupedWayTags = new HashSet<OsmPrimitive>(); 042 043 // Check for nodes in the way that have tags identical to the way's tags. 044 for (Node node : way.getNodes()) { 045 if (way.hasSameTags(node)) { 046 dupedWayTags.add(node); 047 } 048 } 049 050 if (!dupedWayTags.isEmpty()) { 051 // Add the way for the warning. 052 dupedWayTags.add(way); 053 054 errors.add(new TestError(this, Severity.WARNING, tr("Nodes duplicating parent way tags"), 055 NODE_DUPING_PARENT_WAY_TAGS, dupedWayTags)); 056 } 057 } 058 }