package com.jiuqi.lbsinterface.ws.publish;
import java.lang.reflect.Proxy;
import com.jiuqi.lbsinterface.bean.UserBean;
import com.jiuqi.lbsinterface.exception.LoginException;
import com.jiuqi.lbsinterface.manager.IPositionManager;
import com.jiuqi.lbsinterface.ws.client.ClientInvocationHandler;
/**
* 远程端与服务端交互的上下文,负责连接、数据传输等操作
*
* @author anjoulee
*/
public class WSContext {
/**
* [MMC]webservice的服务相对地址
*/
public final static String WS_URI_NJT = "/lbs";
private String serverURL = null;
private String serviceURI = null;
private String sessionID = null;
private UserBean user;
/**
* 获得MMC当前交互上下文的实例
*
* @param serverURL
* 服务端的地址
* @return
*/
public static WSContext getClientContext(String serverURL, String sessionId)
throws LoginException {
WSContext context = new WSContext(serverURL, WS_URI_NJT);
if (null != sessionId) {
context.sessionID = sessionId;
context.user = context.getManager(IPositionManager.class).getUser(
sessionId);
}
return context;
}
/**
* 获得MMC当前交互上下文的实例
*
* @param serverURL
* 服务端的地址
* @return
*/
public static WSContext getClientContext(String serverURL)
throws LoginException {
WSContext context = new WSContext(serverURL, WS_URI_NJT);
context.sessionID = context.getManager(IPositionManager.class).login(
"anonymous", "anonymous");
return getClientContext(serverURL, context.sessionID);
}
/**
* 根据对应的接口名获取响应的服务(返回的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) {
return (T) Proxy.newProxyInstance(getClass().getClassLoader(),
new Class<?>[] { intf }, new ClientInvocationHandler(serverURL,
serviceURI, sessionID, intf));
}
private WSContext(String serverURL, String serviceURI) {
this.serverURL = serverURL;
this.serviceURI = serviceURI;
}
public UserBean getUser() {
return user;
}
public String getSessionID() {
return sessionID;
}
}