package graph; import java.util.ArrayList; import java.util.Collection; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import feature.StreetSegment; import feature.StreetSegmentObserver; /** * Base implementation for shortest-path algorithms. */ public abstract class AbstractShortestPathAlgorithm implements ShortestPathAlgorithm { private Collection observers; /** * */ public AbstractShortestPathAlgorithm() { observers = new ArrayList(); } @Override public abstract Map findPath(int origin, int destination, StreetNetwork net); @Override public void addStreetSegmentObserver(final StreetSegmentObserver observer) { if (observer != null) { observers.add(observer); } } @Override public void removeStreetSegmentObserver(final StreetSegmentObserver observer) { observers.remove(observer); } @Override public void notifyStreetSegmentObservers(final List segmentIDs) { for (StreetSegmentObserver observer : observers) { observer.handleStreetSegments(segmentIDs); } } /** * @param segmentID the segment id */ protected void notifyStreetSegmentObservers(final String segmentID) { List one = new ArrayList(); one.add(segmentID); notifyStreetSegmentObservers(one); } /** * @param labels the labels * @param origin the origin id * @param destination the destination id * @return ordered path map */ protected Map buildPath(final LabelManager labels, final int origin, final int destination) { LinkedHashMap path = new LinkedHashMap(); if (labels == null) { return path; } Label destinationLabel = labels.getLabel(destination); if (destinationLabel == null || Double.isInfinite(destinationLabel.getValue())) { return path; } ArrayList reversed = new java.util.ArrayList(); Label current = destinationLabel; while (current != null && current.getID() != origin) { StreetSegment predecessor = current.getPredecessor(); if (predecessor == null) { break; } reversed.add(predecessor); current = labels.getLabel(predecessor.getTail()); } for (int i = reversed.size() - 1; i >= 0; i--) { StreetSegment segment = reversed.get(i); path.put(segment.getID(), segment); } return path; } }