// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.JunctionChecker.datastructure;
import java.util.ArrayList;
/**
* BasicChannel hat alle Eigenschaften, die eine Channelklasse für einen DIgrpahen braucht.
* @author joerg
*/
public class BasicChannel {
private OSMNode toNode;
private OSMNode fromNode;
private ArrayList<LeadsTo> leadsTo = new ArrayList<>();
private final ArrayList<OSMWay> ways = new ArrayList<>();
private int newid;
//gibt es nur, wenn ein Channelobjekt aus einer Nichteinbahnstraße erzeugt wurde (backchannelID ist dann die ID des anderen Channels)
private int backChannelID = -100;
private final ArrayList<Channel> predChannels = new ArrayList<>();
//werden für den Tarjan-Algorithmus gebraucht
private int lowlink = -1;
private int index = -1;
/**
* fügt einen Vorgängerchannel hinzu
* @param channel der voherige Channel
*/
public void addPredChannel(Channel channel) {
predChannels.add(channel);
}
/**
* setzt den ToNode
*/
public void setToNode(OSMNode toNode) {
this.toNode = toNode;
}
/**
* gbit den ToNode zurück
*/
public OSMNode getToNode() {
return toNode;
}
/**
* setzt den FromNode
*/
public void setFromNode(OSMNode fromNode) {
this.fromNode = fromNode;
}
/**
* gibt den FromNode zurück
*/
public OSMNode getFromNode() {
return fromNode;
}
/**
* fügt eine LeadsTo-Beziehung hinzu
*/
public void addLeadsTo(LeadsTo leadsTo) {
this.leadsTo.add(leadsTo);
}
/**
* setzt alle leadsTo-Beziehungen (löscht alle voherigen)
*/
public void setLeadsTo(ArrayList<LeadsTo> leadsTo) {
this.leadsTo = leadsTo;
}
/**
* löscht alle LeadsTo des Channels
*/
public void removeLeadsTo() {
this.leadsTo.clear();
}
/**
* gibt alle leadsTo zurück
*/
public ArrayList<LeadsTo> getLeadsTo() {
return leadsTo;
}
/**
* fügt einen Way hinzu, aus dem der Channel enstanden ist
* es gibt immer mind. einen Way, es können aber auch mehr sein
*/
public void addWay(OSMWay way) {
this.ways.add(way);
}
/**
* gibt alle Ways zurück
*/
public ArrayList<OSMWay> getWays() {
return ways;
}
/**
* gibt nur den ersten Way der ArrayList zurück! wird bei der
* XML-datei-Erzeugung benutzt, um den Way, der aus dem Channel entsteht,
* mit Werten zu füllen dabei gehen Informationen verloren, da ein Channel
* aus mehr als einem Way bestehen kann
*/
public OSMWay getWay() {
return ways.get(0);
}
/**
* setzt die ID des Channels.
* es kann nicht die ID des Ways übernommen werden, da aus einem Way oftmals mehrere Channels entstehen (z.B. bei jeder Nichteinbahnstraße mind. 2)
*/
public void setNewid(int newid) {
this.newid = newid;
}
/**
* gbit die NewID zurück
*/
public int getNewid() {
return newid;
}
/**
* gibt alle VorgängerChannels zurück
*/
public ArrayList<Channel> getPredChannels() {
return predChannels;
}
/**
* ToString Methode
*/
@Override
public String toString() {
String lt = "";
for (int i = 0; i < leadsTo.size(); i++) {
lt += leadsTo.get(i).getToChannel().getNewid() + ", ";
}
String predch = "";
for (int i = 0; i < predChannels.size(); i++) {
predch += predChannels.get(i).getNewid() + ", ";
}
return "[ChannelID: "+ newid + ":AnzahlPredCH: " + predChannels.size() + ":PredCh: " + predch +
":AnzahlSuccCH: " + leadsTo.size() +":LeadsTo: " + lt+ ":backCHID: " + backChannelID + "]";
}
public void setBackChannelID(int backChannelID) {
this.backChannelID = backChannelID;
}
public int getBackChannelID() {
return backChannelID;
}
/**
* wandelt den Channel in einen OSMWay um
* dabie werden die Werte des 1. Way, der im Channel ist, übernommen, wenn ein
* 1. Channel existiert
*/
public OSMWay ToOSMWay() {
OSMWay way = new OSMWay();
way.addNode(this.fromNode);
way.addNode(this.toNode);
way.setId((long) this.newid);
if (this.getWay() != null) {
way.setHashmap(this.getWay().getHashmap());
}
return way;
}
public void ereasePredChannel(Channel rchannel) {
predChannels.remove(rchannel);
}
public int getLowlink() {
return lowlink;
}
public void setLowlink(int lowlink) {
this.lowlink = lowlink;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
public void removeLeadsTo(LeadsTo leadsTo) {
this.leadsTo.remove(leadsTo);
}
}