package es.tid.topologyModuleBase.IETFTopoModel.model;
import es.tid.ospf.ospfv2.lsa.tlv.subtlv.complexFields.BitmapLabelSet;
import es.tid.tedb.DomainTEDB;
import es.tid.tedb.InterDomainEdge;
import es.tid.tedb.IntraDomainEdge;
import es.tid.tedb.MultiDomainTEDB;
import es.tid.tedb.Node_Info;
import es.tid.tedb.TEDB;
import es.tid.tedb.TE_Information;
import es.tid.tedb.elements.EndPoint;
import es.tid.tedb.elements.Intf;
import es.tid.tedb.elements.Link;
import java.net.Inet4Address;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
/**
* This class is used to translate TEDB model to a topology container following
* IETEF model.
*/
public class TranslateModel {
public static NetworksSchemaNode getNodeById(DomainTEDB db, String nodeId){
for (Object n : db.getIntraDomainLinksvertexSet()){
if(n instanceof es.tid.tedb.elements.Node){
NetworksSchemaNode node= translateNode(db, (es.tid.tedb.elements.Node)n);
if(node.getNodeId().equals(nodeId)){
return node;
}
}else if(n instanceof Inet4Address){
NetworksSchemaNode node= translateNodeIp(db, (Inet4Address)n, db.getNodeTable().get(n));
if(node.getNodeId().equals(nodeId)){
return node;
}
}
}
return null;
}
/**
* This method translate a MultiDomainTEDB object to a NetworksSchemaNetwork
* @param topId String with the identification for the current multi domain
* model.
* @param ted MultiDomainTEDB object.
* @return Network topology container object.
*/
public static NetworksSchemaNetwork translateTopology(String topId, MultiDomainTEDB ted){
// TODO: Need to be developed.
NetworksSchemaNetwork topology = common(topId, ted);
// LinkedList<InterDomainEdge> ted.getInterDomainLinks();
/*List<InterDomainEdge> node = new ArrayList<InterDomainEdge>();
for(InterDomainEdge link : ted.getInterDomainLinks()){
node.add(translateEdge(ted, link));
}
topology.setNode(node);
topology.setNode(node);.setEdges(node);
*/
return topology;
}
/**
* This method translate a DomainTEDB object to a NetworksSchemaNetwork
* @param topId String with the identification for the current domain model.
* @param ted DomainTEDB object.
* @return Network topology container object.
*/
public static NetworksSchemaNetwork translateTopology(String topId, DomainTEDB ted) {
NetworksSchemaNetwork topology = common(topId, ted);
List<NetworksSchemaNode> nodes = new ArrayList<NetworksSchemaNode>();
for(Object node : ted.getIntraDomainLinksvertexSet()){
if(node instanceof es.tid.tedb.elements.Node){
nodes.add(translateNode(ted, (es.tid.tedb.elements.Node)node));
}
else if(node instanceof java.net.Inet4Address){
nodes.add(translateNodeIp(ted, (java.net.Inet4Address)node, ted.getNodeTable().get(node)));
}
}
topology.setNode(nodes);
return topology;
}
public static NetworksSchemaNode translateNode(DomainTEDB db, es.tid.tedb.elements.Node n){
//System.out.println("DEBUG translateNode: NodeInput: "+n);
NetworksSchemaNode node = new NetworksSchemaNode();
//node.setName(n.getNodeID());
if(n.getAddress().size()>0){
node.setNodeId(n.getAddress().get(0));
}else{
node.setNodeId(n.getNodeID());
}
//node.s.setDomain(n.getDomain()+"");
//node.setNodetype(n.getLayer());
//node.setNodeId(n.getNodeID());
//List<EdgeEnd>intList = new ArrayList<EdgeEnd>();
//for (es.tid.tedb.elements.Intf i : n.getIntfList()){
//intList.add(translateEdgeEnd( n, i));
//}
//node.setEdgeEnd(intList);
////node.setUnderlayAbstractTopology(underlayAbstractTopology);
return node;
}
public static NetworksSchemaNode translateNodeIp(DomainTEDB ted, Inet4Address n, Node_Info nodeInfo) {
NetworksSchemaNode node = new NetworksSchemaNode();
System.out.println("DEBUG translateNodeIP, nodeInfo (of node "+n+"):"+nodeInfo);
node.setNodeId(n.getHostAddress());
//node.setNodeId(n.getHostAddress());
if(nodeInfo==null){
System.out.println("No node Info: DomainID:"+ted.getDomainID());
//node.setDomain(ted.getDomainID().getHostAddress());
}else{
//node.setDomain(nodeInfo.getAs_number().getHostAddress());
}
//node.setEdgeEnd(new ArrayList<EdgeEnd>());
return node;
}
public static es.tid.tedb.elements.Node translate2Node(NodeSchema node) {
es.tid.tedb.elements.Node n = new es.tid.tedb.elements.Node();
//n.setNodeID(node.getName());
n.setNodeID(node.getNodeId());
//n.setDomain(Integer.parseInt(node.getDomain()));
//n.setLayer(node.getNodetype());
n.setNodeID(node.getNodeId());
try{
//Inet4Address addr = (Inet4Address)Inet4Address.getByName(node.getName());
Inet4Address addr = (Inet4Address)Inet4Address.getByName(node.getNodeId());
ArrayList<String> l_addr= new ArrayList<String>();
l_addr.add(addr.getHostAddress());
n.setAddress(l_addr);
}catch(UnknownHostException e){
//TODO
}
// ArrayList<es.tid.tedb.elements.Intf>intList = new ArrayList<es.tid.tedb.elements.Intf>();
// //for (EdgeEnd end : node.getEdgeEnd()){
// for (EdgeEnd end : node.getEdgeEnd()){
// intList.add(translate2EdgeEnd(node, end));
// }
//n.setIntfList(intList);
return n;
}
// private static Intf translate2EdgeEnd(NodeSchema node, EdgeEnd edgeEnd) {
// Intf intf = new Intf();
// intf.setName(edgeEnd.getName());
// ArrayList<String> adds = new ArrayList<String>(1);
// adds.add(edgeEnd.getPeerNodeId());
// intf.setAddress(adds);
// //edgeEnd.setEdgeEndId(e.getNode()+"-"+e.getIntf());
// //edgeEnd.setName(e.getNode()+"-"+e.getIntf());
// //edgeEnd.setPeerNodeId(e.getNode()); //correct map?
// //edgeEnd.setSwitchingCap(SwitchingCapEnum.lsc);
// return intf;
// }
/**
* Common code for the previous methods.
* @param topId String with the identification for the current domain model.
* @param ted TEDB object.
* @return Initialized NetworksSchemaNetwork object.
*/
private static NetworksSchemaNetwork common(String topId, TEDB ted){
NetworksSchemaNetwork topology = new NetworksSchemaNetwork();
topology.setNetworkId(topId);
return topology;
}
}