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    }