// License: GPL. Copyright 2007 by Immanuel Scholz and others
package org.openstreetmap.josm.data.osm.visitor;

import java.util.Collection;
import java.util.HashSet;

import org.openstreetmap.josm.data.osm.Relation;
import org.openstreetmap.josm.data.osm.RelationMember;
import org.openstreetmap.josm.data.osm.Node;
import org.openstreetmap.josm.data.osm.OsmPrimitive;
import org.openstreetmap.josm.data.osm.Way;

/**
 * Collect all nodes a specific osm primitive has.
 * 
 * @author imi
 */
public class AllNodesVisitor implements Visitor {

	/**
	 * The resulting nodes collected so far.
	 */
	public Collection<Node> nodes = new HashSet<Node>();

	/**
	 * Nodes have only itself as nodes.
	 */
	public void visit(Node n) {
		nodes.add(n);
	}

	/**
	 * Ways have their way nodes.
	 */
	public void visit(Way w) {
		for (Node n : w.nodes)
			visit(n);
	}

	/**
	 * Relations may have any number of nodes.
	 * FIXME: do we want to collect nodes from segs/ways that are relation members?
	 * if so, use AutomatchVisitor!
	 */
	public void visit(Relation e) {
		for (RelationMember m : e.members)
			if (m.member instanceof Node) visit((Node)m.member);
	}
	/**
	 * @return All nodes the given primitive has.
	 */
	public static Collection<Node> getAllNodes(Collection<? extends OsmPrimitive> osms) {
		AllNodesVisitor v = new AllNodesVisitor();
		for (OsmPrimitive osm : osms)
			osm.visit(v);
		return v.nodes;
	}
}
