]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/storage/contacts/JsonContactsStore.java
c10dfbb7bb72d22089a2417f5493441bd3446ac8
[signal-cli] / src / main / java / org / asamk / signal / storage / contacts / JsonContactsStore.java
1 package org.asamk.signal.storage.contacts;
2
3 import com.fasterxml.jackson.annotation.JsonProperty;
4 import com.fasterxml.jackson.core.JsonGenerator;
5 import com.fasterxml.jackson.core.JsonParser;
6 import com.fasterxml.jackson.databind.DeserializationContext;
7 import com.fasterxml.jackson.databind.JsonDeserializer;
8 import com.fasterxml.jackson.databind.JsonNode;
9 import com.fasterxml.jackson.databind.JsonSerializer;
10 import com.fasterxml.jackson.databind.ObjectMapper;
11 import com.fasterxml.jackson.databind.SerializerProvider;
12 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
13 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
14
15 import java.io.IOException;
16 import java.util.ArrayList;
17 import java.util.HashMap;
18 import java.util.List;
19 import java.util.Map;
20
21 public class JsonContactsStore {
22
23 private static final ObjectMapper jsonProcessor = new ObjectMapper();
24 @JsonProperty("contacts")
25 @JsonSerialize(using = JsonContactsStore.MapToListSerializer.class)
26 @JsonDeserialize(using = ContactsDeserializer.class)
27 private Map<String, ContactInfo> contacts = new HashMap<>();
28
29 public void updateContact(ContactInfo contact) {
30 contacts.put(contact.number, contact);
31 }
32
33 public ContactInfo getContact(String number) {
34 return contacts.get(number);
35 }
36
37 public List<ContactInfo> getContacts() {
38 return new ArrayList<>(contacts.values());
39 }
40
41 /**
42 * Remove all contacts from the store
43 */
44 public void clear() {
45 contacts.clear();
46 }
47
48 private static class MapToListSerializer extends JsonSerializer<Map<?, ?>> {
49
50 @Override
51 public void serialize(final Map<?, ?> value, final JsonGenerator jgen, final SerializerProvider provider) throws IOException {
52 jgen.writeObject(value.values());
53 }
54 }
55
56 private static class ContactsDeserializer extends JsonDeserializer<Map<String, ContactInfo>> {
57
58 @Override
59 public Map<String, ContactInfo> deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
60 Map<String, ContactInfo> contacts = new HashMap<>();
61 JsonNode node = jsonParser.getCodec().readTree(jsonParser);
62 for (JsonNode n : node) {
63 ContactInfo c = jsonProcessor.treeToValue(n, ContactInfo.class);
64 contacts.put(c.number, c);
65 }
66
67 return contacts;
68 }
69 }
70 }