package com.coder.client; import java.io.IOException; import java.util.HashSet; import java.util.logging.Level; import java.util.logging.Logger; import zutil.log.LogUtil; import com.coder.client.session.ProjectMessageListener; import com.coder.client.session.Session; import com.coder.client.session.SessionEventHandler; import com.coder.server.message.CoderMessage; public class SessionHandler{ public static final Logger logger = LogUtil.getLogger(); private static SessionHandler instance = null; private Session session; private HashSet sessionEventHandlers = new HashSet(); private HashSet messageListeners = new HashSet(); private SessionHandler(){ } public static SessionHandler getInstance(){ if(instance == null){ instance = new SessionHandler(); } return instance; } public boolean setupConnection(String url, int port){ if(session != null && session.isConnected()){ session.close(); } session = Session.setupConnection(url, port); if(session != null){ for(ProjectMessageListener listener : messageListeners){ session.addMessageListener(listener); } for(SessionEventHandler eventHandler : sessionEventHandlers){ eventHandler.sessionConnectionSuccess(); } return true; }else{ for(SessionEventHandler eventHandler : sessionEventHandlers){ eventHandler.sessionConnectionFailure(); } return false; } } public boolean authenticateSession(String username, char[] clearTextPassword){ if(session == null){ return false; }else{ boolean success = session.authenticate(username, clearTextPassword); if(success){ for(SessionEventHandler eventHandler : sessionEventHandlers){ eventHandler.sessionAuthenticationSuccess(); } session.start(); return true; }else{ for(SessionEventHandler eventHandler : sessionEventHandlers){ eventHandler.sessionAuthenticationFailure(); } return false; } } } public boolean sendMessage(CoderMessage msg){ logger.fine("sending a message"); if(session != null){ try { session.send(msg); } catch (IOException e) { logger.log(Level.SEVERE, "unable to send message", e); closeCurrentSession(true); return false; } logger.fine("successfully sent the meessage"); return true; } return false; } public void closeCurrentSession(boolean retry){ if(session != null){ logger.info("closing session to server"); session.close(); session = null; for(SessionEventHandler eventHandler : sessionEventHandlers){ eventHandler.sessionDisconnected(retry); } }else{ logger.fine("cannot close current session: session already terminated"); } } public void addSessionEventHandler(SessionEventHandler eventHandler){ this.sessionEventHandlers.add(eventHandler); } public void addMessageListener(ProjectMessageListener listener) { messageListeners.add(listener); if(session != null){ session.addMessageListener(listener); } } public void triggerAuthenticationCancel() { if(session.isConnected() && !session.isAuthenticated()){ closeCurrentSession(false); for(SessionEventHandler eventHandler : sessionEventHandlers){ eventHandler.sessionAuthenticationCancel(); } }else{ logger.warning("Can only cancel a connected but not yet authenticated authentication. ignoring call"); } } }