// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.JunctionChecker.datastructure;
import java.util.ArrayList;
import java.util.HashMap;
import org.openstreetmap.josm.plugins.JunctionChecker.connectedness.BacktrackingColors;
/**
* Diese Klasse erweitert BasicChannel um die Dinge, die für die Kreuzungsalgorithmen benötigt werden
* @author joerg
*/
public class Channel extends BasicChannel {
//für den Junctioncheck
private int indegree;
private int outdegree;
private boolean subgraph;
private int visited = BacktrackingColors.WHITE;
private final ArrayList<Channel> reachableNodes = new ArrayList<>();
private int ennr;
private boolean isStrongConnected = true;
private boolean isSelected = false; //wird für den eigenen Layer benötigt, um markierte Channels zu erhalten
private boolean isPartOfJunction = false; //wird für den eigenen Layer benötigt, um Teile einer Kreuzung farbig repräsentieren zu können
private final HashMap<Channel, ArrayList<Channel>> paths2 = new HashMap<>();
public Channel(OSMNode fromNode, OSMNode toNode) {
super();
this.setFromNode(fromNode);
this.setToNode(toNode);
this.subgraph = false;
this.indegree = 0;
this.outdegree = 0;
}
public Channel() {
super();
//this.insidenodes = new ArrayList<OSMNode>();
this.subgraph = false;
this.indegree = 0;
this.outdegree = 0;
}
/**
* gibt die Anzahl der auf diesen Channel verweisenden leadsTo zurück
*/
public int getIndegree() {
return indegree;
}
/**
* gibt die Anzahl der aus diesem Channel gehenden leadsTo zurück
*/
public int getOutdegree() {
return outdegree;
}
public void setIndegree(int i) {
this.indegree = i;
}
public void setOutdegree(int i) {
this.outdegree = i;
}
/**
* ist dieser Channel Teil der zu untersuchenden Kreuzung?
*/
public boolean isSubgraph() {
return subgraph;
}
public void setSubgraph(boolean subgraph) {
this.subgraph = subgraph;
}
/**
* setzt die Farbe des Channels für den TRDFS white = unbesucht grey = besucht, aber noch nicht beendet black = besucht nund abgeschlossen
*/
public int getVisited() {
return visited;
}
public void setVisited(int visited) {
this.visited = visited;
}
/**
* gibt die von diesem Channel zu erreichenden anderen CHannels zurück
*/
public ArrayList<Channel> getReachableNodes() {
return reachableNodes;
}
/**
* setzt die zu erreichenden Channels alle anderen werden gelöscht
*/
public int getEnnr() {
return ennr;
}
/**
* setzt die Anzahl der EingangsChannel
*/
public void setEnnr(int ennr) {
this.ennr = ennr;
}
/**
* erhöht den Wert der Anzhal der EingangsledasTo um 1
*/
public void countupIndegree() {
indegree++;
}
/**
* erhöht den Wert der Anzahl der AusgangsleadsTo um 1
*/
public void countupOutdegree() {
outdegree++;
}
/**
* fügt einen erreichbaren Channel hinzu
*/
public void addReachableNode(Channel node) {
if (!reachableNodes.contains(node)) {
reachableNodes.add(node);
paths2.put(node, new ArrayList<Channel>());
}
}
/**
* gibt den an der Position i gespeicherten erreichbaren Channel zurück
*/
public Channel getReachableNodeAt(int i) {
return reachableNodes.get(i);
}
/**
* löscht alle erreichbaren Channels
*/
public void ereaseReachableNodes() {
reachableNodes.clear();
}
/**
* setzt Wert der erreichbaren Eingangschannel auf 0
*/
public void setEnnrZero() {
ennr = 0;
}
/**
* erhöht den Wert der Eingänge um 1
*/
public void increaseEnnr() {
ennr++;
}
/**
* fügt einen Pfad den Pfaden zu
*/
public void appendPath(Channel node, ArrayList<Channel> path) {
for (int i = 0; i < path.size(); i++) {
if (!paths2.get(node).contains(path.get(i))) {
paths2.get(node).add(path.get(i));
}
}
}
public void appendChannelToPath(Channel node, Channel channel) {
if (!paths2.containsKey(node)) {
paths2.put(node, new ArrayList<Channel>());
}
if (!paths2.get(node).contains(channel)) {
paths2.get(node).add(channel);
}
}
/**
* gibt alle Pfade zurück
*/
public ArrayList<ArrayList<Channel>> getPaths() {
ArrayList<ArrayList<Channel>> t = new ArrayList<>();
t.addAll(paths2.values());
return t;
}
public ArrayList<Channel> getPathsAt(Channel node) {
if (paths2.containsKey(node)) {
return paths2.get(node);
} else {
//log.error("das darf nicht bei Channel: " + this.getNewid() + ", kein Node " + node.getNewid());
return null;
}
}
public boolean isStrongConnected() {
return isStrongConnected;
}
public void setStrongConnected(boolean isStrongConnected) {
this.isStrongConnected = isStrongConnected;
}
public boolean isSelected() {
return isSelected;
}
public void setSelected(boolean isSelected) {
this.isSelected = isSelected;
}
public boolean isPartOfJunction() {
return isPartOfJunction;
}
public void setPartOfJunction(boolean isPartOfJunction) {
this.isPartOfJunction = isPartOfJunction;
}
}