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; } }