package es.tid.topologyModuleBase.plugins.reader; import es.tid.tedb.IntraDomainEdge; import es.tid.tedb.SimpleTEDB; import es.tid.tedb.elements.*; import es.tid.topologyModuleBase.TopologyModuleParams; import es.tid.topologyModuleBase.database.TopologiesDataBase; import org.w3c.dom.CharacterData; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.io.File; import java.net.Inet4Address; import java.util.ArrayList; import java.util.Iterator; import java.util.concurrent.locks.Lock; public class TopologyReaderXML extends TopologyReader { private boolean isRunning=false; public TopologyReaderXML(TopologiesDataBase topologies,TopologyModuleParams params, Lock lock) { super(topologies,params,lock); } @Override public void run(){ readTopology(); } @Override public void readTopology() { lock.lock(); isRunning=true; //Initialize Traffic Engineering Database if (params.getModexml()!=null){ if (params.getModexml().equals("IP")){ readNetwork(params.getNetworkDescriptionFile()); } else if(params.getModexml().equals("TM")){ log.info("Inside TM"); ted.initializeFromFile(params.getNetworkDescriptionFile(), params.getIdentifier(), true); } else log.warning("Unknow Mode"); } else if(params.ITcapable==true){ log.info("Initializing IT capable TEDB"); ted.initializeFromFile(params.getITnetworkDescriptionFile()); }else{ if (params.isMultilayer()){ log.info("Initializing Multilayer TEDB"); ted.initializeFromFile(params.getNetworkDescriptionFile()); }else { if (params.isMultidomain()){ log.info("Initializing TEDB joining all domains in a single one"); }else { log.info("Initializing Single Layer TEDB"); } //STRONGEST: Independent PCE's with lambdas' sub-set assignment if (params.getLambdaEnd()!=Integer.MAX_VALUE){ log.info("Entro en Max Value"); ((SimpleTEDB)ted.getDB()).initializeFromFile(params.getNetworkDescriptionFile(),params.getLayer() ,params.isMultidomain(),params.getLambdaIni(),params.getLambdaEnd(),params.isSSOn(),false); } else{ log.info("Entro en el elsee:::"+params.isSSOn()+",params.isWLAN()"+params.isWLAN()); ((SimpleTEDB)ted.getDB()).initializeFromFile(params.getNetworkDescriptionFile(),params.getLayer() ,params.isMultidomain(),0,Integer.MAX_VALUE ,params.isSSOn(),false, params.isWLAN()); } } } isRunning=false; lock.unlock(); } public void readNetwork(String fileName) { //First, create the graph File file = new File(fileName); try { DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document doc = builder.parse(file); // NodeList controllers_ip = doc.getElementsByTagName("controller_list"); // for (int j = 0; j < controllers_ip.getLength(); j++) { // } NodeList nodes_domains = doc.getElementsByTagName("domain"); //System.out.println("isAllowingMultipleEdges?: "+((SimpleTEDB)this.ted.getDB()).getNetworkGraph().isAllowingMultipleEdges()); //First pass to get all the nodes for (int j = 0; j < nodes_domains.getLength(); j++) { Element element1 = (Element) nodes_domains.item(j); Element element_domain = (Element) nodes_domains.item(j); NodeList nodes_domain_id = element_domain.getElementsByTagName("domain_id"); String domain_id = "fromXML"; for (int k = 0; k < nodes_domain_id.getLength(); k++) { Element domain_id_e = (Element) nodes_domain_id.item(0); domain_id = getCharacterDataFromElement(domain_id_e); } System.out.println("Network from XML with domainID:"+domain_id+" (iteration "+j+" of "+nodes_domains.getLength()+" in "+fileName+")"); SimpleTEDB db =(SimpleTEDB)ted.getDB(domain_id); if(db == null){ db = new SimpleTEDB(); db.createGraph(); ted.addTEDB(domain_id, db); } db.setDomainID((Inet4Address)Inet4Address.getByName(domain_id)); NodeList nodes = element1.getElementsByTagName("node"); log.info("Number of nodes: "+nodes.getLength()); if (nodes.getLength()>0){ for (int i = 0; i < nodes.getLength(); i++) { Element element = (Element) nodes.item(i); //Node Name NodeList nodeName_node = element.getElementsByTagName("nodeName"); Element nodeName_e = (Element) nodeName_node.item(0); String nodeName = getCharacterDataFromElement(nodeName_e); log.info("Nodename: "+nodeName); NodeList addressList_node = element.getElementsByTagName("addressList"); ArrayList<String> addresses = null; if (addressList_node.getLength()>0){ addresses= new ArrayList<String>(); for (int k = 0; k < addressList_node.getLength(); k++) { Element addressList_e = (Element) addressList_node.item(k); NodeList address_node = addressList_e.getElementsByTagName("address"); Element address_el = (Element) address_node.item(0); String address = getCharacterDataFromElement(address_el); addresses.add(address); } } //DataPathID String dpid=null; NodeList dpid_nodeList = element.getElementsByTagName("dpid"); if (dpid_nodeList.getLength()>0){ Element dpid_el = (Element) dpid_nodeList.item(0); dpid = getCharacterDataFromElement(dpid_el); } //Is physical Node boolean isPhysical_node = true; NodeList isPhysical_nodeList = element.getElementsByTagName("isPhysical"); if (isPhysical_nodeList.getLength()>0){ Element isPhysical_el = (Element) isPhysical_nodeList.item(0); String isPhysical_s = getCharacterDataFromElement(isPhysical_el); isPhysical_node = Boolean.parseBoolean(isPhysical_s); } //Is physical Node String layerNode = null; NodeList layerNode_nodeList = element.getElementsByTagName("layerNode"); if (layerNode_nodeList.getLength()>0){ Element layerNode_el = (Element) layerNode_nodeList.item(0); layerNode = getCharacterDataFromElement(layerNode_el); } String configurationMode=null; NodeList configurationMode_nodeList = element.getElementsByTagName("configurationMode"); if (configurationMode_nodeList.getLength()>0){ Element configurationMode_el = (Element) configurationMode_nodeList.item(0); configurationMode = getCharacterDataFromElement(configurationMode_el); } String controllerIP=null; NodeList controllerIP_nodeList = element.getElementsByTagName("controllerIP"); if (controllerIP_nodeList.getLength()>0){ Element controllerIP_el = (Element) controllerIP_nodeList.item(0); controllerIP = getCharacterDataFromElement(controllerIP_el); } String controllerPort=null; NodeList controllerPort_nodeList = element.getElementsByTagName("controllerPort"); if (controllerPort_nodeList.getLength()>0){ Element controllerPort_el = (Element) controllerPort_nodeList.item(0); controllerPort = getCharacterDataFromElement(controllerPort_el); } String routerType=null; NodeList routerType_nodeList = element.getElementsByTagName("routerType"); if (routerType_nodeList.getLength()>0){ Element routerType_el = (Element) routerType_nodeList.item(0); routerType = getCharacterDataFromElement(routerType_el); } //Interface List ArrayList<Intf> intfList = null; NodeList interfacesList_node = element.getElementsByTagName("interfacesList"); if (interfacesList_node.getLength()>0){ ArrayList<String> layer= null; ArrayList<String> addressesIntf = null; ArrayList<String> supportedCounters = null; intfList = new ArrayList<Intf>(); Element interface_e = (Element) interfacesList_node.item(0); NodeList interface_node = interface_e.getElementsByTagName("interface"); if (interface_node.getLength()>0){ for (int k = 0; k < interface_node.getLength(); k++) { Element interface_el = (Element) interface_node.item(k); //name interface NodeList nameIntf_node = interface_el.getElementsByTagName("nameIntf"); Element nameIntf_el = (Element) nameIntf_node.item(0); String nameIntf = getCharacterDataFromElement(nameIntf_el); //addressesIntf NodeList addressIntfList_node = interface_el.getElementsByTagName("addressIntfList"); if (addressIntfList_node.getLength()>0){ addressesIntf = new ArrayList<String>(); for (int it = 0; it < addressIntfList_node.getLength(); it++) { Element addressIntf_e = (Element) addressIntfList_node.item(it); NodeList addressIntf_node = addressIntf_e.getElementsByTagName("addressIntf"); Element addressIntf_el = (Element) addressIntf_node.item(0); String addressIntf = getCharacterDataFromElement(addressIntf_el); addressesIntf.add(addressIntf); } } NodeList label_node = interface_el.getElementsByTagName("label"); String label="0"; if (label_node.getLength()>0){ Element label_el = (Element) label_node.item(0); label = getCharacterDataFromElement(label_el); if (label.equals("?")) label="0"; } //IntfUp //name interface NodeList intfUp_node = interface_el.getElementsByTagName("intfUp"); boolean intfUp = true; if (intfUp_node.getLength()>0){ Element intfUp_el = (Element) intfUp_node.item(0); String intfUp_s = getCharacterDataFromElement(intfUp_el); intfUp = Boolean.parseBoolean(intfUp_s); } //layeringList NodeList layeringList_node = interface_el.getElementsByTagName("layeringList"); if (layeringList_node.getLength()>0){ layer = new ArrayList<String>(); for (int it = 0; it < layeringList_node.getLength(); it++) { Element layering_e = (Element) layeringList_node.item(it); NodeList layering_node = layering_e.getElementsByTagName("layering"); Element layering_el = (Element) layering_node.item(0); String layering = getCharacterDataFromElement(layering_el); layer.add(layering); } } //supportedCountersList NodeList supportedCountersList_node = interface_el.getElementsByTagName("supportedCountersList"); if (supportedCountersList_node.getLength()>0){ supportedCounters = new ArrayList<String>(); for (int it = 0; it < supportedCountersList_node.getLength(); it++) { Element supportedCounters_e = (Element) supportedCountersList_node.item(it); NodeList supportedCounters_node = supportedCounters_e.getElementsByTagName("supportedCounters"); Element supportedCounters_el = (Element) supportedCounters_node.item(0); String supportedCounters_s = getCharacterDataFromElement(supportedCounters_el); supportedCounters.add(supportedCounters_s); } } //isPhysical //Is physical Node NodeList isPhysicalIntf_node = interface_el.getElementsByTagName("isPhysical"); boolean isPhysical_intf=true; if (isPhysicalIntf_node.getLength()>0){ Element isPhysical_el = (Element) isPhysicalIntf_node.item(0); String isPhysical_s = getCharacterDataFromElement(isPhysical_el); isPhysical_intf= Boolean.parseBoolean(isPhysical_s); } //Is physical Node NodeList parentInterfaceName_node = interface_el.getElementsByTagName("parentInterfaceName"); String parentInterfaceName=null; if (parentInterfaceName_node.getLength()>0){ Element parentInterfaceName_el = (Element) parentInterfaceName_node.item(0); parentInterfaceName = getCharacterDataFromElement(parentInterfaceName_el); } Intf intf=new Intf(); intf.setLabel(Integer.parseInt(label)); intf.setName(nameIntf); intf.setPhysical(isPhysical_intf); intf.setLayering(layer); intf.setAddress(addressesIntf); intf.setParentInterfaceName(parentInterfaceName); intf.setSupportedCounters(supportedCounters); intf.setIntfUp(intfUp); intfList.add(intf); } } } //domain int domain=1; NodeList domain_node = element.getElementsByTagName("domainID"); if (domain_node.getLength()>0){ Element domain_e = (Element)domain_node.item(0); String domain_s = getCharacterDataFromElement(domain_e); domain= Integer.parseInt(domain_s); } //location NodeList location_node = element.getElementsByTagName("location"); Location location= null; if (location_node.getLength()>0){ Element location_el = (Element) location_node.item(0); //Xcord NodeList Xcord_node = location_el.getElementsByTagName("Xcord"); Element Xcord_el = (Element) Xcord_node.item(0); String Xcord_s = getCharacterDataFromElement(Xcord_el); double Xcord = Double.parseDouble(Xcord_s); //Xcord NodeList Ycord_node = location_el.getElementsByTagName("Ycord"); Element Ycord_el = (Element) Ycord_node.item(0); String Ycord_s = getCharacterDataFromElement(Ycord_el); double Ycord = Double.parseDouble(Ycord_s); location= new Location(Xcord,Ycord); } //ipParams NodeList ipParams_node = element.getElementsByTagName("ipParams"); IPNodeParams ipNodeParams = null; if (ipParams_node.getLength()>0){ ipNodeParams= new IPNodeParams(); } //parentRouter NodeList parentRouter_node = element.getElementsByTagName("parentRouter"); String parentRouter = null; if (parentRouter_node.getLength()>0){ Element parentRouter_e = (Element)parentRouter_node.item(0); parentRouter = getCharacterDataFromElement(parentRouter_e); } Node node = new Node(); node.setNodeID(nodeName); node.setDomain(domain); //ip.setLocation(new Location(1, 1)); node.setPhysical(isPhysical_node); node.setParentRouter(parentRouter); node.setIpParams(ipNodeParams); node.setAddress(addresses); node.setIntfList(intfList); node.setLayer(layerNode); node.setDataPathID(dpid); node.setConfigurationMode(configurationMode); node.setControllerIP(controllerIP); node.setControllerPort(controllerPort); node.setRouterType(routerType); db.getNetworkGraph().addVertex(node); //this.addNode(node); } } NodeList links = element1.getElementsByTagName("link"); if (links.getLength()>0){ for (int i = 0; i < links.getLength(); i++) { Element element = (Element) links.item(i); //linkID NodeList linkID_node = element.getElementsByTagName("linkID"); Element linkID_e = (Element) linkID_node.item(0); String linkID = getCharacterDataFromElement(linkID_e); //isDirectional NodeList isDirectional_node = element.getElementsByTagName("isDirectional"); Element isDirectional_e = (Element) isDirectional_node.item(0); boolean isDirectional = Boolean.parseBoolean(getCharacterDataFromElement(isDirectional_e)); //source NodeList source_node = element.getElementsByTagName("source"); EndPoint source = null; if (source_node.getLength()>0){ Element source_e = (Element) source_node.item(0); //node String node = null; NodeList node_node = source_e.getElementsByTagName("nodeLink"); if (node_node.getLength()>0){ Element node_el = (Element) node_node.item(0); node = getCharacterDataFromElement(node_el); } //intf NodeList intf_node = source_e.getElementsByTagName("intfLink"); String intf =null; if (intf_node.getLength()>0){ Element intf_el = (Element) intf_node.item(0); intf= getCharacterDataFromElement(intf_el); } if ((intf != null)&&(node != null)) source=new EndPoint(node,intf); } //destination NodeList destination_node = element.getElementsByTagName("destination"); EndPoint destination = null; if (destination_node.getLength()>0){ Element destination_e = (Element) destination_node.item(0); //node NodeList node_node = destination_e.getElementsByTagName("nodeLink"); Element node_el = (Element) node_node.item(0); String node = getCharacterDataFromElement(node_el); //intf NodeList intf_node = destination_e.getElementsByTagName("intfLink"); Element intf_el = (Element) intf_node.item(0); String intf = getCharacterDataFromElement(intf_el); destination=new EndPoint(node,intf); } //type String type_link = null; NodeList type_nodeList = element.getElementsByTagName("typeLink"); if (type_nodeList.getLength()>0){ Element type_el = (Element) type_nodeList.item(0); type_link = getCharacterDataFromElement(type_el); } //layerLink String layerLink = null; NodeList layerLink_nodeList = element.getElementsByTagName("layerLink"); if (layerLink_nodeList.getLength()>0){ Element layerLink_el = (Element) layerLink_nodeList.item(0); layerLink = getCharacterDataFromElement(layerLink_el); } Link link = new Link(); link.setLinkID(linkID); link.setSource(source); link.setDest(destination); link.setDirectional(isDirectional); link.setType(type_link); fromLinkToIntradomainlink(link); //this.addLink(layerLink,link); } } } } catch (Exception e) { e.printStackTrace(); } } private void fromLinkToIntradomainlink(Link link){ boolean finished=false; Iterator<Object> vertices=((SimpleTEDB)this.ted.getDB()).getNetworkGraph().vertexSet().iterator(); Node src=null; Node dst=null; while (vertices.hasNext() && !finished){ Node node=(Node) vertices.next(); if (link.getDest().getNode().equals(node.getNodeID())) dst=node; else if (link.getSource().getNode().equals(node.getNodeID())) src=node; } IntraDomainEdge edge= new IntraDomainEdge(); edge.setBw(link.getBandwidth()); edge.setDirectional(link.isDirectional()); edge.setLinkID(link.getLinkID()); edge.setType(link.getType()); edge.setDst_Numif_id(link.getDest()); edge.setSrc_Numif_id(link.getSource()); if (src==null){ log.info("SRC NULL"); } if (dst==null){ log.info("DST NULL"); } ((SimpleTEDB)this.ted.getDB()).getNetworkGraph().addEdge(src, dst, edge); ((SimpleTEDB)this.ted.getDB()).getIntraDomainEdges().add(edge); } 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 "?"; } } @Override public boolean isRunning() { // TODO Auto-generated method stub return isRunning; } @Override public String displayInfo() { String str = getPluginName()+"Status: "; if(isRunning())str+="running"; else str+="stop"; str+="\nImporter from XML file"; return str; } @Override public String getPluginName() { // TODO Auto-generated method stub return "XMLimporter"; } }