Hello-
My interceptor's onFlushDirty() method is being invoked even for newly created entities. My understanding is onSave() is for inserts and onFlushDirty() for updates.
Any pointers will be highly appreciated.
Thanks.
Code:
public class AuditLogInterceptor extends EmptyInterceptor {
/**
*
*/
private static final long serialVersionUID = -634733855120326803L;
/**
*
*/
private XLogger logger = XLoggerFactory
.getXLogger(AuditLogInterceptor.class.getName());
private Set<Auditable> inserts = new HashSet<Auditable>();
private Set<Auditable> updates = new HashSet<Auditable>();
public AuditLogInterceptor() {
}
@Override
public boolean onSave(Object entity, Serializable id, Object[] state,
String[] propertyNames, Type[] types) throws CallbackException {
logger.entry(entity, id, state, propertyNames);
boolean retVal = false;
if (entity instanceof Auditable) {
for (int i = 0; i < propertyNames.length; i++) {
if ("createdOn".equals(propertyNames[i])) {
state[i] = new Date();
retVal = true;
}
if ("createdBy".equals(propertyNames[i])) {
state[i] = MLUtils.getUsername();
retVal = true;
}
}
inserts.add((Auditable) entity);
}
logger.exit();
return retVal;
}
@Override
public boolean onFlushDirty(Object entity, Serializable id,
Object[] currentState, Object[] previousState,
String[] propertyNames, Type[] types) throws CallbackException {
logger.entry(entity, id, currentState, previousState);
boolean retVal = false;
if (entity instanceof Auditable) {
for (int i = 0; i < propertyNames.length; i++) {
if ("updatedOn".equals(propertyNames[i])) {
currentState[i] = new Date();
retVal = true;
}
if ("updatedBy".equals(propertyNames[i])) {
currentState[i] = MLUtils.getUsername();
retVal = true;
}
System.err.println(propertyNames[i] + ": current sate = " + currentState[i] + ", previous state = " + previousState[i]);
}
updates.add((Auditable) entity);
}
logger.exit();
return retVal;
}
@Override
public void postFlush(@SuppressWarnings("rawtypes") Iterator iterator)
throws CallbackException {
logger.entry(iterator);
while (iterator.hasNext()) {
Object o = iterator.next();
if (!(o instanceof Auditable)) {
return;
}
}
try {
for (Auditable entity : inserts) {
AuditLog.logEvent("create", entity, MLUtils.getUsername());
}
for (Auditable entity : updates) {
AuditLog.logEvent("update", entity, MLUtils.getUsername());
}
} finally {
inserts.clear();
updates.clear();
}
logger.exit();
}
}