package org.openstreetmap.josm.plugins.routes;
import java.util.ArrayList;
import java.util.BitSet;
import java.util.Collections;
import java.util.List;
import org.openstreetmap.josm.data.osm.Node;
import org.openstreetmap.josm.data.osm.Way;
public class ConvertedWay {
public class WayEnd {
private Node end;
public WayEnd(Node end) {
this.end = end;
}
@Override
public boolean equals(Object o) {
if (o instanceof WayEnd) {
WayEnd otherEnd = (WayEnd)o;
return end.equals(otherEnd.end) && routes.equals(otherEnd.getRoutes());
} else {
return false;
}
}
@Override
public int hashCode() {
return end.hashCode() + routes.hashCode();
}
public BitSet getRoutes() {
return routes;
}
public ConvertedWay getWay() {
return ConvertedWay.this;
}
}
private List<Node> nodes = new ArrayList<>();
private BitSet routes;
public ConvertedWay(BitSet routes, Way way) {
this.routes = routes;
nodes.addAll(way.getNodes());
}
public WayEnd getStart() {
return new WayEnd(nodes.get(0));
}
public WayEnd getStop() {
return new WayEnd(nodes.get(nodes.size() - 1));
}
/**
* Connects way to this way. Other ways internal representation is destroyed!!!
* @param way
*/
public void connect(ConvertedWay way) {
for (int i=0; i<2; i++) {
if (way.nodes.get(0).equals(nodes.get(nodes.size() - 1))) {
way.nodes.remove(0);
nodes.addAll(way.nodes);
return;
}
if (way.nodes.get(way.nodes.size() - 1).equals(nodes.get(0))) {
nodes.remove(0);
way.nodes.addAll(nodes);
nodes = way.nodes;
return;
}
Collections.reverse(nodes);
}
}
public List<Node> getNodes() {
return nodes;
}
public BitSet getRoutes() {
return routes;
}
}