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;
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();
}
}
+ 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();
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));
}
lock.writeLock().lock();
try {
if (soneFriends.remove(localSoneId, friendSoneId)) {
+ if (!soneFriends.containsValue(friendSoneId)) {
+ soneFollowingTimes.remove(friendSoneId);
+ saveSoneFollowingTimes();
+ }
configurationLoader.saveFriends(localSoneId, soneFriends.get(localSoneId));
}
} finally {