X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;ds=sidebyside;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fdatabase%2Fmemory%2FMemoryFriendDatabase.java;fp=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fdatabase%2Fmemory%2FMemoryFriendDatabase.java;h=180284327b02ffadfb862e271af9172232b332fa;hb=2524f4d47c56874a263f9e53ec5c4035f2baa7e0;hp=0000000000000000000000000000000000000000;hpb=b5e02b755778a6d24fee5419a1c697a1e2581471;p=Sone.git diff --git a/src/main/java/net/pterodactylus/sone/database/memory/MemoryFriendDatabase.java b/src/main/java/net/pterodactylus/sone/database/memory/MemoryFriendDatabase.java new file mode 100644 index 0000000..1802843 --- /dev/null +++ b/src/main/java/net/pterodactylus/sone/database/memory/MemoryFriendDatabase.java @@ -0,0 +1,79 @@ +package net.pterodactylus.sone.database.memory; + +import java.util.Collection; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; + +/** + * In-memory implementation of friend-related functionality. + * + * @author David ‘Bombe’ Roden + */ +class MemoryFriendDatabase { + + private final ReadWriteLock lock = new ReentrantReadWriteLock(); + private final ConfigurationLoader configurationLoader; + private final Multimap soneFriends = HashMultimap.create(); + + MemoryFriendDatabase(ConfigurationLoader configurationLoader) { + this.configurationLoader = configurationLoader; + } + + Collection getFriends(String localSoneId) { + loadFriends(localSoneId); + lock.readLock().lock(); + try { + return soneFriends.get(localSoneId); + } finally { + lock.readLock().unlock(); + } + } + + boolean isFriend(String localSoneId, String friendSoneId) { + loadFriends(localSoneId); + lock.readLock().lock(); + try { + return soneFriends.containsEntry(localSoneId, friendSoneId); + } finally { + lock.readLock().unlock(); + } + } + + void addFriend(String localSoneId, String friendSoneId) { + lock.writeLock().lock(); + try { + if (soneFriends.put(localSoneId, friendSoneId)) { + configurationLoader.saveFriends(localSoneId, soneFriends.get(localSoneId)); + } + } finally { + lock.writeLock().unlock(); + } + } + + void removeFriend(String localSoneId, String friendSoneId) { + lock.writeLock().lock(); + try { + if (soneFriends.remove(localSoneId, friendSoneId)) { + configurationLoader.saveFriends(localSoneId, soneFriends.get(localSoneId)); + } + } finally { + lock.writeLock().unlock(); + } + } + + private void loadFriends(String localSoneId) { + lock.writeLock().lock(); + try { + if (soneFriends.containsKey(localSoneId)) { + return; + } + soneFriends.putAll(localSoneId, configurationLoader.loadFriends(localSoneId)); + } finally { + lock.writeLock().unlock(); + } + } + +}