package es.tid.provisioningManager.objects;
import java.io.File;
import java.util.ArrayList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.CharacterData;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import es.tid.tedb.elements.Link;
import es.tid.tedb.elements.Node;
public class Topology {
private ArrayList<Node> nodeList;
private ArrayList<Link> linkList;
public Topology() {
nodeList=new ArrayList<Node>();
linkList=new ArrayList<Link>();
}
public ArrayList<Node> getNodeList() {
return nodeList;
}
public void setNodeList(ArrayList<Node> nodeList) {
this.nodeList = nodeList;
}
public ArrayList<Link> getLinkList() {
return linkList;
}
public void setLinkList(ArrayList<Link> linkList) {
this.linkList = linkList;
}
public void initializefromfile(String fileName){
System.out.println("Initializing reachability from " + fileName);
File file = new File(fileName);
try {
DocumentBuilder builder = DocumentBuilderFactory.newInstance()
.newDocumentBuilder();
Document doc;
doc = builder.parse(file);
NodeList nodes_g = doc.getElementsByTagName("g");
for (int j = 0; j < nodes_g.getLength(); j++) {
Element element_domain = (Element) nodes_g.item(j);
NodeList nodes_V = element_domain
.getElementsByTagName("V");
Element domain_V = (Element) nodes_V.item(0);
String domain_Vs = getCharacterDataFromElement(domain_V);//FIXME: Ya veremos que hacemos con esto...domain_Vs
NodeList nodes_E = element_domain
.getElementsByTagName("E");
Element domain_E = (Element) nodes_E.item(0);
String domain_Es = getCharacterDataFromElement(domain_E);//FIXME: Ya veremos que hacemos con esto...domain_Es
NodeList nodes_node = element_domain
.getElementsByTagName("node");
for (int i=0; i<nodes_node.getLength();i++){
Node node=new Node();
Element node_element = (Element) nodes_node.item(i);
NodeList node_name_list = node_element
.getElementsByTagName("name");
Element node_name_element = (Element) node_name_list.item(0);
String node_name = getCharacterDataFromElement(node_name_element);//Nombre del nodo
NodeList node_id_list = node_element
.getElementsByTagName("id");
Element node_id_element = (Element) node_id_list.item(0);
String node_id = getCharacterDataFromElement(node_id_element);//ID del nodo
node.setNodeID(node_id);//Switch del nodo
NodeList node_controller_list = node_element
.getElementsByTagName("controller");
Element node_controller_element = (Element) node_controller_list.item(0);//Controlador del Nodo
if (node_controller_element!=null) {
NodeList controller_type_list=node_controller_element.getElementsByTagName("type");
Element controller_type_element = (Element) controller_type_list.item(0);
String controller_type = getCharacterDataFromElement(controller_type_element);//tipo del controlador
node.setRouterType(controller_type);//Tipo del nodo
NodeList controller_ip_list=node_controller_element.getElementsByTagName("ip");
Element controller_ip_element = (Element) controller_ip_list.item(0);
String controller_ip = getCharacterDataFromElement(controller_ip_element);//ip del controlador
node.getAddress().add(controller_ip);//IP
NodeList controller_port_list=node_controller_element.getElementsByTagName("port");
Element controller_port_element = (Element) controller_port_list.item(0);
String controller_port = getCharacterDataFromElement(controller_port_element);//port del controlador
}
nodeList.add(node);
}
/*
* <link>
* <source>00-00-00-00-00-00-00-01</source>
* <type>0</type>
* <target>00-00-00-00-00-00-00-03</target>
* <local_ifid>2</local_ifid>
* <remote_ifid>1</remote_ifid>
* <channels>
* <count>0</count>
* <item_version>0</item_version>
* </channels>
* </link>
*/
NodeList links_link = element_domain
.getElementsByTagName("link");
System.out.println("Before read links");
for (int k=0; k<links_link.getLength();k++){
Link link=new Link();
Element link_element = (Element) links_link.item(k);
NodeList link_source_list = link_element
.getElementsByTagName("source");
Element link_source_element = (Element) link_source_list.item(0);
String link_source = getCharacterDataFromElement(link_source_element);//Origen del link
link.setSourceId(link_source);//Source Switch ID
NodeList link_type_list = link_element
.getElementsByTagName("type");
Element link_type_element = (Element) link_type_list.item(0);
String link_type = getCharacterDataFromElement(link_type_element);//tipo de Link
link.setType(link_type);//Tipo
NodeList link_target_list = link_element
.getElementsByTagName("target");
Element link_target_element = (Element) link_target_list.item(0);
String link_target = getCharacterDataFromElement(link_target_element);//destino del Link
link.setDestID(link_target);
NodeList link_localIF_list = link_element
.getElementsByTagName("local_ifid");
Element link_localIF_element = (Element) link_localIF_list.item(0);
String link_localIF = getCharacterDataFromElement(link_localIF_element);//IF local del link
link.setSourceIntf(link_localIF);
NodeList link_remoteIF_list = link_element
.getElementsByTagName("remote_ifid");
Element link_remoteIF_element = (Element) link_remoteIF_list.item(0);
String link_remoteIF = getCharacterDataFromElement(link_remoteIF_element);//IF local del link
link.setDestIntf(link_remoteIF);
NodeList link_channels_list = link_element
.getElementsByTagName("channels");
Element link_channels_element = (Element) link_channels_list.item(0);//Channels
if (link_channels_element!=null) {
NodeList channels_count_list=link_channels_element.getElementsByTagName("count");
Element channels_count_element = (Element) channels_count_list.item(0);
String channels_count = getCharacterDataFromElement(channels_count_element);//Channels' count
NodeList channels_itemversion_list=link_channels_element.getElementsByTagName("item_version");
Element channels_itemversion_element = (Element) channels_itemversion_list.item(0);
String controller_ip = getCharacterDataFromElement(channels_itemversion_element);//Channels' item_version
}
linkList.add(link);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static String getCharacterDataFromElement(Element e) {
org.w3c.dom.Node child = e.getFirstChild();
if (child instanceof CharacterData) {
CharacterData cd = (CharacterData) child;
return cd.getData();
} else {
return "?";
}
}
}