package enterpriseapp.hibernate; import java.io.Serializable; import org.hibernate.EmptyInterceptor; import org.hibernate.type.Type; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import enterpriseapp.EnterpriseApplication; import enterpriseapp.ui.Constants; /** * A Hibernate audit interceptor (see AuditLog class) that logs database accions using SLF4J. * You can configure a Hibernate interceptor using the "db.interceptor" property in configuration.properties. * To configure this interceptor add "db.interceptor=enterpriseapp.hibernate.LogBasedAuditInterceptor" to your configuration file. * * @author Alejandro Duarte * */ public class LogBasedAuditInterceptor extends EmptyInterceptor { private static final long serialVersionUID = 1L; private static Logger logger = LoggerFactory.getLogger(LogBasedAuditInterceptor.class); @Override public boolean onSave(Object dto, Serializable id, Object[] values, String[] properties, Type[] tipo) { logger.info(getAuditLog(Constants.uiCreate, dto, id, values, properties)); return false; } @Override public boolean onFlushDirty(Object dto, Serializable id, Object[] valor, Object[] valorAnterior, String[] propiedad, Type[] tipo) { logger.info(getAuditLog(Constants.uiModify, dto, id, valor, propiedad)); return false; } @Override public void onDelete(Object dto, Serializable id, Object[] valor, String[] propiedad, Type[] tipo) { logger.info(getAuditLog(Constants.uiDelete, dto, id, valor, propiedad)); } private String getAuditLog(String action, Object dto, Serializable id, Object[] valor, String[] propiedad) { String details = getDetails(valor, propiedad); String entityType = dto.getClass().getSimpleName(); String user = null; String ip = null; EnterpriseApplication application = EnterpriseApplication.getInstance(); if(application != null && application.getUser() != null) { user = application.getUser().toString(); } else { user = Constants.uiUnknownUser; } if(application != null && application.getRemoteAddr() != null) { ip = application.getRemoteAddr(); } else { ip = Constants.uiUnknownIp; } return Constants.appLogBasedAuditFormat .replace("${user}", user) .replace("${ip}", ip) .replace("${action}", action) .replace("${type}", entityType) .replace("${id}", "" + id) .replace("${details}", details); } 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; } }