Move management of Sone following times to database.
[Sone.git] / src / main / java / net / pterodactylus / sone / database / memory / MemoryFriendDatabase.java
index 0be8738..8df477a 100644 (file)
@@ -1,9 +1,12 @@
 package net.pterodactylus.sone.database.memory;
 
 import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 
+import com.google.common.base.Optional;
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.Multimap;
 
@@ -17,11 +20,40 @@ class MemoryFriendDatabase {
        private final ReadWriteLock lock = new ReentrantReadWriteLock();
        private final ConfigurationLoader configurationLoader;
        private final Multimap<String, String> soneFriends = HashMultimap.create();
+       private final Map<String, Long> soneFollowingTimes = new HashMap<String, Long>();
 
        MemoryFriendDatabase(ConfigurationLoader configurationLoader) {
                this.configurationLoader = configurationLoader;
        }
 
+       void start() {
+               loadSoneFollowingTimes();
+       }
+
+       private void loadSoneFollowingTimes() {
+               Map<String, Long> soneFollowingTimes = configurationLoader.loadSoneFollowingTimes();
+               lock.writeLock().lock();
+               try {
+                       this.soneFollowingTimes.clear();
+                       this.soneFollowingTimes.putAll(soneFollowingTimes);
+               } finally {
+                       lock.writeLock().unlock();
+               }
+       }
+
+       void stop() {
+               saveSoneFollowingTimes();
+       }
+
+       private void saveSoneFollowingTimes() {
+               lock.readLock().lock();
+               try {
+                       configurationLoader.saveSoneFollowingTimes(soneFollowingTimes);
+               } finally {
+                       lock.readLock().unlock();
+               }
+       }
+
        Collection<String> getFriends(String localSoneId) {
                loadFriends(localSoneId);
                lock.readLock().lock();
@@ -32,6 +64,15 @@ class MemoryFriendDatabase {
                }
        }
 
+       Optional<Long> getSoneFollowingTime(String soneId) {
+               lock.readLock().lock();
+               try {
+                       return Optional.fromNullable(soneFollowingTimes.get(soneId));
+               } finally {
+                       lock.readLock().unlock();
+               }
+       }
+
        boolean isFriend(String localSoneId, String friendSoneId) {
                loadFriends(localSoneId);
                lock.readLock().lock();
@@ -46,6 +87,10 @@ class MemoryFriendDatabase {
                loadFriends(localSoneId);
                lock.writeLock().lock();
                try {
+                       if (!soneFollowingTimes.containsKey(friendSoneId)) {
+                               soneFollowingTimes.put(friendSoneId, System.currentTimeMillis());
+                               saveSoneFollowingTimes();
+                       }
                        if (soneFriends.put(localSoneId, friendSoneId)) {
                                configurationLoader.saveFriends(localSoneId, soneFriends.get(localSoneId));
                        }
@@ -59,6 +104,10 @@ class MemoryFriendDatabase {
                lock.writeLock().lock();
                try {
                        if (soneFriends.remove(localSoneId, friendSoneId)) {
+                               if (!soneFriends.containsValue(friendSoneId)) {
+                                       soneFollowingTimes.remove(friendSoneId);
+                                       saveSoneFollowingTimes();
+                               }
                                configurationLoader.saveFriends(localSoneId, soneFriends.get(localSoneId));
                        }
                } finally {