1 package net.pterodactylus.sone.database.memory;
3 import static com.google.common.base.Optional.fromNullable;
4 import static com.google.common.collect.FluentIterable.from;
6 import java.util.HashSet;
8 import java.util.concurrent.locks.ReadWriteLock;
9 import java.util.concurrent.locks.ReentrantReadWriteLock;
11 import net.pterodactylus.sone.data.Post;
12 import net.pterodactylus.sone.data.Post.EmptyPost;
13 import net.pterodactylus.sone.database.BookmarkDatabase;
15 import com.google.common.base.Function;
18 * Memory-based {@link BookmarkDatabase} implementation.
20 * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
22 public class MemoryBookmarkDatabase implements BookmarkDatabase {
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>();
29 public MemoryBookmarkDatabase(MemoryDatabase memoryDatabase,
30 ConfigurationLoader configurationLoader) {
31 this.memoryDatabase = memoryDatabase;
32 this.configurationLoader = configurationLoader;
36 loadBookmarkedPosts();
39 private void loadBookmarkedPosts() {
40 Set<String> bookmarkedPosts = configurationLoader.loadBookmarkedPosts();
41 lock.writeLock().lock();
43 this.bookmarkedPosts.clear();
44 this.bookmarkedPosts.addAll(bookmarkedPosts);
46 lock.writeLock().unlock();
51 saveBookmarkedPosts();
54 private void saveBookmarkedPosts() {
55 lock.readLock().lock();
57 configurationLoader.saveBookmarkedPosts(this.bookmarkedPosts);
59 lock.readLock().unlock();
64 public void bookmarkPost(Post post) {
65 lock.writeLock().lock();
67 bookmarkedPosts.add(post.getId());
68 saveBookmarkedPosts();
70 lock.writeLock().unlock();
75 public void unbookmarkPost(Post post) {
76 lock.writeLock().lock();
78 bookmarkedPosts.remove(post.getId());
79 saveBookmarkedPosts();
81 lock.writeLock().unlock();
86 public boolean isPostBookmarked(Post post) {
87 lock.readLock().lock();
89 return bookmarkedPosts.contains(post.getId());
91 lock.readLock().unlock();
96 public Set<Post> getBookmarkedPosts() {
97 lock.readLock().lock();
99 return from(bookmarkedPosts).transform(
100 new Function<String, Post>() {
102 public Post apply(String postId) {
103 return fromNullable(memoryDatabase.getPost(postId))
104 .or(new EmptyPost(postId));
108 lock.readLock().unlock();