package org.quickbundle.project;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.quickbundle.base.beans.factory.RmBeanFactory;
import org.quickbundle.config.RmLoadConfig;
import org.quickbundle.modules.log.ActionLog2DbService;
import org.quickbundle.modules.log.ILogConstants;
import org.quickbundle.modules.log.RmLogTypeCache;
import org.quickbundle.modules.log.rmlog.vo.RmLogVo;
import org.quickbundle.project.common.service.IRmCommonService;
import org.quickbundle.project.listener.RmGlobalMonitor;
import org.quickbundle.project.listener.RmRequestMonitor;
import org.quickbundle.project.login.IRmLoginVo;
import org.quickbundle.project.login.RmUserVo;
import org.quickbundle.project.mail.IRmMailService;
import org.quickbundle.project.test.RmAlarmCollector;
import org.quickbundle.tools.context.RmBeanHelper;
import org.quickbundle.tools.helper.RmDateHelper;
import org.quickbundle.tools.helper.RmJspHelper;
import org.quickbundle.tools.support.log.RmLogHelper;
import org.slf4j.Logger;
import org.slf4j.helpers.FormattingTuple;
import org.slf4j.helpers.MessageFormatter;
/**
* 功能、用途、现存BUG:
*
* @author 白小勇
* @version 1.0.0
* @see 需要参见的其它类
* @since 1.0.0
*/
public final class RmProjectHelper implements IGlobalConstants{
private static Logger log = RmLogHelper.getLogger(RmProjectHelper.class);
private static Logger logFatal = RmLogHelper.getLogger("rmfatal");
private RmProjectHelper() {
}
/**
* 获得通用的IRmCommonService
* @return
*/
public static IRmCommonService getCommonServiceInstance() {
return RmBeanHelper.getCommonServiceInstance();
}
/**
* 功能: 获取当前线程的HttpServletRequest(request)对象
*
* @return
*/
public static HttpServletRequest getCurrentThreadRequest() {
return RmRequestMonitor.getCurrentThreadRequest();
}
/**
* 返回登录名,用于校验是否有效登录
*
* @param request
* @return
*/
public static String getRmLoginId(ServletRequest request) {
return getRmLoginId(request, false);
}
/**
* 返回登录名,用于校验是否有效登录
*
* @param request
* @param create
* @return
*/
public static String getRmLoginId(ServletRequest request, boolean createSession) {
HttpSession session = RmJspHelper.getSession(request, createSession);
if(session == null) {
return null;
}
Object obj = session.getAttribute(RM_USER_VO);
if(obj == null) {
return null;
}
return ((IRmLoginVo)obj).getLogin_id();
}
/**
* 返回user_id,用于vo自动打戳
*
* @param request
* @return
*/
public static String getRmUserId(ServletRequest request) {
return getRmUserId(request, false);
}
/**
* 返回user_id,用于vo自动打戳
*
* @param request
* @param createSession
* @return
*/
public static String getRmUserId(ServletRequest request, boolean createSession) {
return getRmUserVo(request, createSession).getId();
}
/**
* 获得用户信息
*
* @param request
* @return
*/
public static RmUserVo getRmUserVo(ServletRequest request) {
return getRmUserVo(request, false);
}
/**
* 获得用户信息
*
* @param request
* @param createSession
* @return
*/
public static RmUserVo getRmUserVo(ServletRequest request, boolean createSession) {
Object obj = RmJspHelper.getSession(request, createSession).getAttribute(RM_USER_VO);
if (obj == null) {
return null;
} else {
return (RmUserVo)obj;
}
}
/**
* 获得当前线程绑定的用户信息
*
* @param request
* @return
*/
public static RmUserVo getCurrentUser() {
HttpServletRequest request = RmRequestMonitor.getCurrentThreadRequest();
if (request == null) {
return null;
}
Object obj = RmJspHelper.getSession(request).getAttribute(RM_USER_VO);
if (obj == null) {
return null;
}
return (RmUserVo) obj;
}
/**
* 功能: 从request得到IP地址
*
* @param request
* @return
*/
public static String getIp(ServletRequest request) {
String ip = null;
if(request instanceof HttpServletRequest) {
ip = ((HttpServletRequest)request).getHeader("X-Forwarded-For");
if(ip != null && ip.trim().indexOf(",") > 0) {
ip = ip.trim().substring(0, ip.trim().indexOf(","));
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = ((HttpServletRequest)request).getHeader("X-Real-IP");
}
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}
/**
* 手动记录日志进入数据库,适用于记录重要的业务日志
*
* @param action_module 日志模块名
* @param content 日志内容
*/
public static void log(String action_module, String format, Object... arguments) {
String message = null;
if(arguments.length > 0) {
FormattingTuple ft = MessageFormatter.arrayFormat(format, arguments);
message = ft.getMessage();
} else {
message = format;
}
//system businessLog begin
StackTraceElement[] sts = Thread.currentThread().getStackTrace();
String callMethodName = null;
boolean findSelfMethod = false;
for(int i=0; i<sts.length; i++) { //倒序查找
StackTraceElement st = sts[i];
if(RmProjectHelper.class.getName().equals(st.getClassName()) && "log".equals(st.getMethodName())) {
findSelfMethod = true;
} else if(findSelfMethod) {
//如果RmProjectHelper的上一层是RmLogHelper,则再往上取一层才是业务方法
if(RmLogHelper.class.getName().equals(st.getClassName()) && "log".equals(st.getMethodName()) && sts.length > i+1) {
callMethodName = sts[i+1].getMethodName();
} else {
callMethodName = st.getMethodName();
}
break;
}
}
String uuid = RmGlobalMonitor.uniqueUUID.get();
RmLogVo logVo = new RmLogVo();
{ //初始化logVo
//时间戳
logVo.setAction_date(RmDateHelper.getSysTimestamp());
//从request中注值
HttpServletRequest request = RmRequestMonitor.getCurrentThreadRequest();
if(request != null) {
logVo.setAction_ip(RmProjectHelper.getIp(request));
RmUserVo userVo = RmProjectHelper.getRmUserVo(request);
if(userVo != null) {
logVo.setUser_id(userVo.getId());
logVo.setUser_id_name(userVo.getName());
logVo.setOwner_org_id(userVo.getParty_id_org());
}
}
logVo.setAction_module(action_module);
{ //智能匹配日志类型
logVo.setLog_type_id(RmLogTypeCache.getSingleton().matchLogType(action_module).getId());
}
{ //自动匹配操作类型
logVo.setAction_type(getActionType(callMethodName));
}
logVo.setAction_uuid(uuid);
logVo.setContent(message);
}
insertDbLog(logVo);
//system businessLog end
}
/**
* 记录严重错误信息到单独的fatal.log,并发送邮件给指定人员
* @param msg
* @param e
*/
public static boolean logFatal(Object msg, Throwable e) {
try {
String[] subject_content = RmAlarmCollector.createInfo(msg, e);
String subject = subject_content[0];
String content = subject_content[1];
logFatal.error(subject);
logFatal.error(content);
IRmMailService mailService = (IRmMailService)RmBeanFactory.getBean("IRmMailService");
mailService.send(RmLoadConfig.getRmDoc().valueOf("/rm/org.quickbundle.project.RmProjectHelper/logFatal/mailTo"),
subject, content, null, null);
return true;
} catch (Exception e2) {
e2.printStackTrace();
log.warn(e2.toString());
return false;
}
}
//system businessLog begin
/**
* 自动判断操作类型
* @param callMethodName
* @return
*/
private static String getActionType(String callMethodName) {
ILogConstants.ActionType[] ats = ILogConstants.ActionType.values();
for(int i=0; i<ats.length; i++) {
if(callMethodName.matches(ats[i].pattern())) {
return ats[i].value();
}
}
return ILogConstants.ActionTypeDefault;
}
/**
* 记录业务日志
* @param logVo
*/
public static void insertDbLog(RmLogVo logVo) {
RmBeanFactory.getBean(ActionLog2DbService.class).add(logVo);
}
//system businessLog end
}