001 // License: GPL. Copyright 2007 by Immanuel Scholz and others 002 package org.openstreetmap.josm.data.osm.visitor; 003 004 import java.util.Collection; 005 import java.util.HashSet; 006 007 import org.openstreetmap.josm.data.osm.Node; 008 import org.openstreetmap.josm.data.osm.OsmPrimitive; 009 import org.openstreetmap.josm.data.osm.Relation; 010 import org.openstreetmap.josm.data.osm.RelationMember; 011 import org.openstreetmap.josm.data.osm.Way; 012 013 /** 014 * Collect all nodes a specific osm primitive has. 015 * 016 * @author imi 017 */ 018 public class AllNodesVisitor extends AbstractVisitor { 019 020 /** 021 * The resulting nodes collected so far. 022 */ 023 public Collection<Node> nodes = new HashSet<Node>(); 024 025 /** 026 * Nodes have only itself as nodes. 027 */ 028 public void visit(Node n) { 029 nodes.add(n); 030 } 031 032 /** 033 * Ways have their way nodes. 034 */ 035 public void visit(Way w) { 036 if (w.isIncomplete()) return; 037 for (Node n : w.getNodes()) 038 visit(n); 039 } 040 041 /** 042 * Relations may have any number of nodes. 043 * FIXME: do we want to collect nodes from segs/ways that are relation members? 044 * if so, use AutomatchVisitor! 045 */ 046 public void visit(Relation e) { 047 for (RelationMember m : e.getMembers()) 048 if (m.isNode()) visit(m.getNode()); 049 } 050 /** 051 * @return All nodes the given primitive has. 052 */ 053 public static Collection<Node> getAllNodes(Collection<? extends OsmPrimitive> osms) { 054 AllNodesVisitor v = new AllNodesVisitor(); 055 for (OsmPrimitive osm : osms) 056 osm.visit(v); 057 return v.nodes; 058 } 059 }