-
Notifications
You must be signed in to change notification settings - Fork 13
/
AuditTrailInterceptor.groovy
110 lines (96 loc) · 3.44 KB
/
AuditTrailInterceptor.groovy
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
package nineci.hibernate //grails.plugin.audittrail
import org.hibernate.EmptyInterceptor
import org.hibernate.type.Type
import org.apache.log4j.Logger
import org.springframework.context.ApplicationContextAware
import org.springframework.context.ApplicationContext
class AuditTrailInterceptor extends EmptyInterceptor implements ApplicationContextAware{
private static final Logger log = Logger.getLogger(AuditTrailInterceptor)
//injected
def grailsApplication
def currentUserClosure
String createdByField
String editedByField
String editedDateField
String createdDateField
String companyIdField
ApplicationContext applicationContext
static Long ANONYMOUS_USER = 0
boolean onFlushDirty(Object entity, Serializable id, Object[] currentState,Object[] previousState, String[] propertyNames,Type[] types) {
def metaClass = entity.metaClass
MetaProperty property = metaClass.hasProperty(entity, editedDateField)
List fieldList = propertyNames.toList()
if(property) {
def now = property.getType().newInstance([System.currentTimeMillis()] as Object[] )
setValue(currentState, fieldList, editedDateField, now)
}
property = metaClass.hasProperty(entity,editedByField)
if(property) {
setValue(currentState, fieldList, editedByField, getUserID())
}
return true
}
boolean onSave(Object entity, Serializable id, Object[] state,String[] propertyNames, Type[] types) {
def metaClass = entity.metaClass
MetaProperty property = metaClass.hasProperty(entity, createdDateField)
def time = System.currentTimeMillis()
List fieldList = propertyNames.toList()
def userId = getUserID()
if(property) {
def now = property.getType().newInstance([time] as Object[] )
setValue(state, fieldList, createdDateField, now)
}
property = metaClass.hasProperty(entity,editedDateField)
if(property) {
def now = property.getType().newInstance([time] as Object[] )
setValue(state, fieldList, editedDateField, now)
}
property = metaClass.hasProperty(entity,editedByField)
if(property) {
setValue(state, fieldList, editedByField, userId)
}
property = metaClass.hasProperty(entity,createdByField)
if(property) {
setValue(state, fieldList, createdByField, userId)
}
property = metaClass.hasProperty(entity,companyIdField)
if(property) {
def curvalue = entity."$companyIdField"
if(curvalue==null || curvalue==0 && userGoodForCompanyId() ){ //only update if its 0 or null
setValue(state, fieldList, companyIdField, getCompanyId())
}
}
return true
}
def setValue(Object[] currentState, List fieldList, String propertyToSet, Object value) {
int index = fieldList.indexOf(propertyToSet)
if (index >= 0) {
currentState[index] = value
}
}
def getUserID() {
def userClos = currentUserClosure?:getSpringSecurityUser
return userClos(applicationContext)
}
def getSpringSecurityUser = { ctx ->
def authPrincipal = ctx.springSecurityService.principal
// Added check for error coming while creating new company
if(authPrincipal && authPrincipal != "anonymousUser"){
return authPrincipal.id
} else {
return 0 //fall back
}
}
def userGoodForCompanyId(){
def authPrincipal = applicationContext.springSecurityService.principal
if(authPrincipal && authPrincipal != "anonymousUser"){
return true
}else{
return false
}
}
Long getCompanyId() {
def authPrincipal = applicationContext.springSecurityService.principal
return authPrincipal.hasProperty(companyIdField)?authPrincipal.companyId:0
}
}