1 package net.pterodactylus.sone.database.memory;
3 import static com.google.common.collect.FluentIterable.from;
5 import java.util.HashSet;
7 import java.util.concurrent.locks.ReadWriteLock;
8 import java.util.concurrent.locks.ReentrantReadWriteLock;
10 import net.pterodactylus.sone.data.Post;
11 import net.pterodactylus.sone.data.Post.EmptyPost;
12 import net.pterodactylus.sone.database.BookmarkDatabase;
14 import com.google.common.base.Function;
17 * Memory-based {@link BookmarkDatabase} implementation.
19 * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
21 public class MemoryBookmarkDatabase implements BookmarkDatabase {
23 private final ReadWriteLock lock = new ReentrantReadWriteLock();
24 private final MemoryDatabase memoryDatabase;
25 private final ConfigurationLoader configurationLoader;
26 private final Set<String> bookmarkedPosts = new HashSet<String>();
28 public MemoryBookmarkDatabase(MemoryDatabase memoryDatabase,
29 ConfigurationLoader configurationLoader) {
30 this.memoryDatabase = memoryDatabase;
31 this.configurationLoader = configurationLoader;
35 loadBookmarkedPosts();
38 private void loadBookmarkedPosts() {
39 Set<String> bookmarkedPosts = configurationLoader.loadBookmarkedPosts();
40 lock.writeLock().lock();
42 this.bookmarkedPosts.clear();
43 this.bookmarkedPosts.addAll(bookmarkedPosts);
45 lock.writeLock().unlock();
50 saveBookmarkedPosts();
53 private void saveBookmarkedPosts() {
54 lock.readLock().lock();
56 configurationLoader.saveBookmarkedPosts(this.bookmarkedPosts);
58 lock.readLock().unlock();
63 public void bookmarkPost(Post post) {
64 lock.writeLock().lock();
66 bookmarkedPosts.add(post.getId());
67 saveBookmarkedPosts();
69 lock.writeLock().unlock();
74 public void unbookmarkPost(Post post) {
75 lock.writeLock().lock();
77 bookmarkedPosts.remove(post.getId());
78 saveBookmarkedPosts();
80 lock.writeLock().unlock();
85 public boolean isPostBookmarked(Post post) {
86 lock.readLock().lock();
88 return bookmarkedPosts.contains(post.getId());
90 lock.readLock().unlock();
95 public Set<Post> getBookmarkedPosts() {
96 lock.readLock().lock();
98 return from(bookmarkedPosts).transform(
99 new Function<String, Post>() {
101 public Post apply(String postId) {
102 return memoryDatabase.getPost(postId)
103 .or(new EmptyPost(postId));
107 lock.readLock().unlock();