package com.jiuqi.mobile.nigo.comeclose.ws.client;
import java.lang.reflect.Proxy;
import java.util.UUID;
import java.util.logging.Handler;
import com.google.gson.internal.bind.ObjectTypeAdapter;
import com.jiuqi.mobile.nigo.comeclose.bean.base.UserBean;
import com.jiuqi.mobile.nigo.comeclose.bean.message.LoginMessageBean;
import com.jiuqi.mobile.nigo.comeclose.exception.LoginException;
import com.jiuqi.mobile.nigo.comeclose.exception.NiGoException;
import com.jiuqi.mobile.nigo.comeclose.manager.base.ILoginManager;
import com.jiuqi.mobile.nigo.comeclose.ws.server.Session;
/**
* 客户端与服务端交互的上下文,负责连接、数据传输等操作
*
* <pre>
* 示例:
* ...
* ClientContext context = ClientContext.getContext("http://127.0.0.1:8080/saas", "/orderservice");
* IOrderService service = context.getService(IOrderService.class);
* service.removeOrder("orderid");
* ...
* </pre>
*
* @author liuhongbin
*/
public class ClientContext {
/**
* [MMC]webservice的服务相对地址
*/
public final static String WS_URI_NJT = "/ws/*";
private String serverURL = null;
private String serviceURI = null;
private String sessionID = null;
private static UserBean user;
private static String detail;
private String passWord = "";
private String account = "";
private static ClientInvocationHandler handler;
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
/**
* 获得MMC当前交互上下文的实例
*
* @param serverURL
* 服务端的地址
* @return
*/
public static ClientContext getClientContext(String serverURL,
String sessionId) throws LoginException {
ClientContext context = new ClientContext(serverURL, WS_URI_NJT);
if (null != sessionId) {
context.sessionID = sessionId;
context.user = context.getManager(ILoginManager.class).getUser(
sessionId);
}
// TODO 服务端处理
// context.getManager(ILoginManager.class).addLoginLog(context.user,
// context.sessionID,3);
return context;
}
/**
* 获得MMC当前交互上下文的实例
*
* @param serverURL
* 服务端的地址
* @return
*/
public static ClientContext getClientContext(String serverURL,
String userAccountOrMobileNumber, String password)
throws LoginException {
return getClientContext(serverURL, userAccountOrMobileNumber, password,
10 * 1000);
}
public static ClientContext getClientContext(String serverURL,
String userAccountOrMobileNumber, String password, int timeout)
throws LoginException {
ClientContext context = new ClientContext(serverURL, WS_URI_NJT);
// anjoulee 添加2015.05.26
if (userAccountOrMobileNumber==null || userAccountOrMobileNumber.trim() == null ||userAccountOrMobileNumber.trim().equals("")
) {
throw new LoginException("登录账号异常");
}
LoginMessageBean bean = null;
try {
if(handler!=null){
handler.setAccount(userAccountOrMobileNumber);
handler.setPassword(password);
}
bean = context.getManager(ILoginManager.class, timeout)
.loginForClient(userAccountOrMobileNumber.trim(),
password.trim());
} catch (NiGoException e1) {
throw new LoginException("请求服务器失败!");
}
if (bean != null) {
context.sessionID = bean.getSessionId();
user = bean.getUserBean();
detail = bean.getStr();
}
if (null == context.sessionID) {
throw new LoginException(bean.getStr());
}
try {
UUID.fromString(context.sessionID);
} catch (Throwable e) {
throw new LoginException(context.sessionID);
}
// return getClientContext(serverURL, context.sessionID);
return context;
}
/**
* 用户注册
*
* @param serverURL
* @param userName
* @param mobileNumber
* @param password
* @param roleCode
* @throws LoginException
*/
public static void register(String serverURL, String userName,
String mobileNumber, String password, int roleCode)
throws LoginException {
ClientContext context = new ClientContext(serverURL, WS_URI_NJT);
ILoginManager m = context.getManager(ILoginManager.class);
m.register(userName, mobileNumber, password, roleCode);
}
/**
* 根据对应的接口名获取响应的服务(返回的object为传入接口)</br>
*
* android端实现时异常处理问题,所有返回异常可能会被UndeclaredThrowableException包装。</br>
* 请这样使用</br> } catch (Throwable e) {</br> if(e instanceof
* UndeclaredThrowableException){</br> e.getCause();</br> }</br>
* e.printStackTrace();</br> }</br> </br>
*
* @param intf
* 服务代理接口
* @return 返回的object为传入接口
*/
@SuppressWarnings("unchecked")
public <T> T getManager(Class<T> intf) {
if(handler!=null && handler.getSessionID()!=null ){
this.sessionID = handler.getSessionID();
}
handler = new ClientInvocationHandler(serverURL, serviceURI, sessionID,
account, passWord, intf);
T manager = (T) Proxy.newProxyInstance(getClass().getClassLoader(),
new Class<?>[] { intf }, handler);
return manager;
}
/**
* 仅登录使用无session登录
* @param intf
* @param timeout
* @return
*/
@SuppressWarnings("unchecked")
public <T> T getManager(Class<T> intf, int timeout) {
sessionID = null;
return (T) Proxy.newProxyInstance(getClass().getClassLoader(),
new Class<?>[]{intf},
new ClientInvocationHandler(serverURL, serviceURI, sessionID,
account, passWord, intf));
}
private ClientContext(String serverURL, String serviceURI) {
this.serverURL = serverURL;
this.serviceURI = serviceURI;
}
public void setSessionID(String sessionID) {
this.sessionID = sessionID;
}
public static String getDetail() {
return detail;
}
public UserBean getUser() {
return user;
}
public String getSessionID() {
return sessionID;
}
}