package com.jqmobile.core.server.rmi2;
import java.rmi.RemoteException;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import com.jqmobile.core.server.Application;
import com.jqmobile.core.server.Application.RemoteUser;
import com.jqmobile.core.server.rmi.RmiException;
import com.jqmobile.core.server.rmi.RmiUser;
import com.jqmobile.core.utils.plain.DateUtils;
import com.jqmobile.core.utils.timer.TimerTask;
public class RmiSession implements IRmiLogin{
/**
* session检查周期
* @usermodi qq:411051729
* 变更说明:
*/
private final static long SessionValiPeriod = 600000;
private final static long MaxNoRequestTime = DateUtils.ONE_HOUR_TIME;
private final static long MaxSessionTime = DateUtils.ONE_DATE_TIME;
//
private final static Map<String, RemoteUser> userMap = new HashMap<String, RemoteUser>();
private final static Map<String, UserTask> taskMap = Collections.synchronizedMap(new HashMap<String, UserTask>());
private final static Map<String, UserTask> sessionMap = Collections.synchronizedMap(new HashMap<String, UserTask>());
static{
List<RemoteUser> rUsers = Application.getApplication().getRemoteUser();
for(RemoteUser user : rUsers){
userMap.put(user.getUsername(), user);
}
}
@Override
public String login(RmiUser user) throws RemoteException {
RemoteUser u = userMap.get(user.getUserName());
if(null == u){
throw new RmiException(RmiException.RMI_NotFoundUsername_Error);
}
if(!u.getPassword().equals(user.getPassword())){
throw new RmiException(RmiException.RMI_Password_Error);
}
synchronized (taskMap) {
if(!taskMap.containsKey(user.getUserName())){
UserTask task = new UserTask(u);
taskMap.put(user.getUserName(), task);
sessionMap.put(task.getSession(), task);
}
}
return taskMap.get(user.getUserName()).getSession();
}
@Override
public String login(String username, String password)
throws RemoteException {
RmiUser user = new RmiUser();
user.setUserName(username);
user.setPassword(password);
return login(user);
}
//
/**
* 获取session对应用户信息
* @param session
* @return RemoteUser
* @user modi qq:411051729
*/
public static RemoteUser getSessionUser(String session){
final UserTask userTask = sessionMap.get(session);
if(null == userTask){
return null;
}
userTask.f5();
return userTask.user;
}
/**
* 校验session
* <p>不更新session最后访问时间
* @param session
* @return boolean 存在返回true
* @user modi qq:411051729
*/
public static boolean valiSession(String session){
return sessionMap.containsKey(session);
}
/**
* 激活session连接
* @param session
* @throws RmiException void
* @user modi qq:411051729
*/
public static void activateSessionConn(String session) throws RmiException{
final UserTask userTask = sessionMap.get(session);
if(null == userTask){
throw new RmiException(RmiException.RMI_Session_Error);
}
userTask.f5();
userTask.addConn();
}
/**
* 释放session连接
* @param session
* @throws RmiException void
* @user modi qq:411051729
*/
public static void returnSessionConn(String session) throws RmiException{
final UserTask userTask = sessionMap.get(session);
if(null == userTask){
throw new RmiException(RmiException.RMI_Session_Error);
}
userTask.f5();
userTask.subConn();
}
//===================
static class UserTask extends TimerTask<Void, Boolean>{
private final RemoteUser user;
private final String session;
private final long loginTime;
private long lastHandlerTimer;
private int connCount=0;
public UserTask(RemoteUser user) {
this(user,System.currentTimeMillis());
}
public UserTask(RemoteUser user, long loginTime) {
this(user, loginTime, UUID.randomUUID().toString());
}
public UserTask(RemoteUser user, long loginTime, String session) {
this.user = user;
this.loginTime = loginTime;
this.session = session;
}
public void addConn() throws RmiException{
synchronized (user) {
if(null != user.getMaxConnectionCount() && user.getMaxConnectionCount()<connCount){
throw new RmiException(RmiException.RMI_AboveMaxConn_Error);
}
connCount++;
}
}
public synchronized void subConn(){
connCount--;
}
public String getSession() {
return session;
}
public void f5(){
lastHandlerTimer = System.currentTimeMillis();
}
@Override
protected Boolean doInBackground(Void... params) throws Throwable {
if((System.currentTimeMillis()-loginTime)>MaxSessionTime){
return true;
}
if((System.currentTimeMillis()-lastHandlerTimer)>MaxNoRequestTime){
return true;
}
return false;
}
@Override
protected void onPostExecute(Boolean result) {
if(result){
synchronized (sessionMap) {
sessionMap.remove(session);
}
synchronized (taskMap) {
sessionMap.remove(user.getUsername());
}
}
}
@Override
protected long period() {
return SessionValiPeriod;
}
}
}