001 // License: GPL. See LICENSE file for details.
002 package org.openstreetmap.josm.data.validation.util;
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 import org.openstreetmap.josm.data.osm.visitor.AbstractVisitor;
013
014 /**
015 * A visitor that aggregates all primitives it visits.
016 * <p>
017 * The primitives are sorted according to their type: first nodes, then ways.
018 *
019 * @author frsantos
020 */
021 public class AggregatePrimitivesVisitor extends AbstractVisitor {
022 /** Aggregated data */
023 final Collection<OsmPrimitive> aggregatedData = new HashSet<OsmPrimitive>();
024
025 /**
026 * Visits a collection of primitives
027 * @param data The collection of primitives
028 * @return The aggregated primitives
029 */
030 public Collection<OsmPrimitive> visit(Collection<OsmPrimitive> data) {
031 for (OsmPrimitive osm : data) {
032 osm.visit(this);
033 }
034
035 return aggregatedData;
036 }
037
038 @Override
039 public void visit(Node n) {
040 if (!aggregatedData.contains(n)) {
041 aggregatedData.add(n);
042 }
043 }
044
045 @Override
046 public void visit(Way w) {
047 if (!aggregatedData.contains(w)) {
048 aggregatedData.add(w);
049 for (Node n : w.getNodes()) {
050 visit(n);
051 }
052 }
053 }
054
055 @Override
056 public void visit(Relation r) {
057 if (!aggregatedData.contains(r)) {
058 aggregatedData.add(r);
059 for (RelationMember m : r.getMembers()) {
060 m.getMember().visit(this);
061 }
062 }
063 }
064 }