package es.tid.topologyModuleBase; import es.tid.topologyModuleBase.util.UtilsFunctions; import org.w3c.dom.CharacterData; import org.w3c.dom.*; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.io.File; import java.util.ArrayList; import java.util.logging.Logger; /** * * @author La humiltat * */ public class TopologyModuleParamsArray { private ArrayList<TopologyModuleParams> paramList; /** * */ private int managementPort; /** * */ private String managementIP; /** * Logger */ private static Logger log=Logger.getLogger("TMController"); /** * Name of the configuration file */ private String confFile; public TopologyModuleParamsArray(String confFile) { paramList = new ArrayList<TopologyModuleParams>(); if (confFile!=null){ this.setConfFile(confFile); } else { confFile="TMConfiguration.xml"; } } public TopologyModuleParamsArray(){ paramList = new ArrayList<TopologyModuleParams>(); setConfFile("TMConfiguration.xml"); } public void initialize() { log.info("Reading from file::"+this.confFile); try { DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); File confFile = new File(this.confFile); Document doc = builder.parse(confFile); managementPort = Integer.parseInt((getCharacterDataFromElement((Element) doc.getElementsByTagName("managementPort").item(0)))); managementIP = getCharacterDataFromElement((Element) doc.getElementsByTagName("managementIP").item(0)); NodeList list_nodes_OSPF = doc.getElementsByTagName("OSPF"); for (int i = 0; i < list_nodes_OSPF.getLength(); i++) { TopologyModuleParams littleParams = new TopologyModuleParams(); Element nodes_OSPF = (Element) list_nodes_OSPF.item(i); littleParams.setOSPFSession(Boolean.parseBoolean((getCharacterDataFromElement((Element) nodes_OSPF.getElementsByTagName("OSPFSession").item(0))))); littleParams.setOSPFListenerIP(getCharacterDataFromElement((Element) nodes_OSPF.getElementsByTagName("OSPFListenerIP").item(0))); littleParams.setReachabilityFile(getCharacterDataFromElement((Element) nodes_OSPF.getElementsByTagName("reachabilityFile").item(0))); littleParams.setOSPFMulticast(Boolean.parseBoolean((getCharacterDataFromElement((Element) nodes_OSPF.getElementsByTagName("OSPFMulticast").item(0))))); littleParams.setOSPFUnicast(Boolean.parseBoolean((getCharacterDataFromElement((Element) nodes_OSPF.getElementsByTagName("OSPFUnicast").item(0))))); littleParams.setOSPFTCPSession(Boolean.parseBoolean((getCharacterDataFromElement((Element) nodes_OSPF.getElementsByTagName("OSPFTCPSession").item(0))))); littleParams.setOSPF(true); paramList.add(littleParams); } NodeList list_nodes_Openflow = doc.getElementsByTagName("Openflow"); for (int i = 0; i < list_nodes_Openflow.getLength(); i++) { TopologyModuleParams littleParams = new TopologyModuleParams(); Element nodes_Openflow = (Element) list_nodes_Openflow.item(i); littleParams.setControllerIP(getCharacterDataFromElement((Element) nodes_Openflow.getElementsByTagName("ControllerIP").item(0))); littleParams.setControllerPORT(getCharacterDataFromElement((Element) nodes_Openflow.getElementsByTagName("ControllerPort").item(0))); littleParams.setTopologyPath(getCharacterDataFromElement((Element) nodes_Openflow.getElementsByTagName("ControllerTopoQueryLinks").item(0))); littleParams.setTopologyNodesPath(getCharacterDataFromElement((Element) nodes_Openflow.getElementsByTagName("ControllerTopoQueryNodes").item(0))); littleParams.setControllerListFile(getCharacterDataFromElement((Element) nodes_Openflow.getElementsByTagName("controllerListFile").item(0))); littleParams.setInterDomainFile(getCharacterDataFromElement((Element) nodes_Openflow.getElementsByTagName("interDomainFile").item(0))); littleParams.setFloodLight(true); paramList.add(littleParams); } NodeList list_nodes_Gson = doc.getElementsByTagName("Gson"); for (int i = 0; i < list_nodes_Gson.getLength(); i++) { TopologyModuleParams littleParams = new TopologyModuleParams(); Element nodes_Gson = (Element) list_nodes_Gson.item(i); littleParams.setGsonPort(Integer.parseInt(getCharacterDataFromElement((Element) nodes_Gson.getElementsByTagName("GsonPort").item(0)))); littleParams.setGSON(true); paramList.add(littleParams); } NodeList list_nodes_XML = doc.getElementsByTagName("XML"); for (int i = 0; i < list_nodes_XML.getLength(); i++) { Element nodes_xml = (Element) list_nodes_XML.item(i); TopologyModuleParams littleParams = new TopologyModuleParams(); littleParams.setModexml(getCharacterDataFromElement(((Element) nodes_xml.getElementsByTagName("mode").item(0)))); littleParams.setNetworkDescriptionFile(getCharacterDataFromElement(((Element) nodes_xml.getElementsByTagName("XMLFileTopology").item(0)))); littleParams.setXML(true); if (littleParams.getModexml()=="TM") littleParams.setIdentifier(getCharacterDataFromElement(((Element) nodes_xml.getElementsByTagName("Identifier").item(0)))); log.info("XML configured with file: "+littleParams.getNetworkDescriptionFile()); paramList.add(littleParams); } NodeList list_nodes_COP = doc.getElementsByTagName("COP"); for (int i = 0; i < list_nodes_COP.getLength(); i++) { Element nodes_cop = (Element) list_nodes_COP.item(i); TopologyModuleParams littleParams = new TopologyModuleParams(); if(nodes_cop.getElementsByTagName("import_ip").getLength()>0){ littleParams.setRemoteCOPhost((getCharacterDataFromElement(((Element) nodes_cop.getElementsByTagName("import_ip").item(0))))); littleParams.setRemoteCOPPort(Integer.parseInt((getCharacterDataFromElement(((Element) nodes_cop.getElementsByTagName("import_port").item(0)))))); littleParams.setCOPReading(true); } if(nodes_cop.getElementsByTagName("serve_port").getLength()>0){ littleParams.setExportCOPPort(Integer.parseInt((getCharacterDataFromElement(((Element) nodes_cop.getElementsByTagName("serve_port").item(0)))))); littleParams.setCOPWriting(true); } paramList.add(littleParams); } NodeList list_nodes_IETF = doc.getElementsByTagName("IETF"); for (int i = 0; i < list_nodes_IETF.getLength(); i++) { Element nodes_IETF = (Element) list_nodes_IETF.item(i); TopologyModuleParams littleParams = new TopologyModuleParams(); if(nodes_IETF.getElementsByTagName("import_ip").getLength()>0){ littleParams.setRemoteIETFhost((getCharacterDataFromElement(((Element) nodes_IETF.getElementsByTagName("import_ip").item(0))))); littleParams.setRemoteIETFPort(Integer.parseInt((getCharacterDataFromElement(((Element) nodes_IETF.getElementsByTagName("import_port").item(0)))))); littleParams.setIETFReading(true); } if(nodes_IETF.getElementsByTagName("serve_port").getLength()>0){ littleParams.setExportIETFPort(Integer.parseInt((getCharacterDataFromElement(((Element) nodes_IETF.getElementsByTagName("serve_port").item(0)))))); littleParams.setIETFWritting(true); } paramList.add(littleParams); } NodeList list_nodes_Unify = doc.getElementsByTagName("UNIFY"); for (int i = 0; i < list_nodes_Unify.getLength(); i++) { Element nodes_Unify = (Element) list_nodes_Unify.item(i); TopologyModuleParams littleParams = new TopologyModuleParams(); if(nodes_Unify.getElementsByTagName("import_ip").getLength()>0){ littleParams.setRemoteUnifyhost((getCharacterDataFromElement(((Element) nodes_Unify.getElementsByTagName("import_ip").item(0))))); littleParams.setRemoteUnifyPort(Integer.parseInt((getCharacterDataFromElement(((Element) nodes_Unify.getElementsByTagName("import_port").item(0)))))); littleParams.setUnifyReading(true); } if(nodes_Unify.getElementsByTagName("serve_port").getLength()>0){ littleParams.setExportUnifyPort(Integer.parseInt((getCharacterDataFromElement(((Element) nodes_Unify.getElementsByTagName("serve_port").item(0)))))); littleParams.setUnifyWritting(true); } paramList.add(littleParams); } NodeList list_nodes_BGPLS = doc.getElementsByTagName("BGPLS"); for (int i = 0; i < list_nodes_BGPLS.getLength(); i++) { TopologyModuleParams littleParams = new TopologyModuleParams(); Element nodes_BGPLS= (Element) list_nodes_BGPLS.item(i); littleParams.setBGPSConfigurationFile(getCharacterDataFromElement((Element) nodes_BGPLS.getElementsByTagName("BGPLSconfigFile").item(0))); // Flag for detect the operation mode (r, w, r/w). Boolean fWriter = getPeerModeTagValue(nodes_BGPLS, "Writer"); // Write flag. Boolean fReader = getPeerModeTagValue(nodes_BGPLS, "Reader"); // Reader flag if(!fReader && !fWriter){ log.warning("BGPLS not configured properly (Neither a sender nor a receiver or sender/receiver). Please check .xml file"); } else { littleParams.setBGPLSReaderWriting(fReader && fWriter); // Reader/Writter plugin littleParams.setBGPLSReading(fReader && !fWriter); // Reader plugin. littleParams.setBGPLSWriting(!fReader && fWriter); // Writer plugin. log.info("BGPLS configured as " + getModeStr(littleParams)); } paramList.add(littleParams); } NodeList list_nodes_ws = doc.getElementsByTagName("WSOld"); for (int i = 0; i < list_nodes_ws.getLength(); i++) { Element nodes_ws = (Element) list_nodes_ws.item(i); TopologyModuleParams littleParams = new TopologyModuleParams(); littleParams.setIpWSOld(getCharacterDataFromElement(((Element) nodes_ws.getElementsByTagName("ip").item(0)))); littleParams.setPortWSOld(Integer.parseInt(getCharacterDataFromElement(((Element) nodes_ws.getElementsByTagName("port").item(0))))); littleParams.setWSOld(true); paramList.add(littleParams); } } catch (Exception e) { log.info(UtilsFunctions.exceptionToString(e)); } } //Private functions /** * This method gets the value from an XML element. * @param e XML Element. * @return Value as string. */ private String getCharacterDataFromElement(Element e) { if (e == null) { return null; } Node child = e.getFirstChild(); if (child instanceof CharacterData) { CharacterData cd = (CharacterData) child; return cd.getData(); } else { return "?"; } } /** * This method is used to verify if the XML contains the following tags "Reader" and "Writer". If the tags are * available, returns its value. If it isn't present, returns false. * @param nodes_BGPLS Element object with the "nodes_BGPLS" xml data. * @param tag XML tag name. This field can be "Reader" or "Writer" (case sensitive). * @return Returns a boolean with the xml tag value. If this tag is not present, then returns false as default. */ private boolean getPeerModeTagValue(Element nodes_BGPLS, String tag){ if (getCharacterDataFromElement((Element) nodes_BGPLS.getElementsByTagName(tag).item(0)).equalsIgnoreCase("True")) { return true; } return false; } /** * This method is used for returns the operation mode as String. * @param littleParams Topology object. * @return The name of the operation mode as string: Reader, Reader/Writer, Writer. If the operation mode is not * available, it returns "N/A". */ private String getModeStr(TopologyModuleParams littleParams) { if(littleParams.isBGPLSReading()){ return "Reader"; } else if (littleParams.isBGPLSReadingWriting()){ return "Reader/Writer"; } else if (littleParams.isBGPLSWriting()){ return "Writer"; } return "N/A"; } //GETTERS AND SETTERS public int getMangementPort() { return managementPort; } public void setMangementPort(int mangementPort) { this.managementPort = mangementPort; } public String getMangementIP() { return managementIP; } public void setMangementIP(String mangementIP) { this.managementIP = mangementIP; } public String getConfFile() { return confFile; } public void setConfFile(String confFile) { this.confFile = confFile; } public ArrayList<TopologyModuleParams> getParamList() { return paramList; } public void setParamList(ArrayList<TopologyModuleParams> paramList) { this.paramList = paramList; } }