package es.tid.topologyModuleBase.COPServiceTopology.model;
import java.net.Inet4Address;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
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.SimpleTEDB;
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 es.tid.topologyModuleBase.COPServiceTopology.model.Edge.EdgeTypeEnum;
public class TranslateModel {
public static Node getNodeById(DomainTEDB db, String nodeId){
for (Object n : db.getIntraDomainLinksvertexSet()){
if(n instanceof es.tid.tedb.elements.Node){
Node node= translateNode(db, (es.tid.tedb.elements.Node)n);
if(node.getNodeId().equals(nodeId)){
return node;
}
}else if(n instanceof Inet4Address){
Node node= translateNodeIp(db, (Inet4Address)n, db.getNodeTable().get(n));
if(node.getNodeId().equals(nodeId)){
return node;
}
}
}
return null;
}
public static Node translateNode(DomainTEDB db, es.tid.tedb.elements.Node n){
//System.out.println("DEBUG translateNode: NodeInput: "+n);
Node node = new Node();
//node.setName(n.getNodeID());
if(n.getAddress().size()>0){
node.setName(n.getAddress().get(0));
}else{
node.setName(n.getNodeID());
}
node.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 Node translateNodeIp(DomainTEDB ted, Inet4Address n, Node_Info nodeInfo) {
Node node = new Node();
System.out.println("DEBUG translateNodeIP, nodeInfo (of node "+n+"):"+nodeInfo);
node.setName(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 EdgeEnd translateEdgeEnd(es.tid.tedb.elements.Node n, es.tid.tedb.elements.Intf i){
EdgeEnd edgeEnd = new EdgeEnd();
edgeEnd.setEdgeEndId(i.getName());
edgeEnd.setName(i.getName());
//edgeEnd.setPeerNodeId(i.getAddress().get(0)); //correct map?
//edgeEnd.setSwitchingCap(SwitchingCapEnum.lsc);
return edgeEnd;
}
public static EdgeEnd translateEdgeEnd(DomainTEDB db, es.tid.tedb.elements.EndPoint e){
EdgeEnd edgeEnd = new EdgeEnd();
edgeEnd.setEdgeEndId(e.getNode()+"-"+e.getIntf());
edgeEnd.setName(e.getNode()+"-"+e.getIntf());
edgeEnd.setPeerNodeId(e.getNode()); //correct map?
//edgeEnd.setSwitchingCap(SwitchingCapEnum.lsc);
return edgeEnd;
}
public static Bitmap translateBitmap(TE_Information te_Information){
Bitmap bitmap = new Bitmap();
return bitmap;
}
public static Edge translateEdge(DomainTEDB db,IntraDomainEdge e){
//if(e.getTE_info()==null){
return translateEthEdge(db, e);
//}else{
// return translateDwdmEdge(db, e);
//}
}
public static Edge translateEdge(MultiDomainTEDB db,InterDomainEdge e){
//if(e.getTE_info()==null){
return translateEthEdge(db, e);
//}else{
// return translateDwdmEdge(db, e);
//}
}
public static DwdmEdge translateDwdmEdge(DomainTEDB db, IntraDomainEdge e){
DwdmEdge dwdmEdge = new DwdmEdge();
dwdmEdge.setName(e.getLinkID());
dwdmEdge.setEdgeId(e.getLinkID());
dwdmEdge.setEdgeType(EdgeTypeEnum.dwdm_edge);
dwdmEdge.setMetric(e.getTemetric()+"");
if(e.getBw()!=null){
dwdmEdge.setMaxResvBw(e.getBw().getMaxBandwidth()+"");
dwdmEdge.setUnreservBw(e.getBw().getUnreservedBw()+"");
}
Object src = e.getSrc_Numif_id();
if( src instanceof es.tid.tedb.elements.EndPoint ){
Node node = TranslateModel.getNodeById( db, ((es.tid.tedb.elements.EndPoint) src).getNode());
dwdmEdge.setSource(node);
for(EdgeEnd end : node.getEdgeEnd()){
if(end.getName().equals(((es.tid.tedb.elements.EndPoint) src).getIntf()) ){
dwdmEdge.setLocalIfid(end);
}
}
}
Object dst = e.getDst_Numif_id();
if( dst instanceof es.tid.tedb.elements.EndPoint ){
Node node = TranslateModel.getNodeById( db, ((es.tid.tedb.elements.EndPoint) dst).getNode());
dwdmEdge.setTarget(node);
for(EdgeEnd end : node.getEdgeEnd()){
if(end.getName().equals(((es.tid.tedb.elements.EndPoint) dst).getIntf()) ){
dwdmEdge.setRemoteIfid(end);
}
}
}
//Write special DWDM fields
if(e.getTE_info().getAvailableLabels()!=null && e.getTE_info().getAvailableLabels().getLabelSet()!=null){
byte[] bytesBitMap = ((BitmapLabelSet)e.getTE_info().getAvailableLabels().getLabelSet()).getBytesBitMap();
List<Integer> lBits = new ArrayList<Integer>();
for(byte b : bytesBitMap){
for(int i=0;i<8;i++){
if(lBits.size()<=((BitmapLabelSet)e.getTE_info().getAvailableLabels().getLabelSet()).getNumLabels())
lBits.add(b|(1<<i));
}
}
Bitmap bitmap = new Bitmap();
bitmap.setArrayBits(lBits);
bitmap.setNumChannels(lBits.size());
dwdmEdge.setBitmap(bitmap);
//TODO codify dwdmEdge.setChannels
//dwdmEdge.setChannels(translateDwdmChannel(e.getTE_info()));
}
return dwdmEdge;
}
public static Edge translateEthEdge(DomainTEDB db,IntraDomainEdge e){
//System.out.println("DEBUG translateEdge: edgeInput= source (class "+e.getSource().getClass()+")="+e.getSource());//+" | getSrc_Numif_id (class "+e.getSrc_Numif_id().getClass()+")="+e.getSrc_Numif_id());
Edge edge = new Edge();
edge.setName(e.getLinkID());
edge.setEdgeId(e.getLinkID());
edge.setEdgeType(EdgeTypeEnum.eth_edge);
edge.setMetric(e.getTemetric()+"");
if(e.getBw()!=null){
edge.setMaxResvBw(e.getBw().getMaxBandwidth()+"");
edge.setUnreservBw(e.getBw().getUnreservedBw()+"");
}
Object src = e.getSrc_Numif_id();
if( e.getSource() instanceof java.net.Inet4Address){
Node node = TranslateModel.getNodeById( db, ((java.net.Inet4Address)e.getSource()).getHostAddress());
edge.setSource(node);
for(EdgeEnd end : node.getEdgeEnd()){
if(end.getName().equals(e.getSrc_if_id())){
edge.setLocalIfid(end);
}
}
}else if( src instanceof es.tid.tedb.elements.EndPoint ){
Node node = TranslateModel.getNodeById( db, ((es.tid.tedb.elements.Node)e.getSource()).getNodeID());
edge.setSource(node);
for(EdgeEnd end : node.getEdgeEnd()){
if(end.getName().equals(((es.tid.tedb.elements.EndPoint) src).getIntf()) ){
edge.setLocalIfid(end);
}
}
}
Object dst = e.getDst_Numif_id();
if( e.getTarget() instanceof java.net.Inet4Address){
Node node = TranslateModel.getNodeById( db, ((java.net.Inet4Address)e.getTarget()).getHostAddress());
edge.setTarget(node);
for(EdgeEnd end : node.getEdgeEnd()){
if(end.getName().equals(e.getDst_if_id())){
edge.setRemoteIfid(end);
}
}
}else if( dst instanceof es.tid.tedb.elements.EndPoint ){
Node node = TranslateModel.getNodeById( db, ((es.tid.tedb.elements.EndPoint) dst).getNode());
edge.setTarget(node);
for(EdgeEnd end : node.getEdgeEnd()){
if(end.getName().equals(((es.tid.tedb.elements.EndPoint) dst).getIntf()) ){
edge.setRemoteIfid(end);
}
}
}
return edge;
}
public static Edge translateEthEdge(MultiDomainTEDB db,InterDomainEdge e){
//System.out.println("DEBUG translateEdge: edgeInput= source (class "+e.getSource().getClass()+")="+e.getSource());//+" | getSrc_Numif_id (class "+e.getSrc_Numif_id().getClass()+")="+e.getSrc_Numif_id());
Edge edge = new Edge();
edge.setName(e.domain_src_router.toString()+":"+e.domain_dst_router.toString());
edge.setEdgeId("0");
edge.setEdgeType(EdgeTypeEnum.eth_edge);
if (e.getTE_info()!=null) {
if (e.getTE_info().getDefaultTEMetric()!=null) {
edge.setMetric(e.getTE_info().getDefaultTEMetric().toString());
}
if (e.getTE_info().getMaximumBandwidth()!=null) {
edge.setMaxResvBw(e.getTE_info().getMaximumBandwidth().toString());
}
if (e.getTE_info().getUnreservedBandwidth()!=null) {
edge.setMaxResvBw(e.getTE_info().getUnreservedBandwidth().toString());
}
}
// edge.s
Node src_node = new Node();
if (e.getDomain_src_router() instanceof Inet4Address) {
src_node.setDomain(((Inet4Address)(e.getDomain_src_router())).getHostName());
} else {
src_node.setDomain(e.getDomain_src_router().toString());
}
if (e.getSrc_router_id() instanceof Inet4Address) {
src_node.setNodeId(((Inet4Address)(e.getSrc_router_id())).getHostName());
}else {
src_node.setNodeId(e.getSrc_router_id().toString());
}
edge.setSource(src_node);
Node dst_node = new Node();
dst_node.setDomain(e.getDomain_dst_router().toString());
dst_node.setNodeId(e.getDst_router_id().toString());
edge.setTarget(dst_node);
// node.setDomain(de)
//
// Object src = e.getSrc_Numif_id();
//
// if( e.getSource() instanceof java.net.Inet4Address){
// Node node = TranslateModel.getNodeById( db, ((java.net.Inet4Address)e.getSource()).getHostAddress());
// edge.setSource(node);
// for(EdgeEnd end : node.getEdgeEnd()){
// if(end.getName().equals(e.getSrc_if_id())){
// edge.setLocalIfid(end);
// }
// }
// }else if( src instanceof es.tid.tedb.elements.EndPoint ){
//
// Node node = TranslateModel.getNodeById( db, ((es.tid.tedb.elements.Node)e.getSource()).getNodeID());
// edge.setSource(node);
// for(EdgeEnd end : node.getEdgeEnd()){
// if(end.getName().equals(((es.tid.tedb.elements.EndPoint) src).getIntf()) ){
// edge.setLocalIfid(end);
// }
// }
//
// }
//
// Object dst = e.getDst_Numif_id();
// if( e.getTarget() instanceof java.net.Inet4Address){
// Node node = TranslateModel.getNodeById( db, ((java.net.Inet4Address)e.getTarget()).getHostAddress());
// edge.setTarget(node);
// for(EdgeEnd end : node.getEdgeEnd()){
// if(end.getName().equals(e.getDst_if_id())){
// edge.setRemoteIfid(end);
// }
// }
// }else if( dst instanceof es.tid.tedb.elements.EndPoint ){
// Node node = TranslateModel.getNodeById( db, ((es.tid.tedb.elements.EndPoint) dst).getNode());
// edge.setTarget(node);
// for(EdgeEnd end : node.getEdgeEnd()){
// if(end.getName().equals(((es.tid.tedb.elements.EndPoint) dst).getIntf()) ){
// edge.setRemoteIfid(end);
// }
// }
// }
return edge;
}
/*private Edge translateEdge(InterDomainEdge e){
Edge edge = new Edge();
edge.setName(e.getDomain_src_router()+"-"+e.getDomain_dst_router());
edge.setEdgeId(e.hashCode()+"");
if(e.getType().equals("")){
edge.setEdgeType(EdgeTypeEnum.dwdm_edge);
}else if(e.getType().equals("")){
edge.setEdgeType(EdgeTypeEnum.eth_edge);
}
edge.setMetric(e.get+"");
edge.setMaxResvBw(e.getBw().getMaxBandwidth()+"");
edge.setUnreservBw(e.getBw().getUnreservedBw()+"");
edge.setSource( translateNode(e.getLocal_Node_Info()) );
edge.setTarget( translateNode(e.getRemote_Node_Info()) );
//edge.setLocalIfid( translateEdgeEnd(e.getSrc_if_id())) );
//edge.setRemoteIfid( translateEdgeEnd(e.getDst_if_id()) );
return edge;
}*/
public static DwdmChannel translateDwdmChannel(TE_Information te_Information){
DwdmChannel dwdmChannel = new DwdmChannel();
return dwdmChannel;
}
public static Topology translateTopology(String topId, DomainTEDB ted){
//System.out.println("DEBUG translateTopology: TEDinput: "+ted.printTopology());
Topology topology = new Topology();
/*if(ted==null){
topology.setTopologyId("topology null Exception");
return topology;
}
if(ted.getDomainID()==null){
topology.setTopologyId("getDomainID null Exception");
return topology;
}*/
topology.setTopologyId(topId);
List<Edge> edges = new ArrayList<Edge>();
for(IntraDomainEdge link : ted.getIntraDomainLinks()){
edges.add(translateEdge(ted, link));
}
topology.setEdges(edges);
List<Node> nodes = new ArrayList<Node>();
for(Object node : ted.getIntraDomainLinksvertexSet()){
// System.out.println("DEBUG nodeInTopology, (class "+node.getClass()+"):" +node );
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.setNodes(nodes);
//topology.setUnderlayTopology(); //TODO
return topology;
}
public static Topology translateTopology(String topId, MultiDomainTEDB ted){
//System.out.println("DEBUG translateTopology: TEDinput: "+ted.printTopology());
Topology topology = new Topology();
/*if(ted==null){
topology.setTopologyId("topology null Exception");
return topology;
}
if(ted.getDomainID()==null){
topology.setTopologyId("getDomainID null Exception");
return topology;
}*/
topology.setTopologyId(topId);
List<Edge> edges = new ArrayList<Edge>();
for(InterDomainEdge link : ted.getInterDomainLinks()){
edges.add(translateEdge(ted, link));
}
topology.setEdges(edges);
// List<Node> nodes = new ArrayList<Node>();
// for(Object node : ted.getIntraDomainLinksvertexSet()){
// // System.out.println("DEBUG nodeInTopology, (class "+node.getClass()+"):" +node );
// 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.setNodes(nodes);
//topology.setUnderlayTopology(); //TODO
return topology;
}
public static es.tid.tedb.elements.Node translate2Node(Node node) {
es.tid.tedb.elements.Node n = new es.tid.tedb.elements.Node();
n.setNodeID(node.getName());
n.setDomain(Integer.parseInt(node.getDomain()));
n.setLayer(node.getNodetype());
n.setNodeID(node.getNodeId());
try{
Inet4Address addr = (Inet4Address)Inet4Address.getByName(node.getName());
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()){
intList.add(translate2EdgeEnd(node, end));
}
n.setIntfList(intList);
return n;
}
private static Intf translate2EdgeEnd(Node 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;
}
public static Link translate2Link(Edge e) {
System.out.println("translate2Link, Edge: "+e);
Link link= new Link();
link.setLinkID(e.getEdgeId());
link.setSource(translate2EndPoint(e.getSource(),e.getLocalIfid()));
link.setDest(translate2EndPoint(e.getTarget(), e.getRemoteIfid()));
link.setDirectional(false);
if(e.getEdgeType() != null){
link.setType(e.getEdgeType().toString());
}
return link;
}
private static EndPoint translate2EndPoint(Node source, EdgeEnd edgeEnd) {
System.out.println("translate2EndPoint, node: "+source+"\nEdgeEnd: "+edgeEnd);
return (new EndPoint(source.getNodeId(),edgeEnd.getName()));
}
}