Replace Fetched with Kotlin version
[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.base.Optional.fromNullable;
4 import static com.google.common.collect.FluentIterable.from;
5
6 import java.util.HashSet;
7 import java.util.Set;
8 import java.util.concurrent.locks.ReadWriteLock;
9 import java.util.concurrent.locks.ReentrantReadWriteLock;
10
11 import net.pterodactylus.sone.data.Post;
12 import net.pterodactylus.sone.data.Post.EmptyPost;
13 import net.pterodactylus.sone.database.BookmarkDatabase;
14
15 import com.google.common.base.Function;
16
17 /**
18  * Memory-based {@link BookmarkDatabase} implementation.
19  *
20  * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
21  */
22 public class MemoryBookmarkDatabase implements BookmarkDatabase {
23
24         private final ReadWriteLock lock = new ReentrantReadWriteLock();
25         private final MemoryDatabase memoryDatabase;
26         private final ConfigurationLoader configurationLoader;
27         private final Set<String> bookmarkedPosts = new HashSet<String>();
28
29         public MemoryBookmarkDatabase(MemoryDatabase memoryDatabase,
30                         ConfigurationLoader configurationLoader) {
31                 this.memoryDatabase = memoryDatabase;
32                 this.configurationLoader = configurationLoader;
33         }
34
35         public void start() {
36                 loadBookmarkedPosts();
37         }
38
39         private void loadBookmarkedPosts() {
40                 Set<String> bookmarkedPosts = configurationLoader.loadBookmarkedPosts();
41                 lock.writeLock().lock();
42                 try {
43                         this.bookmarkedPosts.clear();
44                         this.bookmarkedPosts.addAll(bookmarkedPosts);
45                 } finally {
46                         lock.writeLock().unlock();
47                 }
48         }
49
50         public void stop() {
51                 saveBookmarkedPosts();
52         }
53
54         private void saveBookmarkedPosts() {
55                 lock.readLock().lock();
56                 try {
57                         configurationLoader.saveBookmarkedPosts(this.bookmarkedPosts);
58                 } finally {
59                         lock.readLock().unlock();
60                 }
61         }
62
63         @Override
64         public void bookmarkPost(Post post) {
65                 lock.writeLock().lock();
66                 try {
67                         bookmarkedPosts.add(post.getId());
68                         saveBookmarkedPosts();
69                 } finally {
70                         lock.writeLock().unlock();
71                 }
72         }
73
74         @Override
75         public void unbookmarkPost(Post post) {
76                 lock.writeLock().lock();
77                 try {
78                         bookmarkedPosts.remove(post.getId());
79                         saveBookmarkedPosts();
80                 } finally {
81                         lock.writeLock().unlock();
82                 }
83         }
84
85         @Override
86         public boolean isPostBookmarked(Post post) {
87                 lock.readLock().lock();
88                 try {
89                         return bookmarkedPosts.contains(post.getId());
90                 } finally {
91                         lock.readLock().unlock();
92                 }
93         }
94
95         @Override
96         public Set<Post> getBookmarkedPosts() {
97                 lock.readLock().lock();
98                 try {
99                         return from(bookmarkedPosts).transform(
100                                         new Function<String, Post>() {
101                                                 @Override
102                                                 public Post apply(String postId) {
103                                                         return fromNullable(memoryDatabase.getPost(postId))
104                                                                         .or(new EmptyPost(postId));
105                                                 }
106                                         }).toSet();
107                 } finally {
108                         lock.readLock().unlock();
109                 }
110         }
111
112 }