packagecom.cqta.dev.web.util;importjava.io.IOException;importjava.lang.reflect.Method;importjava.util.Date;importjava.util.HashMap;importjava.util.Map;importjavax.xml.parsers.DocumentBuilder;importjavax.xml.parsers.DocumentBuilderFactory;importjavax.xml.parsers.ParserConfigurationException;importorg.hibernate.event.PostDeleteEvent;importorg.hibernate.event.PostDeleteEventListener;importorg.hibernate.event.PostInsertEvent;importorg.hibernate.event.PostInsertEventListener;importorg.hibernate.event.PostUpdateEvent;importorg.hibernate.event.PostUpdateEventListener;importorg.springframework.security.core.userdetails.User;importorg.w3c.dom.Document;importorg.w3c.dom.Element;importorg.w3c.dom.NodeList;importorg.xml.sax.SAXException;importcom.cqta.dev.model.log.Log;importcom.cqta.dev.model.log.LogAudit;importcom.cqta.dev.service.online.TxtContentService;importcom.cqta.dev.web.util.AppContextUtils;public class LogAuditListener implementsPostInsertEventListener,PostUpdateEventListener, PostDeleteEventListener {/****/
private static final long serialVersionUID = 1L;private static String INSERT="添加";private static String UPDATE="修改";private static String DELETE="删除";private static Map logAuditMap=new HashMap();/*** 添加操作 日志*/
public voidonPostInsert(PostInsertEvent event) {
Class> clazz =event.getEntity().getClass();try{
Log log=null;if (logAuditMap.size() > 0) {
LogAudit logAudit=logAuditMap.get(clazz.getSimpleName());if (logAudit != null) {
log=newLog(logAudit,INSERT);
StringBuilder content= new StringBuilder(INSERT + logAudit.getDescription());//操作说明
User user = null; //操作人
user =SecurityUserHolder.getCurrentUser();
Object[] newState=event.getState();
String[] fields=event.getPersister().getPropertyNames();if (newState != null && fields != null && newState.length ==fields.length ) {for (int i = 0; i < fields.length; i++) {if(logAudit.getProperty().containsKey(fields[i])){
content.append("\""+logAudit.getProperty().get(fields[i])+ "\" "+newState[i]);
}
}
}
log.setDescription(content.toString());
log.setActionUserName(user!=null?user.getUsername():null);
saveOperate(log);
}
}
}catch(Exception e) {
e.printStackTrace();
}
}/*** 修改操作 日志*/
public voidonPostUpdate(PostUpdateEvent event) {
Class> clazz =event.getEntity().getClass();try{
Log log=null;if (logAuditMap.size() > 0) {
LogAudit logAudit=logAuditMap.get(clazz.getSimpleName());if (logAudit != null) {
log=newLog(logAudit,UPDATE);
String content= UPDATE + logAudit.getDescription(); //操作说明
User user = null; //操作人
user =SecurityUserHolder.getCurrentUser();
log.setActionUserName(user!=null?user.getUsername():null);
Object[] oldState= event.getOldState(); //获取旧值
Object[] newState = event.getState(); //获取更改后的值
String[] fields = event.getPersister().getPropertyNames(); //获取对象属性
if("User".equals(clazz.getSimpleName())){ //当对象是用用户时 将用户 单独拿出来 判断用户登录和修改密码
if(oldState != null && newState != null && fields != null && oldState.length == newState.length && oldState.length ==fields.length){boolean ref=false; //是否为登录操作
for (int i = 0; i < fields.length; i++) {if(fields[i]=="lastlogintime" && oldState[i]!=newState[i]){ //登录操作 最后一次登录时间被修改
ref=false;break;
}else if(fields[i]=="password" && oldState[i]!=newState[i]){ //登录操作 最后一次登录时间被修改
content = "修改密码";
ref=true;
}if(logAudit.getProperty().containsKey(fields[i])&&!oldState[i].equals(newState[i])){
content+= "{将 \"" + logAudit.getProperty().get(fields[i]) + "\" : \""+oldState[i]+ "\" 改为 \"" + String.valueOf(newState[i]) + "\"}";
ref=true;
}
}if(ref){
log.setDescription(content);
saveOperate(log);
}
}//如果修改的model不是USER
}else if (oldState != null && newState != null && fields != null && oldState.length == newState.length && oldState.length ==fields.length ) {for (int i = 0; i < fields.length; i++) {if(logAudit.getProperty().containsKey(fields[i])&&!oldState[i].equals(newState[i])){
content+= "{将 \"" + logAudit.getProperty().get(fields[i]) + "\" : \""+oldState[i]+ "\" 改为 \"" + String.valueOf(newState[i]) + "\"}";
}
}
log.setDescription(content);
saveOperate(log);
}
}
}
}catch(Exception e) {
e.printStackTrace();
}
}/*** 删除操作 日志*/
public voidonPostDelete(PostDeleteEvent event) {
Class> clazz =event.getEntity().getClass();try{
Log log=null;if (logAuditMap.size() > 0) {
LogAudit logAudit=logAuditMap.get(clazz.getSimpleName());if (logAudit != null) {
log=newLog(logAudit,DELETE);
log.setDescription(DELETE+logAudit.getDescription());
User user= null; //操作人
user =SecurityUserHolder.getCurrentUser();
log.setActionUserName(user!=null?user.getUsername():null);
saveOperate(log);
}
}
}catch(Exception e) {
e.printStackTrace();
}
}publicLog newLog(LogAudit audit,String operation){
Log log=newLog();
log.setAction(operation);
log.setCommand(audit.getOperate());
log.setActiontime(newDate());returnlog;
}/*** 生成日志
*@paramsession
*@paramentry*/
private void saveOperate(finalLog entry) {//在新的线程中打开hibernate session,解决页面数据不同不问题.
new Thread(newRunnable() {public voidrun() {
TxtContentService txtContentService= (TxtContentService) AppContextUtils.getBean("txtContentService");
txtContentService.saveObject(entry);
}
}).start();
}/*** 读取需做日志记录的XML配置文件
*@return
*/
static{try{
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=dbf.newDocumentBuilder();
Document doc= builder.parse(LogAudit.class.getClassLoader().getResourceAsStream("auditLog.xml")); //获取到xml文件
Element root = doc.getDocumentElement(); //获取根元素
NodeList logAudits = root.getElementsByTagName("entity");
LogAudit log=null;for (int i = 0; i < logAudits.getLength(); i++) {
Element ss=(Element) logAudits.item(i);
log= newLogAudit();
log.setClazz(ss.getAttribute("clazz")); //实体类
log.setDescription(ss.getAttribute("description")); //操作说明
log.setOperate(ss.getAttribute("operate")); //操作项
NodeList propertys = ss.getElementsByTagName("property");//属性
Map proMap=new HashMap();for(int j = 0; j < propertys.getLength(); j++){
Element e=(Element) propertys.item(j);
proMap.put(e.getAttribute("name"), e.getTextContent());
}
log.setProperty(proMap);
logAuditMap.put(ss.getAttribute("clazz"), log);
}
}catch(ParserConfigurationException e) {
e.printStackTrace();
}catch(SAXException e) {
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}
}
}