package org.openstreetmap.josm.plugins.routes; import java.util.BitSet; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.Map.Entry; import org.openstreetmap.josm.data.osm.Way; import org.openstreetmap.josm.plugins.routes.ConvertedWay.WayEnd; public class PathBuilder { private Map<Way, BitSet> wayRoutes = new HashMap<>(); private Collection<ConvertedWay> convertedWays; public void addWay(Way way, RouteDefinition route) { if (way.getNodesCount() >= 2) { BitSet routes = wayRoutes.get(way); if (routes == null) { routes = new BitSet(); wayRoutes.put(way, routes); } routes.set(route.getIndex()); } } public Collection<ConvertedWay> getConvertedWays() { if (convertedWays == null) { Map<WayEnd, ConvertedWay> ways = new HashMap<>(); for (Entry<Way, BitSet> wayEntry:wayRoutes.entrySet()) { ConvertedWay way = new ConvertedWay(wayEntry.getValue(), wayEntry.getKey()); ConvertedWay wayBefore = ways.get(way.getStart()); ConvertedWay wayAfter = ways.get(way.getStop()); if (wayBefore != null) { removeWay(ways, wayBefore); way.connect(wayBefore); } if (wayAfter != null) { removeWay(ways, wayAfter); way.connect(wayAfter); } ways.put(way.getStart(), way); ways.put(way.getStop(), way); } Set<ConvertedWay> uniqueWays = new HashSet<>(); uniqueWays.addAll(ways.values()); convertedWays = uniqueWays; } return convertedWays; } private void removeWay(Map<WayEnd, ConvertedWay> map, ConvertedWay wayInMap) { map.remove(wayInMap.getStart()); map.remove(wayInMap.getStop()); } public void clear() { convertedWays = null; wayRoutes.clear(); } }