X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;ds=inline;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();
+ }
+ }
+
+}