Add bookmark database.
[Sone.git] / src / main / java / net / pterodactylus / sone / database / memory / MemoryBookmarkDatabase.java
1 package net.pterodactylus.sone.database.memory;
2
3 import static com.google.common.collect.FluentIterable.from;
4
5 import java.util.HashSet;
6 import java.util.Set;
7 import java.util.concurrent.locks.ReadWriteLock;
8 import java.util.concurrent.locks.ReentrantReadWriteLock;
9
10 import net.pterodactylus.sone.data.Post;
11 import net.pterodactylus.sone.database.BookmarkDatabase;
12
13 import com.google.common.base.Function;
14
15 /**
16  * Memory-based {@link BookmarkDatabase} implementation.
17  *
18  * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
19  */
20 public class MemoryBookmarkDatabase implements BookmarkDatabase {
21
22         private final ReadWriteLock lock = new ReentrantReadWriteLock();
23         private final MemoryDatabase memoryDatabase;
24         private final Set<String> bookmarkedPosts = new HashSet<String>();
25
26         public MemoryBookmarkDatabase(MemoryDatabase memoryDatabase) {
27                 this.memoryDatabase = memoryDatabase;
28         }
29
30         @Override
31         public void bookmarkPost(String postId) {
32                 lock.writeLock().lock();
33                 try {
34                         bookmarkedPosts.add(postId);
35                 } finally {
36                         lock.writeLock().unlock();
37                 }
38         }
39
40         @Override
41         public void bookmarkPost(Post post) {
42                 lock.writeLock().lock();
43                 try {
44                         bookmarkedPosts.add(post.getId());
45                 } finally {
46                         lock.writeLock().unlock();
47                 }
48         }
49
50         @Override
51         public void unbookmarkPost(Post post) {
52                 lock.writeLock().lock();
53                 try {
54                         bookmarkedPosts.remove(post.getId());
55                 } finally {
56                         lock.writeLock().unlock();
57                 }
58         }
59
60         @Override
61         public boolean isPostBookmarked(Post post) {
62                 lock.readLock().lock();
63                 try {
64                         return bookmarkedPosts.contains(post.getId());
65                 } finally {
66                         lock.readLock().unlock();
67                 }
68         }
69
70         @Override
71         public Set<Post> getBookmarkedPosts() {
72                 lock.readLock().lock();
73                 try {
74                         return from(bookmarkedPosts).transformAndConcat(
75                                         new Function<String, Iterable<Post>>() {
76                                                 @Override
77                                                 public Iterable<Post> apply(String postId) {
78                                                         return memoryDatabase.getPost(postId).asSet();
79                                                 }
80                                         }).toSet();
81                 } finally {
82                         lock.readLock().unlock();
83                 }
84         }
85
86 }