1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package com.vci.server.base.persistence.event;
 
import java.util.Date;
 
import org.hibernate.Session;
import org.hibernate.Transaction;
 
import com.vci.common.objects.Historizable;
import com.vci.common.utility.ObjectUtility;
import com.vci.server.base.persistence.history.HistoryEntry;
import com.vci.server.base.persistence.history.OperationType;
 
public class HistoryQueryListener implements PostUpdateQueryListener, PostDeleteQueryListener{
 
    public void onPostDeleteById(PostDeleteQueryEvent event) {
        if(event.getUserEntity().getUserName().equals("developer")||event.getUserEntity().getUserName().equals("admin")){//开发者模块不记录日志
            return;
        }
        if(event.getObj() instanceof Historizable){
            HistoryEntry entry = new HistoryEntry();
            String id = ObjectUtility.getNewObjectID36();
            entry.setId(id);
            entry.setUser(event.getUserEntity().getUserName());
            entry.setIp(event.getUserEntity().getIp());
            entry.setOperationType(OperationType.DELETE);
            entry.setModule(event.getUserEntity().getModule());
            entry.setTimestamp(new Date());
            entry.setEntityId(event.getValue());
            entry.setEntity(event.getObj().getClass().getSimpleName());
            entry.setDescription(event.getObj().toString());
            recordHistory(event.getSession(), entry);
        }
    }
    
    public void onPostDeleteByIds(PostDeleteQueryEvent event) {
        if(event.getUserEntity().getUserName().equals("developer")||event.getUserEntity().getUserName().equals("admin")){//开发者模块不记录日志
            return;
        }
        String[] ids = event.getValues();
        int len = ids.length;
        for (int i = 0; i < len; i++) {
            if(event.getObjs()[i] instanceof Historizable){
                HistoryEntry entry = new HistoryEntry();
                String id = ObjectUtility.getNewObjectID36();
                entry.setId(id);
                entry.setUser(event.getUserEntity().getUserName());
                entry.setIp(event.getUserEntity().getIp());
                entry.setOperationType(OperationType.DELETE);
                entry.setModule(event.getUserEntity().getModule());
                entry.setTimestamp(new Date());
                entry.setEntityId(ids[i]);
                entry.setEntity(event.getObjs()[i].getClass().getSimpleName());
                entry.setDescription(event.getObjs()[i].toString());
                recordHistory(event.getSession(), entry);
            }
        }
    }
    
    public void onPostDeleteByProperties(PostDeleteQueryEvent event) {
        if(event.getUserEntity().getUserName().equals("developer")||event.getUserEntity().getUserName().equals("admin")){//开发者模块不记录日志
            return;
        }
        String[] props = event.getProps();
        String[] values = event.getValues();
        int len = props.length;
         String desc = "";
        for (int i = 0; i < len; i++) {
            if (i != 0) {
                desc += ";";
            }
            desc += props[i] + ":" + values[i];
        }
        HistoryEntry entry = new HistoryEntry();
        String id = ObjectUtility.getNewObjectID36();
        entry.setId(id);
        entry.setUser(event.getUserEntity().getUserName());
        entry.setIp(event.getUserEntity().getIp());
        entry.setOperationType(OperationType.DELETE);
        entry.setModule(event.getUserEntity().getModule());
        entry.setTimestamp(new Date());
        entry.setDescription(desc);
        entry.setEntity(event.getClassName());
        recordHistory(event.getSession(), entry);
    }
 
    public void onPostUpdateById(PostUpdateQueryEvent event) {
        if(event.getUserEntity().getUserName().equals("developer")||event.getUserEntity().getUserName().equals("admin")){//开发者模块不记录日志
            return;
        }
        if(event.getObj() instanceof Historizable){
            String objId = event.getId();
            String[] props = event.getProps();
            String[] values= event.getValues();
            int len = props.length;
            for (int i = 0; i < len - 1; i++) {
                HistoryEntry entry = new HistoryEntry();
                String id = ObjectUtility.getNewObjectID36();
                entry.setId(id);
                entry.setEntityId(objId);            
                entry.setUser(event.getUserEntity().getUserName());
                entry.setIp(event.getUserEntity().getIp());
                entry.setOperationType(OperationType.UPDATE);
                entry.setModule(event.getUserEntity().getModule());
                entry.setTimestamp(new Date());
                entry.setProperty(props[i]);
                entry.setNewValue(values[i]);
                entry.setEntity(event.getObj().getClass().getSimpleName());
                entry.setDescription(event.getObj().toString());
                recordHistory(event.getSession(), entry);
            }
        }
    }
    
    private void recordHistory(Session session, HistoryEntry entry){
        Session tempSession = session.getSessionFactory().openSession();
        Transaction tx = tempSession.beginTransaction();
        try {
            tempSession.save(entry);
            tempSession.flush();
            tx.commit();
        } catch (Exception ex) {
            ex.printStackTrace();
            try {
                tx.rollback();
            } catch (Exception e) {
            }
        } finally { 
            try {
                tempSession.close();
            } catch (Exception e) {
            }
        }
    }
}