package es.tid.bgp.bgp4Peer.bgp4session; import es.tid.bgp.bgp4Peer.peer.BGP4Exception; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.DataOutputStream; import java.net.Inet4Address; import java.util.Enumeration; import java.util.Hashtable; /** * Class where the oppened BGP4 sessions are stored. * * @author mcs * */ public class BGP4SessionsInformation { public Hashtable<Long,GenericBGP4Session> sessionList; public Hashtable<Inet4Address,GenericBGP4Session> sessionListByPeerIP; private boolean isTest = false; Logger log; //FIXME: ya lo tenemos a trav�s de la lista de sesiones DataOutputStream out; public BGP4SessionsInformation(){ sessionList=new Hashtable<Long,GenericBGP4Session>(); sessionListByPeerIP=new Hashtable<Inet4Address,GenericBGP4Session>(); log = LoggerFactory.getLogger("BGP4Parser"); } public BGP4SessionsInformation(boolean test){ sessionList=new Hashtable<Long,GenericBGP4Session>(); sessionListByPeerIP=new Hashtable<Inet4Address,GenericBGP4Session>(); log = LoggerFactory.getLogger("BGP4Parser"); isTest= test; } public synchronized void notifySessionStart(Inet4Address addr) throws BGP4SessionExistsException{ if (sessionListByPeerIP.containsKey(addr)){ throw new BGP4SessionExistsException(); } } public synchronized void addSession(long sessionId, GenericBGP4Session session) throws BGP4Exception{ Enumeration <GenericBGP4Session > sessions = sessionList.elements(); log.debug("Looking to add session with id "+sessionId+" --> "+session.toString()); //Check if there is already a session with the remote peer. //Only one session allowed with each remote peer GenericBGP4Session existingSession=sessionListByPeerIP.get(session.remotePeerIP); if(isTest){ //If there is no existing session with the peer sessionList.put(new Long(sessionId),session); sessionListByPeerIP.put(session.getPeerIP() , session); log.debug("Registering new session with Peer "+session.getPeerIP() +" with ID "+sessionId); } else{ if (existingSession!=null){ log.debug("Session with id "+existingSession.getSessionId()+" against "+session.remotePeerIP.getHostAddress()+" already exists"); throw new BGP4Exception();//si no existe throw new BGP4Exception(); } //If there is no existing session with the peer sessionList.put(new Long(sessionId),session); sessionListByPeerIP.put(session.getPeerIP() , session); log.debug("Registering new session with Peer "+session.getPeerIP() +" with ID "+sessionId); } } public synchronized void deleteSession(long sessionId){ GenericBGP4Session ses=sessionList.get(sessionId); if (ses!=null) { Inet4Address ip=sessionList.get(sessionId).getPeerIP(); sessionList.remove(new Long(sessionId)); sessionListByPeerIP.remove(ses.getPeerIP()); log.debug("Deleted Session with id "+sessionId +" with peer "+ses.getPeerIP().getHostAddress()); }else { log.info("SESSION WAS NOT REGISTERED NULL"); } } @Override public String toString() { StringBuffer sb=new StringBuffer(2000); int counter = 1; Enumeration <GenericBGP4Session > sessions = sessionList.elements(); //Comprobar si ya existe la session con ese peer while (sessions.hasMoreElements()){ sb.append("Session number "+(counter++)+"\n"); sb.append(sessions.nextElement().toString()+"\n"); } return sb.toString(); } public String printSession(long sessionId){ GenericBGP4Session ses=sessionList.get(new Long(sessionId)); if (ses!=null){ return ses.toString(); }else { return "session "+sessionId+" does not exist"; } } public DataOutputStream getOut() { return out; } public void setOut(DataOutputStream out) { this.out = out; } public Hashtable<Long, GenericBGP4Session> getSessionList() { return sessionList; } public void setSessionList(Hashtable<Long, GenericBGP4Session> sessionList) { this.sessionList = sessionList; } }