package com.ycsoft.report.web.commons;
import static com.ycsoft.commons.constants.Environment.USER_IN_SESSION_NAME;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.ycsoft.beans.system.SOptr;
import com.ycsoft.beans.system.SRole;
import com.ycsoft.business.dao.system.SRoleDao;
import com.ycsoft.commons.constants.Environment;
import com.ycsoft.commons.exception.ReportException;
import com.ycsoft.commons.helper.JsonHelper;
import com.ycsoft.commons.helper.LoggerHelper;
import com.ycsoft.report.commons.ReportConstants;
import com.ycsoft.report.commons.SystemConfig;
import com.ycsoft.report.dto.RepDataRight;
import com.ycsoft.report.pojo.Parameter;
import com.ycsoft.report.query.datarole.BaseDataControl;
import com.ycsoft.report.query.datarole.DataRole;
import com.ycsoft.report.query.datarole.DataRoleInit;
import com.ycsoft.report.web.action.query.ReportAction;
/**
* 报表拦截器,报表权限初始化,自定义json解析,报表执行控制
*/
public class ReportInterceptor extends AbstractInterceptor {
private static Map<String, String> repexecmap = new HashMap<String, String>();
private static final String[] execkeys = { "query/Report!initQuery",
"query/Show!downloadExp" ,"query/Show!cube"};
private SRoleDao sRoleDao;
/**
* 获得客户端的IP
*
* @param request
* @return
*/
public String getClientIP(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
String key = null;
try {
if (!(invocation.getAction() instanceof ReportAction)) {
return invocation.invoke();
}
HttpServletRequest request = ServletActionContext.getRequest();
ReportAction reportaction = (ReportAction) invocation.getAction();
key = this.ExceControl(request, reportaction, invocation.getProxy()
.getActionName());
this.AnalysisJsonParam(request, reportaction);
this.RoleInit(request, reportaction);
return invocation.invoke();
} catch (Exception e) {
throw e;
} finally {
if (key != null)
repexecmap.remove(key);
}
}
/**
* 控制(一个操作员ID+IP) 只能执行一个报表初始化,或数据导出压缩,或cube变换
* proxyactionname访问的action服务
* @param request
* @param reportaction
* @param proxyactionname
* @return
* @throws Exception
*/
public String ExceControl(HttpServletRequest request,
ReportAction reportaction, String proxyactionname) throws Exception {
String key = null;
// 客户端IP
String ip = getClientIP(request);
if(proxyactionname==null) return key;
for (String execkey : execkeys) {
// 符合需要控制的action调用
if (execkey.equals(proxyactionname)||proxyactionname.indexOf(execkey)>-1) {
key = reportaction.getOptr().getOptr_id() + "_" + ip;
reportaction.setClient_ip(ip);
LoggerHelper.debug(this.getClass(), key+"=>"+proxyactionname);
if (repexecmap.containsKey(key)){
throw new ReportException("请等待您上一个" + repexecmap.get(key)
+ "后台执行完毕");
}else{
repexecmap.put(key, execkey.equals(execkeys[0]) ? "报表查询"
: ( execkey.equals(execkeys[1])?"数据导出":"cube导航"));
}
}
}
return key;
}
/**
* 解析前台所提交的Json参数字符串。 将对应的参数字符串转换为Java Object。 并将解析的Object注入目标Action。
*/
public void AnalysisJsonParam(HttpServletRequest request,
ReportAction repaction) throws Exception {
// 获取客户等通用信息
Object ps = request
.getParameter(Environment.REQUEST_JSON_PARATEMER_STRING);
if (null != ps) {
LoggerHelper.debug(this.getClass()," 解析JSON=> "+ ps.toString());
Parameter p = JsonHelper.toObject(ps.toString(), repaction
.getParameter().getClass());
repaction.setParameter(p);
}
}
/**
* 报表权限初始化
*
* @param request
* @param repaction
* @throws Exception
*/
public void RoleInit(HttpServletRequest request, ReportAction repaction)
throws Exception {
/**
* 权限装入从session中提取并装入thread
*/
DataRole role=(DataRole) request.getSession().getAttribute( ReportConstants.SESSION_DATA_ROLE);
if(role!=null){
BaseDataControl.setRole(role);
}
}
public SRoleDao getSRoleDao() {
return sRoleDao;
}
public void setSRoleDao(SRoleDao roleDao) {
sRoleDao = roleDao;
}
}