coder-client/src/com/coder/client/SessionHandler.java

126 lines
3.4 KiB
Java

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<SessionEventHandler> sessionEventHandlers = new HashSet<SessionEventHandler>();
private HashSet<ProjectMessageListener> messageListeners = new HashSet<ProjectMessageListener>();
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");
}
}
}