Revision: 67116
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at August 13, 2014 18:43 by jasonhue
Initial Code
package net.javabeat.spring.audit;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;
import javax.annotation.Resource;
import org.apache.commons.beanutils.BeanMap;
import org.apache.commons.beanutils.PropertyUtilsBean;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.hibernate.SessionFactory;
import org.hibernate.metadata.ClassMetadata;
import org.infinispan.commons.api.BasicCache;
import org.springframework.aop.framework.Advised;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;
import net.javabeat.spring.cache.LocalCacheManager;
import net.javabeat.spring.model.AuditTable;
import net.javabeat.spring.service.AuditFlowService;
import net.javabeat.spring.service.AuditTableService;
import net.javabeat.spring.util.JsonUtils;
@Aspect
@Component("auditTrailAspect")
@Configurable
@EnableAspectJAutoProxy
public class AuditTrailAspect {
@Autowired
private AuditTableService auditTableService;
@Resource
private SessionFactory sessionFactory;
@Autowired private AuditFlowService auditFlowService;
private static BasicCache<Object, Object> caches = LocalCacheManager.getCache();
@Before("execution(public * net.javabeat.spring.dao..*.genericUpdate(..)) && args(bean)")
public void traceBeforeUpdate(JoinPoint joinPoint, Object bean) {
try {
Advised advised = (Advised) joinPoint.getThis();
Class<?> cls = advised.getTargetSource().getTargetClass();
ClassMetadata metadata = sessionFactory.getClassMetadata(bean.getClass());
String entityPrimaryKey = metadata.getIdentifierPropertyName();
JsonUtils utils = new JsonUtils();
int typeid = Integer.parseInt(utils.getProperty(bean, entityPrimaryKey)) ;
Object service = advised.getTargetSource().getTarget();
Method findMethod = cls.getSuperclass().getMethod("genericGetById", new Class[] {int.class});
Object oldValue = findMethod.invoke(service, typeid);
String key = bean.toString() + typeid;
caches.put(key, oldValue);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@AfterReturning("execution(public * net.javabeat.spring.dao..*.genericUpdate(..)) && args(bean)")
public void traceAfterUpdate(JoinPoint joinPoint, Object bean) {
String key = null;
try {
Advised advised = (Advised) joinPoint.getThis();
Class<?> cls = advised.getTargetSource().getTargetClass();
JsonUtils utils = new JsonUtils();
ClassMetadata metadata = sessionFactory.getClassMetadata(bean.getClass());
String entityPrimaryKey = metadata.getIdentifierPropertyName();
int typeid = Integer.parseInt(utils.getProperty(bean,entityPrimaryKey)) ;
key = bean.toString() + typeid;
Object oldValue = (caches.get(key) == null ? null : caches.get(key));
ObjectMapper mapper = new ObjectMapper();
ChangeSetRecord changeSetRecord = new ChangeSetRecord ();
changeSetRecord = compareObjects(oldValue, bean);
if (changeSetRecord != null){
AuditTable auditRecord = new AuditTable();
auditRecord.setEntityname(bean.getClass().getSimpleName());
auditRecord.setAction("Update");
auditRecord.setChangeset(mapper.writeValueAsString( changeSetRecord ) );
auditTableService.createAudit(auditRecord);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private class ChangeSetRecord extends HashMap<String, List<String>> {
public void put(String key,String index) {
List<String> current = get(key);
if (current == null) {
current = new ArrayList<String>();
super.put(key, current);
}
current.add(index);
}
}
public ChangeSetRecord compareObjects(Object oldObject, Object newObject) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
BeanMap map = new BeanMap(oldObject);
PropertyUtilsBean propUtils = new PropertyUtilsBean();
ChangeSetRecord changeSetRecord = new ChangeSetRecord();
for (Object propNameObject : map.keySet()) {
String propertyName = (String) propNameObject;
Object property1 = propUtils.getProperty(oldObject, propertyName);
Object property2 = propUtils.getProperty(newObject, propertyName);
if (property1.equals(property2)) {
System.out.println(" " + propertyName + " is equal");
} else {
System.out.println("> " + propertyName + " is different (oldValue=\"" + property1 + "\", newValue=\"" + property2 + "\")");
changeSetRecord.put(propertyName, (property1 == null ? "" : property1.toString()));
changeSetRecord.put(propertyName, (property2 == null ? "" : property2.toString()));
}
}
return changeSetRecord;
}
}
Initial URL
Initial Description
Audit Trail
Initial Title
Spring AOP Audit Trail
Initial Tags
Initial Language
Java