Move friend-related functionality into the database.
[Sone.git] / src / main / java / net / pterodactylus / sone / core / Core.java
index 97182c2..17905f3 100644 (file)
@@ -96,6 +96,7 @@ import net.pterodactylus.util.service.AbstractService;
 import net.pterodactylus.util.thread.NamedThreadFactory;
 
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Function;
 import com.google.common.base.Optional;
 import com.google.common.collect.FluentIterable;
 import com.google.common.collect.HashMultimap;
@@ -318,6 +319,11 @@ public class Core extends AbstractService implements SoneProvider, PostProvider,
                return database.getSones();
        }
 
+       @Override
+       public Function<String, Optional<Sone>> soneLoader() {
+               return database.soneLoader();
+       }
+
        /**
         * Returns the Sone with the given ID, regardless whether it’s local or
         * remote.
@@ -720,7 +726,7 @@ public class Core extends AbstractService implements SoneProvider, PostProvider,
        public void followSone(Sone sone, String soneId) {
                checkNotNull(sone, "sone must not be null");
                checkNotNull(soneId, "soneId must not be null");
-               sone.addFriend(soneId);
+               database.addFriend(sone, soneId);
                synchronized (soneFollowingTimes) {
                        if (!soneFollowingTimes.containsKey(soneId)) {
                                long now = System.currentTimeMillis();
@@ -755,7 +761,7 @@ public class Core extends AbstractService implements SoneProvider, PostProvider,
        public void unfollowSone(Sone sone, String soneId) {
                checkNotNull(sone, "sone must not be null");
                checkNotNull(soneId, "soneId must not be null");
-               sone.removeFriend(soneId);
+               database.removeFriend(sone, soneId);
                boolean unfollowedSoneStillFollowed = false;
                for (Sone localSone : getLocalSones()) {
                        unfollowedSoneStillFollowed |= localSone.hasFriend(soneId);
@@ -865,41 +871,8 @@ public class Core extends AbstractService implements SoneProvider, PostProvider,
                                logger.log(Level.FINE, String.format("Downloaded Sone %s is not newer than stored Sone %s.", sone, storedSone));
                                return;
                        }
-                       final List<Object> events = new ArrayList<Object>();
-                       SoneChangeDetector soneChangeDetector = new SoneChangeDetector(storedSone.get());
-                       soneChangeDetector.onNewPosts(new PostProcessor() {
-                               @Override
-                               public void processPost(Post post) {
-                                       if (post.getTime() < getSoneFollowingTime(sone)) {
-                                               post.setKnown(true);
-                                       } else if (!post.isKnown()) {
-                                               events.add(new NewPostFoundEvent(post));
-                                       }
-                               }
-                       });
-                       soneChangeDetector.onRemovedPosts(new PostProcessor() {
-                               @Override
-                               public void processPost(Post post) {
-                                       events.add(new PostRemovedEvent(post));
-                               }
-                       });
-                       soneChangeDetector.onNewPostReplies(new PostReplyProcessor() {
-                               @Override
-                               public void processPostReply(PostReply postReply) {
-                                       if (postReply.getTime() < getSoneFollowingTime(sone)) {
-                                               postReply.setKnown(true);
-                                       } else if (!postReply.isKnown()) {
-                                               events.add(new NewPostReplyFoundEvent(postReply));
-                                       }
-                               }
-                       });
-                       soneChangeDetector.onRemovedPostReplies(new PostReplyProcessor() {
-                               @Override
-                               public void processPostReply(PostReply postReply) {
-                                       events.add(new PostReplyRemovedEvent(postReply));
-                               }
-                       });
-                       soneChangeDetector.detectChanges(sone);
+                       List<Object> events =
+                                       collectEventsForChangesInSone(storedSone.get(), sone);
                        database.storeSone(sone);
                        for (Object event : events) {
                                eventBus.post(event);
@@ -913,6 +886,47 @@ public class Core extends AbstractService implements SoneProvider, PostProvider,
                }
        }
 
+       private List<Object> collectEventsForChangesInSone(Sone oldSone,
+                       final Sone newSone) {
+               final List<Object> events = new ArrayList<Object>();
+               SoneChangeDetector soneChangeDetector = new SoneChangeDetector(
+                               oldSone);
+               soneChangeDetector.onNewPosts(new PostProcessor() {
+                       @Override
+                       public void processPost(Post post) {
+                               if (post.getTime() < getSoneFollowingTime(newSone)) {
+                                       post.setKnown(true);
+                               } else if (!post.isKnown()) {
+                                       events.add(new NewPostFoundEvent(post));
+                               }
+                       }
+               });
+               soneChangeDetector.onRemovedPosts(new PostProcessor() {
+                       @Override
+                       public void processPost(Post post) {
+                               events.add(new PostRemovedEvent(post));
+                       }
+               });
+               soneChangeDetector.onNewPostReplies(new PostReplyProcessor() {
+                       @Override
+                       public void processPostReply(PostReply postReply) {
+                               if (postReply.getTime() < getSoneFollowingTime(newSone)) {
+                                       postReply.setKnown(true);
+                               } else if (!postReply.isKnown()) {
+                                       events.add(new NewPostReplyFoundEvent(postReply));
+                               }
+                       }
+               });
+               soneChangeDetector.onRemovedPostReplies(new PostReplyProcessor() {
+                       @Override
+                       public void processPostReply(PostReply postReply) {
+                               events.add(new PostReplyRemovedEvent(postReply));
+                       }
+               });
+               soneChangeDetector.detectChanges(newSone);
+               return events;
+       }
+
        /**
         * Deletes the given Sone. This will remove the Sone from the
         * {@link #getLocalSones() local Sones}, stop its {@link SoneInserter} and
@@ -1013,9 +1027,6 @@ public class Core extends AbstractService implements SoneProvider, PostProvider,
                Set<String> likedReplyIds =
                                configurationSoneParser.parseLikedPostReplyIds();
 
-               /* load friends. */
-               Set<String> friends = configurationSoneParser.parseFriends();
-
                /* load albums. */
                List<Album> topLevelAlbums;
                try {
@@ -1067,9 +1078,6 @@ public class Core extends AbstractService implements SoneProvider, PostProvider,
                        sone.setReplies(replies);
                        sone.setLikePostIds(likedPostIds);
                        sone.setLikeReplyIds(likedReplyIds);
-                       for (String friendId : friends) {
-                               followSone(sone, friendId);
-                       }
                        for (Album album : sone.getRootAlbum().getAlbums()) {
                                sone.getRootAlbum().removeAlbum(album);
                        }
@@ -1081,11 +1089,6 @@ public class Core extends AbstractService implements SoneProvider, PostProvider,
                                soneInserters.get(sone).setLastInsertFingerprint(lastInsertFingerprint);
                        }
                }
-               synchronized (knownSones) {
-                       for (String friend : friends) {
-                               knownSones.add(friend);
-                       }
-               }
                for (Post post : posts) {
                        post.setKnown(true);
                }
@@ -1499,13 +1502,6 @@ public class Core extends AbstractService implements SoneProvider, PostProvider,
                        }
                        configuration.getStringValue(sonePrefix + "/Likes/Reply/" + replyLikeCounter + "/ID").setValue(null);
 
-                       /* save friends. */
-                       int friendCounter = 0;
-                       for (String friendId : sone.getFriends()) {
-                               configuration.getStringValue(sonePrefix + "/Friends/" + friendCounter++ + "/ID").setValue(friendId);
-                       }
-                       configuration.getStringValue(sonePrefix + "/Friends/" + friendCounter + "/ID").setValue(null);
-
                        /* save albums. first, collect in a flat structure, top-level first. */
                        List<Album> albums = FluentIterable.from(sone.getRootAlbum().getAlbums()).transformAndConcat(Album.FLATTENER).toList();