package es.tid.pce.server;
import java.net.Inet4Address;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.gson.Gson;
import redis.clients.jedis.Jedis;
import es.tid.pce.parentPCE.MD_LSP;
import es.tid.pce.parentPCE.MDLSPDB.SimpleLSP;
import es.tid.pce.parentPCE.MDLSPDB.SimpleLSPhop;
import es.tid.pce.pcep.objects.ExplicitRouteObject;
import es.tid.pce.pcep.objects.LSP;
import es.tid.pce.server.RedisDatabaseHandler;
import es.tid.pce.server.lspdb.SingleDomainLSPDB;
import es.tid.rsvp.objects.subobjects.EROSubobject;
import es.tid.rsvp.objects.subobjects.ETCEROSubobject;
import es.tid.rsvp.objects.subobjects.GeneralizedLabelEROSubobject;
import es.tid.rsvp.objects.subobjects.IPv4prefixEROSubobject;
import es.tid.rsvp.objects.subobjects.LabelEROSubobject;
import es.tid.rsvp.objects.subobjects.UnnumberIfIDEROSubobject;
import es.tid.tedb.IntraDomainEdge;
import es.tid.tedb.MultiDomainTEDB;
import es.tid.tedb.SimpleTEDB;
public class SaveLSPinRedisSingleDom implements Runnable {
private Hashtable <Integer,SD_LSP> LSP_list;
private Hashtable <Integer,SD_LSP> LSP_list_old;
private Hashtable <Integer,SD_LSP> LSP_list_to_add;
private Hashtable <Integer,SD_LSP> LSP_list_to_del;
private Logger log;
Jedis jedis;
public SaveLSPinRedisSingleDom () {
log = LoggerFactory.getLogger("BGP4Parser");
}
public void configure( SingleDomainLSPDB singleDomainLSPDB, String host, int port){
jedis = new Jedis(host,port);
jedis.connect();
this.LSP_list=singleDomainLSPDB.getSingleDomain_LSP_list();
}
public void run(){
log.info("Going to save LSP in DB");
//LSPs to add
LSP_list_to_add=new Hashtable <Integer,SD_LSP>();
LSP_list_to_del=new Hashtable <Integer,SD_LSP>();
if (LSP_list!=null){
if (LSP_list_old==null){
LSP_list_old= new Hashtable <Integer,SD_LSP>();
Enumeration<Integer>ids=LSP_list.keys();
while (ids.hasMoreElements()){
Integer id=ids.nextElement();
LSP_list_old.put(id, LSP_list.get(id));
LSP_list_to_add.put(id, LSP_list.get(id));
}
}else {
Enumeration<Integer>ids=LSP_list.keys();
while (ids.hasMoreElements()){
Integer id=ids.nextElement();
if (!(LSP_list_old.containsKey(id))){
LSP_list_to_add.put(id, LSP_list.get(id));
LSP_list_old.put(id, LSP_list.get(id));
}
}
ids=LSP_list_old.keys();
while (ids.hasMoreElements()){
Integer id=ids.nextElement();
if (!(LSP_list.containsKey(id))){
LSP_list_to_del.put(id, LSP_list.get(id));
//multiDomain_LSP_list_old.remove(id);
}
}
ids=LSP_list_to_del.keys();
while (ids.hasMoreElements()){
Integer id=ids.nextElement();
LSP_list_old.remove(id);
}
}
Enumeration<Integer>ids=LSP_list_to_add.keys();
while (ids.hasMoreElements()){
Integer id=ids.nextElement();
String key;
String value;
key="LSP:"+id;
value=lspToJSON(LSP_list_to_add.get(id));
jedis.set(key,value);
jedis.sadd("lsps",key);
}
//LSPs to delete
ids=LSP_list_to_del.keys();
while (ids.hasMoreElements()){
Integer id=ids.nextElement();
String key;
key="LSP:"+id;
jedis.del(key);
jedis.srem("lsps",key);
}
}
}
public String lspToJSON(SD_LSP lsp){
Gson gson = new Gson();
SimpleLSP slsp=new SimpleLSP();
slsp.setLSP_Id(lsp.getpLSPID());
ExplicitRouteObject ero=lsp.getFullERO();
log.info("lsp.getFullERO(): "+ero.toString());
Iterator <EROSubobject> erosolist= ero.getEROSubobjectList().iterator();
int num=0;
while (erosolist.hasNext()){
EROSubobject eroso= erosolist.next();
if (eroso instanceof UnnumberIfIDEROSubobject){
num+=1;
}else if(eroso instanceof IPv4prefixEROSubobject){
num+=1;
}
}
slsp.data=new SimpleLSPhop[num];
//slsp.data=new SimpleLSPhop[15];
erosolist= ero.getEROSubobjectList().iterator();
int i=-1;
while (erosolist.hasNext()){
//i++;
EROSubobject eroso= erosolist.next();
log.info("eroso: "+eroso.toString());
log.info("ero num: eroso.getType(): "+eroso.getType());
log.info("ero class "+eroso.getClass().getCanonicalName());
// i+=1;
// slsp.data[i]=new SimpleLSPhop();
if (eroso instanceof UnnumberIfIDEROSubobject){//type 4
i+=1;
log.info("EROSubObject: UnnumberIfIDEROSubobject");
log.info("UnnumberIfIDEROSubobject i:"+i);
slsp.data[i]=new SimpleLSPhop();
slsp.data[i].routerID= ((UnnumberIfIDEROSubobject)eroso).routerID.getHostAddress();
slsp.data[i].ifID= ""+((UnnumberIfIDEROSubobject)eroso).interfaceID;
log.info("UnnumberIfIDEROSubobject slsp.data[i].routerID is: " +slsp.data[i].routerID);
log.info("UnnumberIfIDEROSubobject slsp.data[i].ifID is: " +slsp.data[i].ifID);
}else if (eroso instanceof GeneralizedLabelEROSubobject){//type 2
log.info("EROSubObject: GeneralizedLabelEROSubobject");
log.info("GeneralizedLabelEROSubobject i:"+i);
if (slsp.data[i]!=null){
slsp.data[i].n=""+ ((GeneralizedLabelEROSubobject)eroso).getDwdmWavelengthLabel().getN();
slsp.data[i].m=""+ ((GeneralizedLabelEROSubobject)eroso).getDwdmWavelengthLabel().getM();
log.info("GeneralizedLabelEROSubobject slsp.data[i].n is: " +slsp.data[i].n);
log.info("GeneralizedLabelEROSubobject slsp.data[i].m is: " +slsp.data[i].m);
}
}else if (eroso instanceof ETCEROSubobject){
log.info("EROSubObject: ETCEROSubobject");
log.info("ETCEROSubobject i:"+i);
if (slsp.data[i]!=null){
slsp.data[i].transponder="TX "+((ETCEROSubobject)eroso).getSubTransponderList().get(0).getST_TLV_ModFormat().toString();
}
}else if (eroso instanceof IPv4prefixEROSubobject){ //type 1
i+=1;
log.info("EROSubObject: IPv4prefixEROSubobject");
log.info("IPv4prefixEROSubobject i:"+i);
slsp.data[i]=new SimpleLSPhop();
if (slsp.data[i]!=null){
log.info("slsp.data[i] is: " +slsp.data[i]);
slsp.data[i].routerID= ((IPv4prefixEROSubobject)eroso).getIpv4address().getHostAddress();
log.info("slsp.data[i].routerID is: " +slsp.data[i].routerID);
}else{
log.info("slsp.data[i] is: " +slsp.data[i]);}
}
}
String json = gson.toJson(slsp);
log.info("json:"+json.toString());
return json;
}
//Este es el que funciona
// public String lspToJSON(SD_LSP lsp){
//
// Gson gson = new Gson();
//
// SimpleLSP slsp=new SimpleLSP();
//
// log.info("XXXX LSP_Id JSON: lsp.getpLSPID()" + lsp.getpLSPID());
// log.info("XXXX LSP_Id JSON: slsp.getLSP_Id()" + slsp.getLSP_Id());
//
//
// ExplicitRouteObject ero=lsp.getFullERO();
// Iterator <EROSubobject> erosolist= ero.getEROSubobjectList().iterator();
// int num=0;
// while (erosolist.hasNext()){
// EROSubobject eroso= erosolist.next();
// if (eroso instanceof UnnumberIfIDEROSubobject){
// num+=1;
// }
// }
// slsp.data=new SimpleLSPhop[num];
//
// erosolist= ero.getEROSubobjectList().iterator();
// int i=-1;
// while (erosolist.hasNext()){
// EROSubobject eroso= erosolist.next();
// if (eroso instanceof UnnumberIfIDEROSubobject){
// i+=1;
// slsp.data[i]=new SimpleLSPhop();
// slsp.data[i].routerID= ((UnnumberIfIDEROSubobject)eroso).routerID.getHostAddress();
// slsp.data[i].ifID= ""+((UnnumberIfIDEROSubobject)eroso).interfaceID;
// }else if (eroso instanceof GeneralizedLabelEROSubobject){
// if (slsp.data[i]!=null){
// slsp.data[i].n=""+ ((GeneralizedLabelEROSubobject)eroso).getDwdmWavelengthLabel().getN();
// slsp.data[i].m=""+ ((GeneralizedLabelEROSubobject)eroso).getDwdmWavelengthLabel().getM();
// }
//
// }else if (eroso instanceof ETCEROSubobject){
// if (slsp.data[i]!=null){
// slsp.data[i].transponder="TX "+((ETCEROSubobject)eroso).getSubTransponderList().get(0).getST_TLV_ModFormat().toString();
// }
//
// }
// }
//
// log.info("XXXX LSP_Id JSON1: lsp.getpLSPID()" + lsp.getpLSPID());
// log.info("XXXX LSP_Id JSON1: slsp.getLSP_Id()" + slsp.getLSP_Id());
// String json = gson.toJson(slsp);
//
//
// return json;
//
// }
public Hashtable<Integer, SD_LSP> getMultiDomain_LSP_list() {
return LSP_list;
}
public void setMultiDomain_LSP_list(Hashtable<Integer, SD_LSP> LSP_list) {
this.LSP_list = LSP_list;
}
}