package es.tid.pce.client; import java.io.DataOutputStream; import java.io.IOException; import java.util.Hashtable; import java.util.Random; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import es.tid.pce.pcep.PCEPProtocolViolationException; import es.tid.pce.pcep.messages.PCEPInitiate; import es.tid.pce.pcep.messages.PCEPMessage; import es.tid.pce.pcep.messages.PCEPMonReq; import es.tid.pce.pcep.messages.PCEPReport; import es.tid.pce.pcep.messages.PCEPRequest; import es.tid.pce.pcep.messages.PCEPResponse; import es.tid.util.UtilsFunctions; /** * * */ public class ClientRequestManager { //private PCCPCEPSession session; public Hashtable<Long,Object> locks; private Hashtable<Long,PCEPResponse> responses; private Hashtable<Long,PCEPReport> responsesInit; private Logger log; private DataOutputStream out=null; //Use this to send messages to PCC private long lastTime; public Hashtable<Long,Semaphore> semaphores; public ClientRequestManager(){ log=LoggerFactory.getLogger("PCCClient"); //this.out=out; locks = new Hashtable<Long, Object>(); responses=new Hashtable<Long, PCEPResponse>(); responsesInit=new Hashtable<Long, PCEPReport>(); semaphores=new Hashtable<Long,Semaphore>(); } public void notifyResponse(PCEPResponse pcres, long timeIni){ lastTime=timeIni; long idRequest=pcres.getResponse(0).getRequestParameters().getRequestID(); log.debug("Entrando en Notify Response"); Object object_lock=locks.remove(new Long(idRequest)); if (object_lock!=null){ responses.put(new Long(idRequest), pcres); object_lock.notifyAll(); } } public void notifyResponseInit(PCEPReport pcres, long timeIni){ System.out.println("Entrando en Notify Resp Init"); log.info("Entrando en Notify Resp Init"); lastTime=timeIni; long idIni=pcres.getStateReportList().get(0).getSRP().getSRP_ID_number(); System.out.println("Nos llega un" +idIni); responsesInit.put(new Long(idIni), pcres); } public void setDataOutputStream(DataOutputStream out) { this.out=out; } public PCEPMessage newRequest( PCEPMessage pcreq) { return newRequest(pcreq,60000); } //Generic function in case instead of PCEPRequest/PCEPResponse it's PCEPInitate/PCEPReport public PCEPResponse newRequest( PCEPRequest pcreq) { return newRequest(pcreq,60000); } //Generic function in case instead of PCEPRequest/PCEPResponse it's PCEPInitate/PCEPReport public PCEPMessage newRequest( PCEPMessage pcreq, long maxTimeMs) { log.info("New Request. Request:"+pcreq.toString()); Object object_lock = new Object(); long idRequest = generateRandomID(); Long idReqLong = new Long(idRequest); long timeIni = System.nanoTime(); locks.put(idReqLong, object_lock); sendPCEPMessage(pcreq); synchronized (object_lock) { try { log.info("ESPERAREMOS "+maxTimeMs); object_lock.wait(maxTimeMs); } catch (InterruptedException e) { UtilsFunctions.exceptionToString(e); } } long timeIni2=System.nanoTime(); double reqTime_ms=(timeIni2-timeIni)/1000000; log.debug("Request or timeout"); PCEPMessage resp = responses.remove(new Long(idRequest)); if (resp==null) { log.warn("NO RESPONSE!!!!! me deshago del lock... con idReqLong "+idRequest); locks.remove(idReqLong); } return resp; } public PCEPResponse newRequest( PCEPRequest pcreq, long maxTimeMs) { log.info("jm dentro de newRequest"); log.info("New Request. Request:"+pcreq.toString()); log.info("pcreq.getRequest(0).getXro(): "+pcreq.getRequest(0).getXro()); Object object_lock=new Object(); long idRequest=pcreq.getRequest(0).getRequestParameters().getRequestID(); Long idReqLong=new Long(idRequest); long timeIni=System.nanoTime(); locks.put(idReqLong, object_lock); sendRequest(pcreq); synchronized (object_lock) { try { log.info("ESPERAREMOS "+maxTimeMs); object_lock.wait(maxTimeMs); } catch (InterruptedException e) { UtilsFunctions.exceptionToString(e); } } long timeIni2=System.nanoTime(); //log.info("Response "+pr.toString()); double reqTime_ms=(timeIni2-timeIni)/1000000; log.debug("Request or timeout"); PCEPResponse resp=responses.remove(new Long(idRequest)); if (resp==null){ log.warn("NO RESPONSE!!!!! me deshago del lock... con idReqLong "+idRequest); locks.remove(idReqLong); } return resp; } public void sendRequest(PCEPRequest req) { log.debug("Sending Request: :" + req); log.info("Sending PCEP Request"); sendPCEPMessage(req); } synchronized public void sendPCEPMessage(PCEPMessage msg){ try { msg.encode(); } catch (PCEPProtocolViolationException e1) { // TODO Auto-generated catch block log.info(UtilsFunctions.exceptionToString(e1)); } try { log.info("Sending message ::"+msg); out.write(msg.getBytes()); out.flush(); log.info("Sending message finish"); } catch (IOException e) { log.info(UtilsFunctions.exceptionToString(e)); log.warn("Error sending msg: " + e.getMessage()); } } public PCEPResponse newRequest(PCEPMonReq pcreq){ log.debug("New Request"); Object object_lock=new Object(); //RequestLock rl=new RequestLock(); //((RequestParameters)(((Request)pcreq.getRequest(0)).getReqObject(0))).getRequestID(); //long idRequest=((RequestParameters)(((Request)pcreq.getRequest(0)).getReqObject(0))).getRequestID(); long idMonitoring=pcreq.getMonitoring().getMonitoringIdNumber(); locks.put(new Long(idMonitoring), object_lock); sendRequest(pcreq); synchronized (object_lock) { try { log.debug("Request sent, waiting for response"); object_lock.wait(60000); } catch (InterruptedException e){ // FIXME: Ver que hacer } } log.debug("Request or timeout"); PCEPResponse resp=responses.get(new Long(idMonitoring)); if (resp==null){ log.warn("NO RESPONSE!!!!!"); } return resp; } synchronized public void sendRequest(PCEPMonReq req){ try { req.encode(); } catch (PCEPProtocolViolationException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } try { log.debug("Sending Request message"); out.write(req.getBytes()); out.flush(); } catch (IOException e) { log.warn("Error sending REQ: " + e.getMessage()); } } private int generateRandomID() { Random generator = new Random(); return generator.nextInt(Integer.MAX_VALUE); } public PCEPMessage initiate ( PCEPInitiate pcini, long maxTimeMs) { log.info("Sending Initiate:"+pcini.toString()); byte[] LSPname=pcini.getPcepIntiatedLSPList().get(0).getLsp().getSymbolicPathNameTLV_tlv().getSymbolicPathNameID(); long idIni=pcini.getPcepIntiatedLSPList().get(0).getRsp().getSRP_ID_number(); System.out.println("Sending with id " +idIni); Long idReqLong=new Long(idIni); long timeIni=System.nanoTime(); //System.out.println("id ini es "+) Semaphore semapohore=new Semaphore(0); semaphores.put(idIni, semapohore); sendPCEPMessage(pcini); try { semapohore.tryAcquire(maxTimeMs,TimeUnit.MILLISECONDS); } catch (InterruptedException e) { UtilsFunctions.exceptionToString(e); } long timeIni2=System.nanoTime(); //log.info("Response "+pr.toString()); double reqTime_ms=(timeIni2-timeIni)/1000000; log.debug("Time: "+reqTime_ms ); PCEPMessage resp=responsesInit.remove(new Long(idIni)); if (resp==null){ log.warn("NO RESPONSE!!!!! me deshago del lock... con idIni "+idIni); locks.remove(idReqLong); } return resp; } }