/** * This file is part of Relation Analyzer for OSM. * Copyright (c) 2001 by Adrian Stabiszewski, as@grundid.de * * Relation Analyzer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Relation Analyzer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with Relation Analyzer. If not, see <http://www.gnu.org/licenses/>. */ package org.osmtools.ra.traverse; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.List; import org.osmtools.ra.AnalyzerException; import org.osmtools.ra.data.Node; import org.osmtools.ra.graph.IntersectionNode; public class SingleRouteTraverser { private List<Node> path = new ArrayList<Node>(); private Collection<IntersectionNode> visitedNodes = new HashSet<IntersectionNode>(); private IntersectionNode endNode; public SingleRouteTraverser(IntersectionNode startNode, IntersectionNode endNode) { this.endNode = endNode; traverseNodes(startNode); } public List<Node> getPath() { return path; } private void traverseNodes(IntersectionNode startNode) { path.add(startNode.getNode()); do { visitedNodes.add(startNode); IntersectionNode nextNode = getNextNode(startNode); path.add(nextNode.getNode()); startNode = nextNode; } while (!startNode.equals(endNode)); } private IntersectionNode getNextNode(IntersectionNode startNode) { Iterator<IntersectionNode> edgeIterator = startNode.getEdgesIterator(); IntersectionNode nextNode = edgeIterator.next(); IntersectionNode possibleEndNode = nextNode.equals(endNode) ? nextNode : null; while (visitedNodes.contains(nextNode)) { if (edgeIterator.hasNext()) { nextNode = edgeIterator.next(); if (nextNode.equals(endNode)) possibleEndNode = nextNode; } else { if (nextNode.equals(endNode)) { break; } else if (possibleEndNode != null) { nextNode = possibleEndNode; } else throw new AnalyzerException("No way to go. All nodes visited before."); } } return nextNode; } }