Remove method to mark replies as known from the core.
[Sone.git] / src / main / java / net / pterodactylus / sone / core / Core.java
index e550652..fbcc8b3 100644 (file)
@@ -62,18 +62,18 @@ import net.pterodactylus.sone.data.Post;
 import net.pterodactylus.sone.data.PostReply;
 import net.pterodactylus.sone.data.Profile;
 import net.pterodactylus.sone.data.Profile.Field;
-import net.pterodactylus.sone.data.Reply;
+import net.pterodactylus.sone.data.Reply.Modifier.ReplyUpdated;
 import net.pterodactylus.sone.data.Sone;
 import net.pterodactylus.sone.data.Sone.ShowCustomAvatars;
 import net.pterodactylus.sone.data.Sone.SoneStatus;
 import net.pterodactylus.sone.data.TemporaryImage;
 import net.pterodactylus.sone.database.Database;
 import net.pterodactylus.sone.database.DatabaseException;
+import net.pterodactylus.sone.database.ImageBuilder.ImageCreated;
 import net.pterodactylus.sone.database.PostBuilder;
 import net.pterodactylus.sone.database.PostBuilder.PostCreated;
-import net.pterodactylus.sone.database.PostProvider;
 import net.pterodactylus.sone.database.PostReplyBuilder;
-import net.pterodactylus.sone.database.PostReplyProvider;
+import net.pterodactylus.sone.database.PostReplyBuilder.PostReplyCreated;
 import net.pterodactylus.sone.database.SoneProvider;
 import net.pterodactylus.sone.fcp.FcpInterface;
 import net.pterodactylus.sone.fcp.FcpInterface.FullAccessRequired;
@@ -113,14 +113,11 @@ import com.google.inject.Inject;
  *
  * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
  */
