in services/src/main/java/org/apache/unomi/services/impl/profiles/ProfileServiceImpl.java [1179:1219]
private boolean merge(Map<String, Object> target, Map<String, Object> object) {
boolean changed = false;
for (Map.Entry<String, Object> newEntry : object.entrySet()) {
if (newEntry.getValue() != null) {
String packageName = newEntry.getValue().getClass().getPackage().getName();
if (newEntry.getValue() instanceof Collection) {
target.put(newEntry.getKey(), newEntry.getValue());
changed = true;
} else if (newEntry.getValue() instanceof Map) {
Map<String, Object> currentMap = (Map) target.get(newEntry.getKey());
if (currentMap == null) {
target.put(newEntry.getKey(), newEntry.getValue());
changed = true;
} else {
changed |= merge(currentMap, (Map) newEntry.getValue());
}
} else if (StringUtils.equals(packageName, "java.lang")) {
if (newEntry.getValue() != null && !newEntry.getValue().equals(target.get(newEntry.getKey()))) {
target.put(newEntry.getKey(), newEntry.getValue());
changed = true;
}
} else if (newEntry.getValue().getClass().isEnum()) {
target.put(newEntry.getKey(), newEntry.getValue());
changed = true;
} else {
if (target.get(newEntry.getKey()) != null) {
changed |= merge(target.get(newEntry.getKey()), newEntry.getValue());
} else {
target.put(newEntry.getKey(), newEntry.getValue());
changed = true;
}
}
} else {
if (target.containsKey(newEntry.getKey())) {
target.remove(newEntry.getKey());
changed = true;
}
}
}
return changed;
}