Make watcher copy method deepcopy collections

This commit is contained in:
jasc7636 2020-06-15 10:08:56 +02:00
parent 033f80c6ed
commit cdcef4649d
2 changed files with 161 additions and 12 deletions

View file

@ -115,18 +115,38 @@ public abstract class Watcher implements Serializable {
((Set) field.get(watcher)).clear();
((Set) field.get(watcher)).addAll((Set) field.get(this));
} else if (field.getType() == Map.class) {
Map target = ((Map) field.get(watcher));
target.clear();
Map source = (Map) field.get(this);
ParameterizedType parameterizedType = (ParameterizedType) field.getGenericType();
Type valueType = parameterizedType.getActualTypeArguments()[1];
if (valueType.getClass().getSimpleName().contains("Set")) {
source.entrySet().forEach(kv -> {
Object key = ((Map.Entry) kv).getKey();
Set value = (Set) ((Map.Entry) kv).getValue();
target.put(key, new HashSet<>(value));
});
if (valueType.getTypeName().contains("Set")) {
Map<Object, Set<Object>> source = (Map<Object, Set<Object>>) field.get(this);
Map<Object, Set<Object>> target = (Map<Object, Set<Object>>) field.get(watcher);
target.clear();
for (Map.Entry<Object, Set<Object>> e : source.entrySet()) {
Set<Object> set = new HashSet<>();
set.addAll(e.getValue());
target.put(e.getKey(), set);
}
}
else if (valueType.getTypeName().contains("List")) {
Map<Object, List<Object>> source = (Map<Object, List<Object>>) field.get(this);
Map<Object, List<Object>> target = (Map<Object, List<Object>>) field.get(watcher);
target.clear();
for (Map.Entry<Object, List<Object>> e : source.entrySet()) {
List<Object> list = new ArrayList<>();
list.addAll(e.getValue());
target.put(e.getKey(), list);
}
}
else if (valueType.getTypeName().contains("Map")) {
Map<Object, Map<Object, Object>> source = (Map<Object, Map<Object, Object>>) field.get(this);
Map<Object, Map<Object, Object>> target = (Map<Object, Map<Object, Object>>) field.get(watcher);
target.clear();
for (Map.Entry<Object, Map<Object, Object>> e : source.entrySet()) {
Map<Object, Object> map = new HashMap<>();
map.putAll(e.getValue());
target.put(e.getKey(), map);
}
}
else {
((Map) field.get(watcher)).putAll((Map) field.get(this));