-public class Core extends AbstractService implements SoneProvider, PostProvider, PostReplyProvider {
+public class Core extends AbstractService implements SoneProvider {
 
        /** The logger. */
        private static final Logger logger = Logging.getLogger(Core.class);
 
-       /** The start time. */
-       private final long startupTime = System.currentTimeMillis();
-
        /** The options. */
        private final Options options = new Options();
 
@@ -236,15 +233,6 @@ public class Core extends AbstractService implements SoneProvider, PostProvider,
        //
 
        /**
-        * Returns the time Sone was started.
-        *
-        * @return The startup time (in milliseconds since Jan 1, 1970 UTC)
-        */
-       public long getStartupTime() {
-               return startupTime;
-       }
-
-       /**
         * Sets the configuration to use. This will automatically save the current
         * configuration to the given configuration.
         *
@@ -331,7 +319,6 @@ public class Core extends AbstractService implements SoneProvider, PostProvider,
                }
        }
 
-       /** {@inheritDocs} */
        @Override
        public Collection<Sone> getSones() {
                synchronized (sones) {
@@ -339,15 +326,6 @@ public class Core extends AbstractService implements SoneProvider, PostProvider,
                }
        }
 
-       /**
-        * Returns the Sone with the given ID, regardless whether it’s local or
-        * remote.
-        *
-        * @param id
-        *              The ID of the Sone to get
-        * @return The Sone with the given ID, or {@code null} if there is no such
-        *         Sone
-        */
        @Override
        public Optional<Sone> getSone(String id) {
                synchronized (sones) {
@@ -355,7 +333,6 @@ public class Core extends AbstractService implements SoneProvider, PostProvider,
                }
        }
 
-       /** {@inheritDocs} */
        @Override
        public Collection<Sone> getLocalSones() {
                synchronized (sones) {
@@ -380,7 +357,6 @@ public class Core extends AbstractService implements SoneProvider, PostProvider,
                return from(database.getSone(id).asSet()).firstMatch(LOCAL_SONE_FILTER);
        }
 
-       /** {@inheritDocs} */
        @Override
        public Collection<Sone> getRemoteSones() {
                synchronized (sones) {
@@ -432,62 +408,6 @@ public class Core extends AbstractService implements SoneProvider, PostProvider,
        }
 
        /**
-        * Returns whether the target Sone is trusted by the origin Sone.
-        *
-        * @param origin
-        *              The origin Sone
-        * @param target
-        *              The target Sone
-        * @return {@code true} if the target Sone is trusted by the origin Sone
-        */
-       public boolean isSoneTrusted(Sone origin, Sone target) {
-               checkNotNull(origin, "origin must not be null");
-               checkNotNull(target, "target must not be null");
-               checkArgument(origin.getIdentity() instanceof OwnIdentity, "origin’s identity must be an OwnIdentity");
-               return trustedIdentities.containsEntry(origin.getIdentity(), target.getIdentity());
-       }
-
-       /** {@inheritDoc} */
-       @Override
-       public Optional<Post> getPost(String postId) {
-               return database.getPost(postId);
-       }
-
-       /** {@inheritDocs} */
-       @Override
-       public Collection<Post> getPosts(String soneId) {
-               return database.getPosts(soneId);
-       }
-
-       /** {@inheritDoc} */
-       @Override
-       public Collection<Post> getDirectedPosts(final String recipientId) {
-               checkNotNull(recipientId, "recipient must not be null");
-               return database.getDirectedPosts(recipientId);
-       }
-
-       /**
-        * Returns a post reply builder.
-        *
-        * @return A new post reply builder
-        */
-       public PostReplyBuilder postReplyBuilder() {
-               return database.newPostReplyBuilder();
-       }
-
-       /** {@inheritDoc} */
-       @Override
-       public Optional<PostReply> getPostReply(String replyId) {
-               return database.getPostReply(replyId);
-       }
-
-       /** {@inheritDoc} */
-       @Override
-       public List<PostReply> getReplies(final String postId) {
-               return database.getReplies(postId);
-       }
-
-       /**
         * Returns all Sones that have liked the given post.
         *
         * @param post
@@ -556,7 +476,7 @@ public class Core extends AbstractService implements SoneProvider, PostProvider,
                Set<Post> posts = new HashSet<Post>();
                synchronized (bookmarkedPosts) {
                        for (String bookmarkedPostId : bookmarkedPosts) {
-                               Optional<Post> post = getPost(bookmarkedPostId);
+                               Optional<Post> post = database.getPost(bookmarkedPostId);
                                if (post.isPresent()) {
                                        posts.add(post.get());
                                }
@@ -757,7 +677,7 @@ public class Core extends AbstractService implements SoneProvider, PostProvider,
                                }
                                for (PostReply reply : followedSone.get().getReplies()) {
                                        if (reply.getTime() < now) {
-                                               markReplyKnown(reply);
+                                               reply.modify().setKnown().update(Optional.<ReplyUpdated<PostReply>>absent());
                                        }
                                }
                        }
@@ -919,7 +839,7 @@ public class Core extends AbstractService implements SoneProvider, PostProvider,
                                        continue;
                                }
                                if (reply.getTime() < getSoneFollowingTime(sone)) {
-                                       reply.setKnown(true);
+                                       reply.modify().setKnown().update(Optional.<ReplyUpdated<PostReply>>absent());
                                } else if (!reply.isKnown()) {
                                        eventBus.post(new NewPostReplyFoundEvent(reply));
                                }
@@ -1087,8 +1007,8 @@ public class Core extends AbstractService implements SoneProvider, PostProvider,
                                logger.log(Level.WARNING, "Invalid reply found, aborting load!");
                                return;
                        }
-                       PostReplyBuilder postReplyBuilder = postReplyBuilder().withId(replyId).from(sone.getId()).to(postId).withTime(replyTime).withText(replyText);
-                       replies.add(postReplyBuilder.build());
+                       PostReplyBuilder postReplyBuilder = sone.newPostReplyBuilder(postId).withId(replyId).withTime(replyTime).withText(replyText);
+                       replies.add(postReplyBuilder.build(Optional.<PostReplyCreated>absent()));
                }
 
                /* load post likes. */
@@ -1170,7 +1090,7 @@ public class Core extends AbstractService implements SoneProvider, PostProvider,
                                logger.log(Level.WARNING, "Invalid album image encountered, aborting load!");
                                return;
                        }
-                       album.newImageBuilder().withId(imageId).created(creationTime).at(key).sized(width, height).build().modify().setTitle(title).setDescription(description).update();
+                       album.newImageBuilder().withId(imageId).created(creationTime).at(key).sized(width, height).build(Optional.<ImageCreated>absent()).modify().setTitle(title).setDescription(description).update();
                }
 
                /* load avatar. */
@@ -1214,7 +1134,7 @@ public class Core extends AbstractService implements SoneProvider, PostProvider,
                }
                database.storePostReplies(sone, replies);
                for (PostReply reply : replies) {
-                       reply.setKnown(true);
+                       reply.modify().setKnown().update(Optional.<ReplyUpdated<PostReply>>absent());
                }
 
                logger.info(String.format("Sone loaded successfully: %s", sone));
@@ -1248,22 +1168,12 @@ public class Core extends AbstractService implements SoneProvider, PostProvider,
                post.setKnown(true);
                eventBus.post(new MarkPostKnownEvent(post));
                touchConfiguration();
-               for (PostReply reply : getReplies(post.getId())) {
-                       markReplyKnown(reply);
+               for (PostReply reply : post.getReplies()) {
+                       reply.modify().setKnown().update(postReplyUpdated());
                }
        }
 
        /**
-        * Bookmarks the given post.
-        *
-        * @param post
-        *              The post to bookmark
-        */
-       public void bookmark(Post post) {
-               bookmarkPost(post.getId());
-       }
-
-       /**
         * Bookmarks the post with the given ID.
         *
         * @param id
@@ -1298,44 +1208,6 @@ public class Core extends AbstractService implements SoneProvider, PostProvider,
        }
 
        /**
-        * Creates a new reply.
-        *
-        * @param sone
-        *              The Sone that creates the reply
-        * @param post
-        *              The post that this reply refers to
-        * @param text
-        *              The text of the reply
-        * @return The created reply
-        */
-       public PostReply createReply(Sone sone, Post post, String text) {
-               checkNotNull(text, "text must not be null");
-               checkArgument(text.trim().length() > 0, "text must not be empty");
-               if (!sone.isLocal()) {
-                       logger.log(Level.FINE, String.format("Tried to create reply for non-local Sone: %s", sone));
-                       return null;
-               }
-               PostReplyBuilder postReplyBuilder = postReplyBuilder();
-               postReplyBuilder.from(sone.getId()).to(post.getId()).withText(text.trim());
-               final PostReply reply = postReplyBuilder.build();
-               database.storePostReply(reply);
-               eventBus.post(new NewPostReplyFoundEvent(reply));
-               sone.addReply(reply);
-               touchConfiguration();
-               localElementTicker.schedule(new Runnable() {
-
-                       /**
-                        * {@inheritDoc}
-                        */
-                       @Override
-                       public void run() {
-                               markReplyKnown(reply);
-                       }
-               }, 10, TimeUnit.SECONDS);
-               return reply;
-       }
-
-       /**
         * Deletes the given reply.
         *
         * @param reply
@@ -1347,29 +1219,12 @@ public class Core extends AbstractService implements SoneProvider, PostProvider,
                        logger.log(Level.FINE, String.format("Tried to delete non-local reply: %s", reply));
                        return;
                }
+               postReplyUpdated().get().replyUpdated(reply);
                database.removePostReply(reply);
-               markReplyKnown(reply);
-               sone.removeReply(reply);
                touchConfiguration();
        }
 
        /**
-        * Marks the given reply as known, if it is currently not a known reply
-        * (according to {@link Reply#isKnown()}).
-        *
-        * @param reply
-        *              The reply to mark as known
-        */
-       public void markReplyKnown(PostReply reply) {
-               boolean previouslyKnown = reply.isKnown();
-               reply.setKnown(true);
-               eventBus.post(new MarkPostReplyKnownEvent(reply));
-               if (!previouslyKnown) {
-                       touchConfiguration();
-               }
-       }
-
-       /**
         * Creates a new image.
         *
         * @param sone
@@ -1386,7 +1241,7 @@ public class Core extends AbstractService implements SoneProvider, PostProvider,
                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();
+               Image image = album.newImageBuilder().withId(temporaryImage.getId()).sized(temporaryImage.getWidth(), temporaryImage.getHeight()).build(imageCreated());
                imageInserter.insertImage(temporaryImage, image);
                return image;
        }
@@ -1397,7 +1252,7 @@ public class Core extends AbstractService implements SoneProvider, PostProvider,
         *
         * @param image
         *              The image to delete
-        * @see #deleteTemporaryImage(TemporaryImage)
+        * @see #deleteTemporaryImage(String)
         */
        public void deleteImage(Image image) {
                checkNotNull(image, "image must not be null");
@@ -1425,17 +1280,6 @@ public class Core extends AbstractService implements SoneProvider, PostProvider,
        }
 
        /**
-        * Deletes the given temporary image.
-        *
-        * @param temporaryImage
-        *              The temporary image to delete
-        */
-       public void deleteTemporaryImage(TemporaryImage temporaryImage) {
-               checkNotNull(temporaryImage, "temporaryImage must not be null");
-               deleteTemporaryImage(temporaryImage.getId());
-       }
-
-       /**
         * Deletes the temporary image with the given ID.
         *
         * @param imageId
@@ -1464,7 +1308,6 @@ public class Core extends AbstractService implements SoneProvider, PostProvider,
        // SERVICE METHODS
        //
 
-       /** Starts the core. */
        @Override
        public void serviceStart() {
                loadConfiguration();
@@ -1475,7 +1318,6 @@ public class Core extends AbstractService implements SoneProvider, PostProvider,
                database.start();
        }
 
-       /** {@inheritDoc} */
        @Override
        public void serviceRun() {
                long lastSaved = System.currentTimeMillis();
@@ -1492,7 +1334,6 @@ public class Core extends AbstractService implements SoneProvider, PostProvider,
                }
        }
 
