diff --git a/telegrambots-abilities/src/main/java/org/telegram/abilitybots/api/db/BackupMap.java b/telegrambots-abilities/src/main/java/org/telegram/abilitybots/api/db/BackupMap.java new file mode 100644 index 00000000..3647f511 --- /dev/null +++ b/telegrambots-abilities/src/main/java/org/telegram/abilitybots/api/db/BackupMap.java @@ -0,0 +1,36 @@ +package org.telegram.abilitybots.api.db; + +import org.telegram.abilitybots.api.util.Pair; + +import java.util.*; + +final class BackupMap extends AbstractCollection> implements Collection> { + private Collection> entries = new HashSet<>(); + + public BackupMap(){} + + public BackupMap(Map map) { + map.forEach((key, value) -> entries.add(Pair.of(key, value))); + } + + public Map toMap() { + Map map = new HashMap<>(); + entries.forEach(e -> map.put(e.a(), e.b())); + return map; + } + + @Override + public Iterator> iterator() { + return entries.iterator(); + } + + @Override + public int size() { + return entries.size(); + } + + @Override + public boolean add(Pair kvPair) { + return entries.add(kvPair); + } +} diff --git a/telegrambots-abilities/src/main/java/org/telegram/abilitybots/api/db/MapDBContext.java b/telegrambots-abilities/src/main/java/org/telegram/abilitybots/api/db/MapDBContext.java index 502ca1d8..781d5b87 100644 --- a/telegrambots-abilities/src/main/java/org/telegram/abilitybots/api/db/MapDBContext.java +++ b/telegrambots-abilities/src/main/java/org/telegram/abilitybots/api/db/MapDBContext.java @@ -184,7 +184,7 @@ public class MapDBContext implements DBContext { else if (struct instanceof List) return Pair.of(entry.getKey(), newArrayList((List) struct)); else if (struct instanceof Map) - return Pair.of(entry.getKey(), newHashMap((Map) struct)); + return Pair.of(entry.getKey(), new BackupMap((Map) struct)); else return Pair.of(entry.getKey(), struct); }).collect(toMap(pair -> (String) pair.a(), Pair::b)); @@ -197,17 +197,8 @@ public class MapDBContext implements DBContext { if (value instanceof Set) { Set entrySet = (Set) value; getSet(name).addAll(entrySet); - } else if (value instanceof Map) { - Map entryMap = (Map) value; - - // TODO: This is ugly - // Special handling of USERS since the key is an integer. JSON by default considers a map a JSONObject. - // Keys are serialized and deserialized as String - if (name.equals(USERS)) - entryMap = entryMap.entrySet().stream() - .map(entry -> Pair.of(Integer.parseInt(entry.getKey().toString()), entry.getValue())) - .collect(toMap(Pair::a, Pair::b)); - + } else if (value instanceof BackupMap) { + Map entryMap = ((BackupMap) value).toMap(); getMap(name).putAll(entryMap); } else if (value instanceof List) { List entryList = (List) value;