package com.jqmobile.core.server.rmi;
import java.util.ArrayList;
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;
public class RmiLoginImpl implements IRmiLogin{
// private final static Map<String, User> map = Collections.synchronizedMap(new HashMap<String, User>());
// private final static List<User> list = new ArrayList<User>();
final static Map<String, User> sessionMap = Collections.synchronizedMap(new HashMap<String, User>());
private final static List<HandleUser> handles = new ArrayList<HandleUser>();
// static{
// IXMLNode rmi = Application.getApplication().getRmiProperties();
//// <rmi open="true">
//// <users>
//// <user username="root" password="123455" maxConnectionCount="200">
//// 允许访问的ip,不设置表示不限制
//// <ip>10.2.12.2</ip>
//// </user>
//// </users>
//// <remote>
//// <id>1</id>
//// <ip>127.0.0.1</ip>
//// <port>9700</port>
//// <username>root</username>
//// <password>123455</password>
//// </remote>
//// </rmi>
// List<IXMLNode> users = rmi.getChilds("users");
// if(!users.isEmpty()){
// List<IXMLNode> us = users.get(0).getChilds("user");
// User u;
// for(IXMLNode user : us){
//// Map<String, String> atts = user.getAttributes();
// u = new User();
// //
// String username = user.getAttribute("username");
// if(null != username) u.setUsername(username);
// //
// String password = user.getAttribute("password");
// if(null != password) u.setPassword(password);
// //
// String maxConnectionCount = user.getAttribute("maxConnectionCount");
// if(null != maxConnectionCount) u.setMaxConnectionCount(Integer.parseInt(maxConnectionCount));
// //
// List<IXMLNode> ips = user.getChilds("ip");
// if(!ips.isEmpty()){
// List<String> list = new ArrayList<String>();
// for(IXMLNode ip : ips){
// list.add(ip.getText());
// }
// u.setApprovedIPs(list);
// }
// }
// }
// }
static class User extends Application.RemoteUser{
// private String username;
// private String password;
// private Integer maxConnection;//允许最大连接数
private List<UserConnInfo> connInfos;//当前连接信息
// private List<String> approvedIPs;//允许IP列表
private int connCount=0;
//
private String session;
public User(){
super();
}
public User(RemoteUser u) {
setMaxConnectionCount(u.getMaxConnectionCount());
setPassword(u.getPassword());
setUsername(u.getUsername());
lockIps.addAll(u.getLockIps());
}
// public String getUsername() {
// return username;
// }
// public void setUsername(String username) {
// this.username = username;
// }
// public String getPassword() {
// return password;
// }
// public void setPassword(String password) {
// this.password = password;
// }
// public Integer getMaxConnection() {
// return maxConnection;
// }
// public void setMaxConnection(Integer maxConnection) {
// this.maxConnection = maxConnection;
// }
public List<UserConnInfo> getConnInfos() {
return connInfos;
}
public void setConnInfos(List<UserConnInfo> connInfos) {
this.connInfos = connInfos;
}
public String getSession() {
return session;
}
public void setSession(String session) {
this.session = session;
}
// public List<String> getApprovedIPs() {
// return approvedIPs;
// }
// public void setApprovedIPs(List<String> approvedIPs) {
// this.approvedIPs = approvedIPs;
// }
public void addConn() throws RmiException {
if(null != getMaxConnectionCount() && connCount >= getMaxConnectionCount()){
throw new RmiException(RmiException.RMI_AboveMaxConn_Error);
}
connCount++;
}
public void subConn() {
connCount--;
}
}
static class UserConnInfo{
private long beginTime;
private long requestCount;
private String clientIp;
public long getBeginTime() {
return beginTime;
}
public void setBeginTime(long beginTime) {
this.beginTime = beginTime;
}
public long getRequestCount() {
return requestCount;
}
public void setRequestCount(long requestCount) {
this.requestCount = requestCount;
}
public String getClientIp() {
return clientIp;
}
public void setClientIp(String clientIp) {
this.clientIp = clientIp;
}
}
static class HandleUser{
private final User user;
private final String ip;
private final long time;
public HandleUser(User user, String ip) {
super();
this.user = user;
this.ip = ip;
this.time = System.currentTimeMillis();
}
public User getUser() {
return user;
}
public String getIp() {
return ip;
}
public long getTime() {
return time;
}
}
//
@Override
public String login(String username, String password) throws RmiException {
for(RemoteUser user : Application.getApplication().getRemoteUser()){
if(user.getUsername().equals(username)){
if(user.getPassword().equals(password)){
return login(user);
}
throw new RmiException(RmiException.RMI_Password_Error);
}
}
throw new RmiException(RmiException.RMI_NotFoundUsername_Error);
}
private String login(RemoteUser u) throws RmiException {
User user = new User(u);
String ip = RmiUtils.getClientIp();
if(null != user.getLockIps() && !user.getLockIps().isEmpty() && !user.getLockIps().contains(ip)){
throw new RmiException(RmiException.RMI_RequestIP_Error);
}
synchronized (user) {
if(null == user.getSession()){
user.setSession(UUID.randomUUID().toString());
}
}
sessionMap.put(user.getSession(),user);
handles.add(new HandleUser(user, ip));
return user.getSession();
}
}