126 lines
3.4 KiB
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");
|
|
}
|
|
}
|
|
|
|
}
|