+ database.storePosts(sone, posts);
+ for (Post post : posts) {
+ post.setKnown();
+ }
+ database.storePostReplies(sone, replies);
+ for (PostReply reply : replies) {
+ reply.modify().setKnown().update(Optional.<ReplyUpdated<PostReply>>absent());
+ }
+
+ logger.info(String.format("Sone loaded successfully: %s", sone));
+ }
+
+ /**
+ * Deletes the given post.
+ *
+ * @param post
+ * The post to delete
+ */
+ public void deletePost(Post post) {
+ if (!post.getSone().isLocal()) {
+ logger.log(Level.WARNING, String.format("Tried to delete post of non-local Sone: %s", post.getSone()));
+ return;
+ }
+ database.removePost(post);
+ eventBus.post(new PostRemovedEvent(post));
+ markPostKnown(post);
+ touchConfiguration();
+ }
+
+ /**
+ * Marks the given post as known, if it is currently not a known post
+ * (according to {@link Post#isKnown()}).
+ *
+ * @param post
+ * The post to mark as known
+ */
+ public void markPostKnown(Post post) {
+ post.setKnown();
+ eventBus.post(new MarkPostKnownEvent(post));
+ touchConfiguration();
+ for (PostReply reply : post.getReplies()) {
+ reply.modify().setKnown().update(postReplyUpdated());
+ }
+ }
+
+ /**
+ * Bookmarks the post with the given ID.
+ *
+ * @param id
+ * The ID of the post to bookmark
+ */
+ public void bookmarkPost(String id) {
+ synchronized (bookmarkedPosts) {
+ bookmarkedPosts.add(id);
+ }
+ }
+
+ /**
+ * Removes the given post from the bookmarks.
+ *
+ * @param post
+ * The post to unbookmark
+ */
+ public void unbookmark(Post post) {
+ unbookmarkPost(post.getId());
+ }
+
+ /**
+ * Removes the post with the given ID from the bookmarks.
+ *
+ * @param id
+ * The ID of the post to unbookmark
+ */
+ public void unbookmarkPost(String id) {
+ synchronized (bookmarkedPosts) {
+ bookmarkedPosts.remove(id);
+ }
+ }
+
+ /**
+ * Deletes the given reply.
+ *
+ * @param reply
+ * The reply to delete
+ */
+ public void deleteReply(PostReply reply) {
+ Sone sone = reply.getSone();
+ if (!sone.isLocal()) {
+ logger.log(Level.FINE, String.format("Tried to delete non-local reply: %s", reply));
+ return;
+ }
+ postReplyUpdated().get().replyUpdated(reply);
+ database.removePostReply(reply);
+ touchConfiguration();
+ }
+
+ /**
+ * Creates a new image.
+ *
+ * @param sone
+ * The Sone creating the image
+ * @param album
+ * The album the image will be inserted into
+ * @param temporaryImage
+ * The temporary image to create the image from
+ * @return The newly created image
+ */
+ public Image createImage(Sone sone, Album album, TemporaryImage temporaryImage) {
+ checkNotNull(sone, "sone must not be null");
+ checkNotNull(album, "album must not be null");
+ checkNotNull(temporaryImage, "temporaryImage must not be null");
+ checkArgument(sone.isLocal(), "sone must be a local Sone");
+ checkArgument(sone.equals(album.getSone()), "album must belong to the given Sone");
+ Image image = album.newImageBuilder().withId(temporaryImage.getId()).sized(temporaryImage.getWidth(), temporaryImage.getHeight()).build(imageCreated());
+ imageInserter.insertImage(temporaryImage, image);
+ return image;