Skip to content

Instantly share code, notes, and snippets.

@marquesds
Last active April 12, 2021 13:52
Show Gist options
  • Save marquesds/079bde78f3ca4874c3ed0903f276f7eb to your computer and use it in GitHub Desktop.
Save marquesds/079bde78f3ca4874c3ed0903f276f7eb to your computer and use it in GitHub Desktop.
public class ObjectDiff {
private static final Logger LOG = LoggerFactory.getLogger(ObjectDiff.class);
public Map<String, Map<String, Object>> getDiff(Object oldObject, Object newObject) {
Map<String, Map<String, Object>> diff = new HashMap<>();
if (oldObject == null && newObject != null) {
Map<String, Object> objectDiff = new HashMap<>();
String objectName = newObject.getClass().getSimpleName();
objectDiff.put("old", oldObject);
objectDiff.put("new", newObject);
diff.put(objectName, objectDiff);
return diff;
} else if (oldObject != null && newObject == null) {
Map<String, Object> objectDiff = new HashMap<>();
String objectName = oldObject.getClass().getSimpleName();
objectDiff.put("old", oldObject);
objectDiff.put("new", newObject);
diff.put(objectName, objectDiff);
return diff;
} else if (oldObject == null && newObject == null) {
return diff;
}
for(Field newObjectField : newObject.getClass().getDeclaredFields()) {
try {
boolean newObjectAccessSettingsBkp = newObjectField.isAccessible();
newObjectField.setAccessible(true);
Field oldObjectField = oldObject.getClass().getDeclaredField(newObjectField.getName());
boolean oldObjectAccessSettingsBkp = oldObjectField.isAccessible();
oldObjectField.setAccessible(true);
Object oldObjectFieldValue = oldObjectField.get(oldObject);
Object newObjectFieldValue = newObjectField.get(newObject);
if(hasChanges(oldObjectFieldValue, newObjectFieldValue)) {
Map<String, Object> objectDiff = new HashMap<>();
if(newObjectFieldValue instanceof BaseEntity) {
Map childDiff = getDiff(oldObjectFieldValue, newObjectFieldValue);
if(!childDiff.isEmpty()) {
diff.put(newObjectField.getName(), childDiff);
}
} else if (newObjectFieldValue == null || !newObjectFieldValue.equals(oldObjectFieldValue)) {
objectDiff.put("old", oldObjectFieldValue);
objectDiff.put("new", newObjectFieldValue);
diff.put(newObjectField.getName(), objectDiff);
}
}
newObjectField.setAccessible(newObjectAccessSettingsBkp);
oldObjectField.setAccessible(oldObjectAccessSettingsBkp);
} catch (NoSuchFieldException | IllegalAccessException e) {
LOG.error("Could not get object diff. Reason: " + e.getMessage());
}
}
return diff;
}
public boolean hasChanges(Object oldObject, Object newObject) {
DiffNode diff = ObjectDifferBuilder.buildDefault().compare(newObject, oldObject);
return diff.hasChanges();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment