1 package net.pterodactylus.sone.database.memory;
3 import java.util.Collection;
4 import java.util.concurrent.locks.ReadWriteLock;
5 import java.util.concurrent.locks.ReentrantReadWriteLock;
7 import javax.annotation.Nonnull;
8 import javax.annotation.Nullable;
10 import com.google.common.collect.HashMultimap;
11 import com.google.common.collect.Multimap;
14 * In-memory implementation of friend-related functionality.
16 * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
18 class MemoryFriendDatabase {
20 private final ReadWriteLock lock = new ReentrantReadWriteLock();
21 private final ConfigurationLoader configurationLoader;
22 private final Multimap<String, String> soneFriends = HashMultimap.create();
24 MemoryFriendDatabase(ConfigurationLoader configurationLoader) {
25 this.configurationLoader = configurationLoader;
28 Collection<String> getFriends(String localSoneId) {
29 loadFriends(localSoneId);
30 lock.readLock().lock();
32 return soneFriends.get(localSoneId);
34 lock.readLock().unlock();
38 boolean isFriend(String localSoneId, String friendSoneId) {
39 loadFriends(localSoneId);
40 lock.readLock().lock();
42 return soneFriends.containsEntry(localSoneId, friendSoneId);
44 lock.readLock().unlock();
48 void addFriend(String localSoneId, String friendSoneId) {
49 loadFriends(localSoneId);
50 lock.writeLock().lock();
52 if (soneFriends.put(localSoneId, friendSoneId)) {
53 configurationLoader.saveFriends(localSoneId, soneFriends.get(localSoneId));
54 if (configurationLoader.getSoneFollowingTime(friendSoneId) == null) {
55 configurationLoader.setSoneFollowingTime(friendSoneId, System.currentTimeMillis());
59 lock.writeLock().unlock();
63 void removeFriend(String localSoneId, String friendSoneId) {
64 loadFriends(localSoneId);
65 lock.writeLock().lock();
67 if (soneFriends.remove(localSoneId, friendSoneId)) {
68 configurationLoader.saveFriends(localSoneId, soneFriends.get(localSoneId));
71 lock.writeLock().unlock();
76 Long getFollowingTime(@Nonnull String soneId) {
77 return configurationLoader.getSoneFollowingTime(soneId);
80 private void loadFriends(String localSoneId) {
81 lock.writeLock().lock();
83 if (soneFriends.containsKey(localSoneId)) {
86 soneFriends.putAll(localSoneId, configurationLoader.loadFriends(localSoneId));
88 lock.writeLock().unlock();