-       /** Stops the core. */
        @Override
        public void serviceStop() {
                localElementTicker.shutdownNow();
@@ -1950,8 +1791,8 @@ public class Core extends AbstractService implements SoneProvider, PostProvider,
                touchConfiguration();
        }
 
-       public PostCreated postCreated() {
-               return new PostCreated() {
+       public Optional<PostCreated> postCreated() {
+               return Optional.<PostCreated>of(new PostCreated() {
                        @Override
                        public void postCreated(final Post post) {
                                if (post.isKnown()) {
@@ -1967,7 +1808,49 @@ public class Core extends AbstractService implements SoneProvider, PostProvider,
                                        }, 10, TimeUnit.SECONDS);
                                }
                        }
-               };
+               });
+       }
+
+       public Optional<PostReplyCreated> postReplyCreated() {
+               return Optional.<PostReplyCreated>of(new PostReplyCreated() {
+                       @Override
+                       public void postReplyCreated(final PostReply postReply) {
+                               if (postReply.isKnown()) {
+                                       return;
+                               }
+                               eventBus.post(new NewPostReplyFoundEvent(postReply));
+                               if (postReply.getSone().isLocal()) {
+                                       localElementTicker.schedule(new Runnable() {
+
+                                               /**
+                                                * {@inheritDoc}
+                                                */
+                                               @Override
+                                               public void run() {
+                                                       postReplyUpdated().get().replyUpdated(postReply);
+                                               }
+                                       }, 10, TimeUnit.SECONDS);
+                               }
+                       }
+               });
+       }
+
+       public Optional<ReplyUpdated<PostReply>> postReplyUpdated() {
+               return Optional.<ReplyUpdated<PostReply>>of(new ReplyUpdated<PostReply>() {
+                       @Override
+                       public void replyUpdated(PostReply reply) {
+                               eventBus.post(new MarkPostReplyKnownEvent(reply));
+                       }
+               });
+       }
+
+       public Optional<ImageCreated> imageCreated() {
+               return Optional.<ImageCreated>of(new ImageCreated() {
+                       @Override
+                       public void imageCreated(Image image) {
+                               /* nothing happens here yet. */
+                       }
+               });
        }
 
 }