package sockslib.server;
import sockslib.server.listener.CloseSessionException;
import sockslib.server.listener.CommandListener;
import sockslib.server.listener.ExceptionListener;
import sockslib.server.listener.SessionCloseListener;
import sockslib.server.listener.SessionCreateListener;
import sockslib.server.listener.SessionListener;
import sockslib.server.msg.CommandMessage;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
/**
* The class <code>BasicSessionManager</code> implements {@link SessionManager}
*
* @author Youchao Feng
* @version 1.0
* @date Oct 10,2015 7:15 PM
*/
public class BasicSessionManager implements SessionManager {
private static int nextSessionId = 0;
private Map<Long, Session> managedSessions = new HashMap<>();
private Map<String, SessionCreateListener> sessionCreateListenerMap = new HashMap<>();
private Map<String, SessionCloseListener> sessionCloseListenerMap = new HashMap<>();
private Map<String, CommandListener> commandListenerMap = new HashMap<>();
private Map<String, ExceptionListener> exceptionListenerMap = new HashMap<>();
@Override
public Session newSession(Socket socket) {
Session session = new SocksSession(++nextSessionId, socket, managedSessions);
managedSessions.put(session.getId(), session);
return session;
}
@Override
public Session getSession(long id) {
return managedSessions.get(id);
}
@Override
public void sessionOnCreate(Session session) throws CloseSessionException {
for (SessionCreateListener listener : sessionCreateListenerMap.values()) {
listener.onCreate(session);
}
}
@Override
public void sessionOnCommand(Session session, CommandMessage message)
throws CloseSessionException {
for (CommandListener listener : commandListenerMap.values()) {
listener.onCommand(session, message);
}
}
@Override
public void sessionOnException(Session session, Exception exception) {
for (ExceptionListener listener : exceptionListenerMap.values()) {
listener.onException(session, exception);
}
}
@Override
public void sessionOnClose(Session session) {
for (SessionCloseListener listener : sessionCloseListenerMap.values()) {
listener.onClose(session);
}
}
@Override
public void removeSessionListener(String name) {
this.removeCommandListener(name);
this.removeExceptionListener(name);
this.removeSessionCloseListener(name);
this.removeSessionCreateListener(name);
}
@Override
public void addSessionListener(String name, SessionListener listener) {
this.onCommand(name, listener);
this.onException(name, listener);
this.onSessionClose(name, listener);
this.onSessionCreate(name, listener);
}
@Override
public Map<Long, Session> getManagedSessions() {
return managedSessions;
}
@Override
public SessionManager onSessionClose(String name, SessionCloseListener listener) {
sessionCloseListenerMap.put(name, listener);
return this;
}
@Override
public SessionManager onSessionCreate(String name, SessionCreateListener listener) {
sessionCreateListenerMap.put(name, listener);
return this;
}
@Override
public SessionManager onCommand(String name, CommandListener listener) {
commandListenerMap.put(name, listener);
return this;
}
@Override
public SessionManager onException(String name, ExceptionListener listener) {
exceptionListenerMap.put(name, listener);
return this;
}
public SessionCloseListener removeSessionCloseListener(String name){
return sessionCloseListenerMap.remove(name);
}
public SessionCreateListener removeSessionCreateListener(String name){
return sessionCreateListenerMap.remove(name);
}
public CommandListener removeCommandListener(String name){
return commandListenerMap.remove(name);
}
public ExceptionListener removeExceptionListener(String name){
return exceptionListenerMap.remove(name);
}
}