// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.data.validation.util; import java.util.Collection; import java.util.HashSet; import org.openstreetmap.josm.data.osm.Node; import org.openstreetmap.josm.data.osm.OsmPrimitive; import org.openstreetmap.josm.data.osm.Relation; import org.openstreetmap.josm.data.osm.RelationMember; import org.openstreetmap.josm.data.osm.Way; import org.openstreetmap.josm.data.osm.visitor.AbstractVisitor; /** * A visitor that aggregates all primitives it visits. * <p> * The primitives are sorted according to their type: first nodes, then ways. * * @author frsantos */ public class AggregatePrimitivesVisitor extends AbstractVisitor { /** Aggregated data */ private final Collection<OsmPrimitive> aggregatedData = new HashSet<>(); /** * Visits a collection of primitives * @param data The collection of primitives * @return The aggregated primitives */ public Collection<OsmPrimitive> visit(Collection<OsmPrimitive> data) { for (OsmPrimitive osm : data) { osm.accept(this); } return aggregatedData; } @Override public void visit(Node n) { if (!aggregatedData.contains(n)) { aggregatedData.add(n); } } @Override public void visit(Way w) { if (!aggregatedData.contains(w)) { aggregatedData.add(w); for (Node n : w.getNodes()) { visit(n); } } } @Override public void visit(Relation r) { if (!aggregatedData.contains(r)) { aggregatedData.add(r); for (RelationMember m : r.getMembers()) { m.getMember().accept(this); } } } }