package es.tid.pce.server;
import java.net.Inet4Address;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.LinkedBlockingQueue;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import es.tid.pce.computingEngine.RequestDispatcher;
import es.tid.pce.pcep.messages.PCEPMessage;
import es.tid.pce.pcepsession.PCEPSessionsInformation;
import es.tid.tedb.TEDB;
/**
* Child PCE Session Manager. It is in charge of managing the communication between the domain PCE and the Parent PCE
* @author ogondio
*
*/
public class ChildPCESessionManager extends TimerTask{
// private Timer timer;
private PCEServerParameters params;
private ChildPCESession childPCEParentPCESession;
private RequestDispatcher requestDispatcher;
private RequestQueue parentPCERequestQueue;
private TEDB ted;
private LinkedBlockingQueue<PCEPMessage> sendingQueue;
private ParentPCERequestManager childPCERequestManager;
private Inet4Address domainId;
private Logger log;
private RequestDispatcher PCCRequestDispatcherChild;
PCEPSessionsInformation pcepSessionInformation;
private SingleDomainInitiateDispatcher iniDispatcher;
public ChildPCESessionManager(RequestDispatcher PCCRequestDispatcherChild, PCEServerParameters params, TEDB ted, Inet4Address domainId, PCEPSessionsInformation pcepSessionInformation, SingleDomainInitiateDispatcher iniDispatcher){
this.params=params;
this.ted=ted;
this.PCCRequestDispatcherChild=PCCRequestDispatcherChild;
this.pcepSessionInformation=pcepSessionInformation;
// this.timer=new Timer();
this.parentPCERequestQueue=new RequestQueue(params.getParentPCERequestProcessors());
sendingQueue=new LinkedBlockingQueue<PCEPMessage>();
childPCERequestManager=new ParentPCERequestManager(sendingQueue);
this.domainId=domainId;
this.iniDispatcher=iniDispatcher;
log=LoggerFactory.getLogger("PCEServer");
}
public ChildPCESessionManager(PCEServerParameters params, TEDB ted, Inet4Address domainId, PCEPSessionsInformation pcepSessionInformation, SingleDomainInitiateDispatcher iniDispatcher){
this.params=params;
this.ted=ted;
this.pcepSessionInformation=pcepSessionInformation;
this.parentPCERequestQueue=new RequestQueue(params.getParentPCERequestProcessors());
sendingQueue=new LinkedBlockingQueue<PCEPMessage>();
childPCERequestManager=new ParentPCERequestManager(sendingQueue);
this.domainId=domainId;
this.iniDispatcher=iniDispatcher;
log=LoggerFactory.getLogger("PCEServer");
}
public ChildPCESession getChildPCEParentPCESession() {
return childPCEParentPCESession;
}
public void setChildPCEParentPCESession(ChildPCESession childPCEParentPCESession) {
this.childPCEParentPCESession = childPCEParentPCESession;
}
//* Starts new session with the Parent PCE * @return true if the session was launched, false if the session was already established
public void run(){
//pcepSessionInformation.setStateful(true);
if(childPCEParentPCESession != null){
log.warn("There is a session with Parent PCE!");
if (childPCEParentPCESession.isAlive()){
if (childPCEParentPCESession.isInterrupted()){
log.error("THREAD VIVO... SESION MUERTA");
}
return;
}
else{
log.warn("Session with parent PCE dead, trying to establish new session");
Timer timer=new Timer();
childPCEParentPCESession= new ChildPCESession(PCCRequestDispatcherChild, params, parentPCERequestQueue,ted,timer,sendingQueue,childPCERequestManager,domainId,pcepSessionInformation, iniDispatcher);
childPCEParentPCESession.start();
return;
}
}else{
log.warn("No Session with parent PCE, trying to establish new session");
sendingQueue.clear();//Borramos lo que haya????
Timer timer=new Timer();
childPCEParentPCESession= new ChildPCESession(PCCRequestDispatcherChild, params, parentPCERequestQueue,ted,timer,sendingQueue,childPCERequestManager,domainId,pcepSessionInformation,iniDispatcher);
childPCEParentPCESession.start();
return;
}
}
public boolean PPCESessionStatus(){
return childPCEParentPCESession.isAlive();
}
public int PPCESessionState(){
return childPCEParentPCESession.getFSMstate();
}
public void killPPCESession(){
childPCEParentPCESession.killSession();
}
public void closePPceSession(){
if (childPCEParentPCESession.isAlive()){
//FIXME reason for close????
childPCEParentPCESession.close(1);
}
}
public RequestQueue getParentPCERequestQueue() {
return parentPCERequestQueue;
}
public LinkedBlockingQueue<PCEPMessage> getSendingQueue() {
return sendingQueue;
}
public ParentPCERequestManager getChildPCERequestManager() {
return childPCERequestManager;
}
}