// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.plugins.elevation.gpx; import java.util.Collection; import org.openstreetmap.josm.data.gpx.GpxData; import org.openstreetmap.josm.data.gpx.GpxRoute; import org.openstreetmap.josm.data.gpx.GpxTrack; import org.openstreetmap.josm.data.gpx.GpxTrackSegment; import org.openstreetmap.josm.data.gpx.WayPoint; /** * Utility class to apply a visitor on GPX containers (track, route, data). * @author Oliver Wieland <oliver.wieland@online.de> */ public final class GpxIterator { /** * Static class, no need to instantiate me. */ private GpxIterator() {} /** * Runs the given visitor on a GPX data instance. If one or both * arguments are null, this method will return immediately. * * @param data * The GPX data instance. * @param visitor * The visitor which inspects all GPX entities. */ public static void visit(GpxData data, IGpxVisitor visitor) { if (data == null) return; if (visitor == null) return; if (data.isEmpty()) return; visitor.beginWayPoints(); visitSingleWaypoints(data, visitor); visitor.endWayPoints(); // routes if (data.hasRoutePoints()) { for (GpxRoute rte : data.routes) { visitRoute(visitor, rte); } } // tracks for (GpxTrack trk : data.tracks) { visitTrack(visitor, trk); } } /** * Visits a single GPX track. * @param track The track to visit. * @param visitor * The visitor which inspects all GPX entities. */ public static void visit(GpxTrack track, IGpxVisitor visitor) { visitTrack(visitor, track); } /** * Visits a single GPX route. * @param route The route to visit. * @param visitor * The visitor which inspects all GPX entities. */ public static void visit(GpxRoute route, IGpxVisitor visitor) { visitRoute(visitor, route); } // ---------------------- Helper methods ---------------- private static void visitTrack(IGpxVisitor visitor, GpxTrack trk) { if (trk == null) return; if (visitor == null) return; Collection<GpxTrackSegment> segments = trk.getSegments(); if (segments != null) { visitor.beginTrack(trk); // visit all segments for (GpxTrackSegment segment : segments) { Collection<WayPoint> waypts = segment.getWayPoints(); // no visitor here... if (waypts == null) continue; visitor.beginTrackSegment(trk, segment); for (WayPoint wayPoint : waypts) { visitor.visitTrackPoint(wayPoint, trk, segment); } visitor.endTrackSegment(trk, segment); } visitor.endTrack(trk); } } private static void visitRoute(IGpxVisitor visitor, GpxRoute route) { if (route == null) return; if (visitor == null) return; visitor.beginWayPoints(); for (WayPoint wpt : route.routePoints) { visitor.visitRoutePoint(wpt, route); } visitor.endWayPoints(); } private static void visitSingleWaypoints(GpxData data, IGpxVisitor visitor) { // isolated way points if (data.waypoints != null) { // better with an hasWaypoints method!? for (WayPoint wpt : data.waypoints) { visitor.visitWayPoint(wpt); } } } }