// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.turnlanes.model;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.openstreetmap.josm.data.osm.Node;
import org.openstreetmap.josm.data.osm.Way;
public class Junction {
private final ModelContainer container;
private final Node node;
private final Set<Way> roads = new HashSet<>();
Junction(ModelContainer container, Node n) {
this.container = container;
this.node = n;
}
public boolean isPrimary() {
return getContainer().isPrimary(this);
}
public Node getNode() {
return node;
}
public List<Road> getRoads() {
final List<Road> result = new ArrayList<>(roads.size());
for (Way w : roads) {
result.add(container.getRoad(w));
}
return result;
}
public List<Road.End> getRoadEnds() {
final List<Road.End> result = new ArrayList<>(roads.size());
for (Way w : roads) {
result.add(getRoadEnd(w));
}
return result;
}
void addRoad(Way w) {
roads.add(w);
}
Road.End getRoadEnd(Way w) {
final Road r = getContainer().getRoad(w);
if (r.getRoute().getSegments().size() == 1) {
final boolean starts = r.getRoute().getStart().equals(node);
final boolean ends = r.getRoute().getEnd().equals(node);
if (starts && ends) {
throw new IllegalArgumentException("Ambiguous: The way starts and ends at the junction node.");
} else if (starts) {
return r.getFromEnd();
} else if (ends) {
return r.getToEnd();
}
} else if (r.getRoute().getFirstSegment().getWay().equals(w)) {
return r.getFromEnd();
} else if (r.getRoute().getLastSegment().getWay().equals(w)) {
return r.getToEnd();
}
throw new IllegalArgumentException("While there exists a road for the given way, the way neither "
+ "starts nor ends at the junction node.");
}
public ModelContainer getContainer() {
return container;
}
}