package com.norteksoft.acs.base.utils.log; import java.lang.reflect.Method; import java.util.Date; import java.util.List; import javax.servlet.http.HttpServletRequest; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.criterion.Restrictions; import org.hibernate.proxy.HibernateProxy; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import com.norteksoft.acs.base.enumeration.OperatorType; import com.norteksoft.acs.base.orm.hibernate.SimpleHibernateTemplate; import com.norteksoft.product.api.entity.BusinessSystem; import com.norteksoft.acs.entity.authorization.Function; import com.norteksoft.acs.entity.log.Log; import com.norteksoft.product.api.ApiFactory; import com.norteksoft.product.util.ContextUtils; import com.norteksoft.product.web.struts2.Struts2Utils; @Repository public class LogUtilDao { //private static AnalyzeAnnotation analyzeAnnotation; private SimpleHibernateTemplate<Log, Long> logDao; private SimpleHibernateTemplate<Function, Long> functionDao; public LogUtilDao(){} public LogUtilDao(SessionFactory sessionFactory){ setSessionFactory(sessionFactory); //analyzeAnnotation = AnalyzeAnnotation.getInstance(); } public String recordOperateLog(HttpServletRequest request){ List<Function> Functions = functionDao.findByCriteria(Restrictions.eq("deleted", false)); String url = request.getRequestURI(); String functionName = null; for (Function function : Functions) { if(url.endsWith(function.getPath())){ functionName = function.getName(); break; } } return functionName; } /** * 对数据库操作调用此方法 * message简单的格式为动宾语句格式 * 例如1:查看用户:列表 * 例如2:新建用户:用户名[admin] * 添加关系 * 例如3:部门加入人员:部门名称[开发部];人员名称{用户1,用户2,用户3,用户4,用户5} */ // public synchronized void debugLog(Object entity,String message){ // debugSaveOrUpdateLOG(entity, message); // } /** * * message简单的格式为动宾语句格式 * 例如1:查看用户:列表 * 例如2:新建用户:用户名[admin] * 添加关系 * 例如3:部门加入人员:部门名称[开发部];人员名称{用户1,用户2,用户3,用户4,用户5} */ // public synchronized void debugLog(String message){ // debugSaveOrUpdateLOG(message); // } public void debugLog(String optType, String message){ debugSaveOrUpdateLOG(optType, message, null); } public void debugLog(String optType, String message, Long systemId){ debugSaveOrUpdateLOG(optType, message, systemId); } /** * 日志记录 * @param optPerson 操作人 * @param optType 操作类型 * @param message 日志信息 */ public void debugLog(String operatorName, String optType, String message){ Log log = createLog(message, null); log.setOperator(operatorName); log.setOperationType(optType); logDao.save(log); } /** * entity 目前设为NULL,为以后扩展所用 * message简单的格式为动宾语句格式 * 例如:查看:用户列表,新建:用户名是admin; */ // private void debugSaveOrUpdateLOG(Object entity,String message){ // Log log = createLog(message); // logDao.save(log); // } private void debugSaveOrUpdateLOG(String optType, String message, Long systemId){ Log log = createLog(message, systemId); log.setOperationType(optType); logDao.save(log); } /** * message简单的格式为动宾语句格式 * 例如:查看用户列表; * */ // private void debugSaveOrUpdateLOG(String message){ // Log log = createLog(message); // logDao.save(log); // } private Log createLog(String message, Long systemId){ Log log = new Log(); if(Struts2Utils.getRequest()!=null){ log.setIpAddress(Struts2Utils.getRequest().getRemoteHost()); log.setOperator(ContextUtils.getTrueName()); log.setOperatorType(getOperatorType()); }else{ log.setIpAddress("0.0.0.0"); log.setOperator("系统日志"); log.setOperatorType(OperatorType.SYSTEM_ADMIN); } log.setAdminLog(ContextUtils.isAdmin()); log.setCreatedTime(new Date()); log.setMessage(getMessage(message)); log.setCompanyId(getCompanyId()); log.setCompanyName(getCompanyName()); if(systemId != null){ log.setSystemId(systemId); BusinessSystem system=ApiFactory.getAcsService().getSystemById(systemId); if(system!=null)log.setSystemName(system.getName()); }else{ log.setSystemName(ContextUtils.getSystemName()); log.setSystemId(ContextUtils.getSystemId()); } return log; } private OperatorType getOperatorType(){ if(ContextUtils.isSystemAdmin()){ return OperatorType.SYSTEM_ADMIN; }else if(ContextUtils.isSecurityAdmin()){ return OperatorType.SECURITY_ADMIN; }else if(ContextUtils.isAuditAdmin()){ return OperatorType.AUDIT_ADMIN; } return OperatorType.COMMON_USER; } public boolean isHaveId(Object entity) throws SecurityException, NoSuchMethodException{ boolean istrue =false; Method[] method = entity.getClass().getDeclaredMethods(); for (Method mm : method) { if(mm.getName().equals("getId")){ istrue = true; break; } } return istrue; } /** * 例如1:查看用户:列表 * 例如2:新建用户:用户名[admin] * 添加关系 * 例如3:部门加入人员:部门名称[开发部];人员名称{用户1,用户2,用户3,用户4,用户5} */ private String getMessage(String message){ StringBuilder meg = new StringBuilder(message); int index_1 = meg.indexOf(":"); int index_2 = meg.indexOf("["); int index_3 = meg.indexOf("]"); int index_4 = meg.indexOf("];"); int index_5 = meg.indexOf("{"); int index_6 = meg.indexOf("}"); int temp = 0; if(index_1>0){ meg.setCharAt(index_1, ';'); } if(index_2>0){ meg.setCharAt(index_2, ':'); } if(index_4>0){ meg.deleteCharAt(index_4); temp++; } if(index_3>0&&temp==0){ meg.setCharAt(index_3, ';'); } if(index_5>0){ meg.setCharAt(index_5-temp, ':'); } if(index_6>0){ meg.deleteCharAt(index_6-temp); temp++; } return meg.toString(); } public Object getObject(Object child,Session session){ //另外一个方向从代理本身的方向来考虑,实际上经过hibernate代理后的对象实现了org.hibernate.proxy.HibernateProxy 接口,通过该接口可以取得被代理的原始对象,如下: Object target = null; if(child instanceof HibernateProxy){ HibernateProxy proxy = (HibernateProxy)child; target = proxy.getHibernateLazyInitializer().getImplementation(); return target; } return child; } public Long getCompanyId() { return ContextUtils.getCompanyId(); } public String getBusinessName() { return ContextUtils.getSystemName(); } public String getCompanyName() { return ContextUtils.getCompanyName(); } public Long getSysId() { return ContextUtils.getSystemId(); } @Autowired public void setSessionFactory(SessionFactory sessionFactory) { logDao = new SimpleHibernateTemplate<Log, Long>(sessionFactory, Log.class); functionDao = new SimpleHibernateTemplate<Function, Long>(sessionFactory, Function.class); } }