package net.techreadiness.persistence;
import javax.inject.Inject;
import net.techreadiness.service.ServiceContext;
import org.apache.commons.lang3.ArrayUtils;
import org.hibernate.event.PreInsertEvent;
import org.hibernate.event.PreInsertEventListener;
import org.hibernate.event.PreUpdateEvent;
import org.hibernate.event.PreUpdateEventListener;
import org.springframework.stereotype.Component;
@Component
public class AuditedEntityListener implements PreUpdateEventListener, PreInsertEventListener {
private static final long serialVersionUID = 1L;
@Inject
private ServiceContext serviceContext;
@Override
public boolean onPreUpdate(PreUpdateEvent event) {
if (event.getEntity() instanceof AuditedBaseEntity) {
AuditedBaseEntity e = (AuditedBaseEntity) event.getEntity();
e.setChangeUser(serviceContext.getUserName());
setValue(event.getState(), event.getPersister().getEntityMetamodel().getPropertyNames(), "changeUser",
e.getChangeUser());
}
return false;
}
@Override
public boolean onPreInsert(PreInsertEvent event) {
if (event.getEntity() instanceof AuditedBaseEntity) {
AuditedBaseEntity e = (AuditedBaseEntity) event.getEntity();
e.setChangeUser(serviceContext.getUserName());
setValue(event.getState(), event.getPersister().getEntityMetamodel().getPropertyNames(), "changeUser",
e.getChangeUser());
}
return false;
}
private static void setValue(Object[] currentState, String[] propertyNames, String propertyToSet, Object value) {
int index = ArrayUtils.indexOf(propertyNames, propertyToSet);
if (index >= 0) {
currentState[index] = value;
}
}
}