package es.tid.tedb.controllers; import java.io.File; import java.util.ArrayList; import java.util.Hashtable; import java.util.Iterator; import java.util.Map; import java.util.concurrent.locks.Lock; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.jgrapht.graph.SimpleDirectedWeightedGraph; import org.w3c.dom.CharacterData; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import es.tid.tedb.DomainTEDB; import es.tid.tedb.IntraDomainEdge; import es.tid.tedb.SimpleTEDB; import es.tid.tedb.TE_Information; import es.tid.tedb.elements.RouterInfoPM; /** * * @author jaume i la humiltat * * * Class that receives a DomainTED and updates. Then it dies. */ public class TEDUpdaterController extends Thread { protected Hashtable<Integer,MyEdge> interDomainLinks = new Hashtable<Integer,MyEdge>(); protected ArrayList<String> ips = null; protected ArrayList<String> ports = null; protected String topologyPathNodes = ""; protected String topologyPathLinks = ""; protected SimpleTEDB TEDB; protected Logger log; protected Lock lock = null; protected String interDomainFile = null; public TEDUpdaterController(){}; public TEDUpdaterController(String ip, String port, String topologyPathLinks, String topologyPathNodes,DomainTEDB ted, Logger log) { ips = new ArrayList<String>(); ports = new ArrayList<String>(); ips.add(ip); ports.add(port); this.topologyPathLinks = topologyPathLinks; this.topologyPathNodes = topologyPathNodes; this.TEDB = (SimpleTEDB)ted; this.log = log; } public TEDUpdaterController(String ip, String port, String topologyPathLinks, String topologyPathNodes,DomainTEDB ted, Logger log, Lock lock) { ips = new ArrayList<String>(); ports = new ArrayList<String>(); ips.add(ip); ports.add(port); this.topologyPathLinks = topologyPathLinks; this.topologyPathNodes = topologyPathNodes; this.TEDB = (SimpleTEDB)ted; this.log = log; this.lock = lock; } public TEDUpdaterController(ArrayList<String> ips, ArrayList<String>ports , String topologyPathLinks, String topologyPathNodes,DomainTEDB ted, Logger log) { this.ips = ips; this.ports = ports; this.topologyPathLinks = topologyPathLinks; this.topologyPathNodes = topologyPathNodes; this.TEDB = (SimpleTEDB)ted; this.log = log; } public static void parseRemainingLinksFromXML(DomainTEDB TEDB, String interDomainFile) { Hashtable<Integer,MyEdge> interDomainLinks = readInterDomainFile(interDomainFile); Map<Integer, MyEdge> map = interDomainLinks; Iterator<Map.Entry<Integer, MyEdge>> it = map.entrySet().iterator(); while (it.hasNext()) { Map.Entry<Integer, MyEdge> entry = it.next(); MyEdge edgeAux = entry.getValue(); IntraDomainEdge edge= new IntraDomainEdge(); edge.setSrc_if_id(new Long(edgeAux.source_port)); edge.setDst_if_id(new Long(edgeAux.dest_port)); TE_Information tE_info = new TE_Information(); tE_info.setNumberWLANs(15); tE_info.initWLANs(); tE_info.setVlanLink(true); tE_info.setVlan(edgeAux.vlan); edge.setTE_info(tE_info); System.out.println("Adding InterDomain Edge!!::Vlan::"+edgeAux.vlan); SimpleDirectedWeightedGraph sdwg = ((SimpleTEDB)TEDB).getNetworkGraph(); if (!sdwg.containsVertex(new RouterInfoPM(edgeAux.source))) { sdwg.addVertex(new RouterInfoPM(edgeAux.source)); } if (!sdwg.containsVertex(new RouterInfoPM(edgeAux.dest))) { sdwg.addVertex(new RouterInfoPM(edgeAux.dest)); } ((SimpleTEDB)TEDB).getNetworkGraph().addEdge(new RouterInfoPM(edgeAux.source), new RouterInfoPM(edgeAux.dest), edge); } } public static Hashtable<Integer, MyEdge> readInterDomainFile(String interDomainFile) { System.out.println("Parsing intradomain File"); Hashtable<Integer, MyEdge> interDomainLinks = new Hashtable<Integer,MyEdge>(); try { DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); File confFile = new File(interDomainFile); Document doc = builder.parse(confFile); NodeList list_nodes_Edges = doc.getElementsByTagName("edge"); System.out.println("num edges: " + list_nodes_Edges.getLength()); for (int i = 0; i < list_nodes_Edges.getLength(); i++) { Element nodes_servers = (Element) list_nodes_Edges.item(i); String source = getCharacterDataFromElement((Element) nodes_servers.getElementsByTagName("source").item(0)); String dest = getCharacterDataFromElement((Element) nodes_servers.getElementsByTagName("dest").item(0)); Integer vlan = Integer.parseInt(getCharacterDataFromElement((Element) nodes_servers.getElementsByTagName("vlan").item(0))); String direction = getCharacterDataFromElement((Element) nodes_servers.getElementsByTagName("direction").item(0)); int source_port = Integer.parseInt(getCharacterDataFromElement((Element) nodes_servers.getElementsByTagName("source_port").item(0))); int dest_port = Integer.parseInt(getCharacterDataFromElement((Element) nodes_servers.getElementsByTagName("dest_port").item(0))); System.out.println("Adding IntraDomain Link! source: "+source+", dest: "+dest+", source_port: "+source_port+", dest_port: "+dest_port); MyEdge auxEdge = new TEDUpdaterController().new MyEdge(source, dest, vlan, source_port, dest_port); interDomainLinks.put(auxEdge.hashCode(), auxEdge); if (direction.equals("bidirectional")) { MyEdge reverseEdge = new TEDUpdaterController().new MyEdge(dest, source, vlan, source_port, dest_port); interDomainLinks.put(reverseEdge.hashCode(), reverseEdge); } } } catch (Exception e) { System.out.println(e.toString()); } return interDomainLinks; } private static String getCharacterDataFromElement(Element e) { Node child = e.getFirstChild(); if (child instanceof CharacterData) { CharacterData cd = (CharacterData) child; return cd.getData(); } else { return "?"; } } public class MyEdge { String source; String dest; Integer source_port; Integer dest_port; Integer vlan; MyEdge(String source, String dest) { this.source = source; this.dest = dest; } MyEdge(String source, String dest, Integer vlan, Integer source_port, Integer dest_port) { this.source = source; this.dest = dest; this.source_port = source_port; this.dest_port = dest_port; this.vlan = vlan; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((dest == null) ? 0 : dest.hashCode()); result = prime * result + ((source == null) ? 0 : source.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; MyEdge other = (MyEdge) obj; if (dest == null) { if (other.dest != null) return false; } else if (!dest.equals(other.dest)) return false; if (source == null) { if (other.source != null) return false; } else if (!source.equals(other.source)) return false; return true; } } public String getInterDomainFile() { return interDomainFile; } public void setInterDomainFile(String interDomainFile) { this.interDomainFile = interDomainFile; } }