Last active
April 12, 2021 13:52
-
-
Save marquesds/079bde78f3ca4874c3ed0903f276f7eb to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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