So what I came up with to make life easier was to create an annotation to mark the fields I was interested in comparing. Without I ended up having to get with sticking to naming conversation like only only using methods that start with 'get'. I found there was a lot of corner cases with this approach.
The annotation.
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface AuditCompare {
public String name() default "";
public CompareType compareBy() default CompareType.string;
enum CompareType {
string, count
}
}
which gets used like
@Entity
@Audited
public class Guideline {
.....
@AuditCompare
private String name;
@AuditCompare
private String owner;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval=true, mappedBy="guideline")
private Set<GuidelineCheckListItem> checkListItems = new HashSet<GuidelineCheckListItem>();
.........
}
Since envers audits both the Set changing and the object of the set as two different events I didn't want to compare if the set change. Then to do the comparison I have method that looks like
private void findMatchingValues(Object oldInstance, Object newInstance, ActivityEntry entry) {
try {
Class oldClass = oldInstance.getClass();
for (Field someField : oldClass.getDeclaredFields()) {
if (someField.isAnnotationPresent(AuditCompare.class)) {
String name = someField.getAnnotation(AuditCompare.class).name();
name = name.equals("") ? someField.getName() : name;
Method method = oldClass.getDeclaredMethod(getGetterName(name));
if(someField.getAnnotation(AuditCompare.class).compareBy().equals(AuditCompare.CompareType.count)) {
int oldSize = getCollectionCount(oldInstance, method);
int newSize = getCollectionCount(newInstance, method);
if (oldSize != newSize) entry.addChangeEntry(name, oldSize, newSize);
} else {
Object oldValue = getObjectValue(oldInstance, method);
Object newValue = getObjectValue(newInstance, method);
if (!oldValue.equals(newValue)) entry.addChangeEntry(name, oldValue, newValue);
}
}
}
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
}
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…