package enterpriseapp.hibernate; import java.io.Serializable; import java.util.Calendar; import org.hibernate.EmptyInterceptor; import org.hibernate.type.Type; import enterpriseapp.EnterpriseApplication; import enterpriseapp.hibernate.dto.AuditLog; import enterpriseapp.ui.Constants; /** * A Hibernate audit interceptor (see AuditLog class) that stores database actions into an Entity class (AuditLog). * You can configure a Hibernate interceptor using the "db.interceptor" property in configuration.properties. * To configure this interceptor add "db.interceptor=enterpriseapp.hibernate.AuditInterceptor" to your configuration * file, create a new Entity class (Dto) that implements AuditLog and create a custom ContainerFactory which * getContainer(Class<?> clazz) method returns your custom AuditLog class when * enterpriseapp.hibernate.dto.AuditLog.class is passed as parameter. * * @author Alejandro Duarte * */ public class AuditInterceptor extends EmptyInterceptor { private static final long serialVersionUID = 1L; @Override public boolean onSave(Object dto, Serializable id, Object[] valor, String[] propiedad, Type[] tipo) { if(!(AuditLog.class.isAssignableFrom(dto.getClass()))) { AuditLog auditLog = createAuditLog(dto, id, valor, propiedad); auditLog.setAction(Constants.uiCreate); ContainerFactory.getInstance().getContainer(AuditLog.class).addItem(auditLog); } return false; } @Override public boolean onFlushDirty(Object dto, Serializable id, Object[] valor, Object[] valorAnterior, String[] propiedad, Type[] tipo) { if(!(AuditLog.class.isAssignableFrom(dto.getClass()))) { AuditLog auditLog = createAuditLog(dto, id, valor, propiedad); auditLog.setAction(Constants.uiModify); ContainerFactory.getInstance().getContainer(AuditLog.class).addItem(auditLog); } return false; } @Override public void onDelete(Object dto, Serializable id, Object[] valor, String[] propiedad, Type[] tipo) { if(!(AuditLog.class.isAssignableFrom(dto.getClass()))) { AuditLog auditLog = createAuditLog(dto, id, valor, propiedad); auditLog.setAction(Constants.uiDelete); ContainerFactory.getInstance().getContainer(AuditLog.class).addItem(auditLog); } } private AuditLog createAuditLog(Object dto, Serializable id, Object[] valor, String[] propiedad) { AuditLog auditLog = (AuditLog) ContainerFactory.getInstance().getContainer(AuditLog.class).newInstance(); auditLog.setDetails(getDetails(valor, propiedad)); auditLog.setDate(Calendar.getInstance().getTime()); auditLog.setDtoId("" + id); auditLog.setEntityType(dto.getClass().getSimpleName()); EnterpriseApplication application = EnterpriseApplication.getInstance(); if(application != null && application.getUser() != null) { auditLog.setUser(application.getUser().toString()); } else { auditLog.setUser(Constants.uiUnknownUser); } if(application != null && application.getRemoteAddr() != null) { auditLog.setIp(application.getRemoteAddr()); } else { auditLog.setIp(Constants.uiUnknownIp); } return auditLog; } public String getDetails(Object[] values, String[] properties) { String details = ""; for(int i = 0; i < properties.length; i++) { details += "[" + properties[i] + "=" + values[i] + "]"; if(i != properties.length - 1) { details += ", "; } } return details; } }