Remove updated time setter from Sone, store update time in database.
[Sone.git] / src / main / java / net / pterodactylus / sone / database / memory / MemoryDatabase.java
index 12ef439..d5d5396 100644 (file)
@@ -132,6 +132,7 @@ public class MemoryDatabase extends AbstractService implements Database {
        private final Map<String, Image> allImages = new HashMap<String, Image>();
        private final Multimap<String, Image> soneImages = HashMultimap.create();
 
+       private final MemorySoneDatabase soneDatabase;
        private final MemoryPostDatabase postDatabase;
        private final MemoryBookmarkDatabase memoryBookmarkDatabase;
        private final MemoryFriendDatabase memoryFriendDatabase;
@@ -149,6 +150,7 @@ public class MemoryDatabase extends AbstractService implements Database {
                this.soneProvider = soneProvider;
                this.configuration = configuration;
                this.configurationLoader = new ConfigurationLoader(configuration);
+               soneDatabase = new MemorySoneDatabase(configurationLoader);
                postDatabase = new MemoryPostDatabase(this, configurationLoader);
                memoryBookmarkDatabase =
                                new MemoryBookmarkDatabase(this, configurationLoader);
@@ -173,14 +175,14 @@ public class MemoryDatabase extends AbstractService implements Database {
        }
 
        @Override
-       public Sone registerLocalSone(OwnIdentity ownIdentity) {
-               final Sone localSone = loadLocalSone(ownIdentity);
+       public LocalSone registerLocalSone(OwnIdentity ownIdentity) {
+               final LocalSone localSone = loadLocalSone(ownIdentity);
                localSones.add(ownIdentity.getId());
                return localSone;
        }
 
-       private Sone loadLocalSone(OwnIdentity ownIdentity) {
-               Sone localSone = newSoneBuilder().local().from(ownIdentity).build();
+       private LocalSone loadLocalSone(OwnIdentity ownIdentity) {
+               LocalSone localSone = (LocalSone) newSoneBuilder().local().from(ownIdentity).build();
                localSone.setLatestEdition(
                                Optional.fromNullable(
                                                Longs.tryParse(ownIdentity.getProperty(LATEST_EDITION_PROPERTY)))
@@ -192,7 +194,7 @@ public class MemoryDatabase extends AbstractService implements Database {
                return localSone;
        }
 
-       public void loadSone(Sone sone) {
+       public void loadSone(LocalSone sone) {
                long soneTime = configurationLoader.getLocalSoneTime(sone.getId());
                if (soneTime == -1) {
                        return;
@@ -273,7 +275,7 @@ public class MemoryDatabase extends AbstractService implements Database {
                /* if we’re still here, Sone was loaded successfully. */
                lock.writeLock().lock();
                try {
-                       sone.setTime(soneTime);
+                       updateSoneTime(sone, soneTime);
                        sone.setProfile(profile);
                        sone.setLikePostIds(likedPostIds);
                        sone.setLikeReplyIds(likedReplyIds);
@@ -461,6 +463,8 @@ public class MemoryDatabase extends AbstractService implements Database {
        /** {@inheritDocs} */
        @Override
        protected void doStart() {
+               soneDatabase.start();
+               memoryFriendDatabase.start();
                postDatabase.start();
                memoryBookmarkDatabase.start();
                loadKnownPostReplies();
@@ -471,6 +475,8 @@ public class MemoryDatabase extends AbstractService implements Database {
        @Override
        protected void doStop() {
                try {
+                       soneDatabase.stop();
+                       memoryFriendDatabase.stop();
                        postDatabase.stop();
                        memoryBookmarkDatabase.stop();
                        save();
@@ -501,6 +507,21 @@ public class MemoryDatabase extends AbstractService implements Database {
                }
        }
 
+       @Override
+       public boolean isSoneKnown(Sone sone) {
+               return soneDatabase.isKnownSone(sone.getId());
+       }
+
+       @Override
+       public void setSoneKnown(Sone sone) {
+               soneDatabase.setSoneKnown(sone.getId());
+       }
+
+       @Override
+       public void updateSoneTime(Sone sone, long soneTime) {
+               soneDatabase.updateSoneTime(sone.getId(), soneTime);
+       }
+
        private void storePosts(String soneId, Collection<Post> posts) {
                postDatabase.storePosts(soneId, posts);
        }
@@ -583,10 +604,16 @@ public class MemoryDatabase extends AbstractService implements Database {
        }
 
        @Override
-       public Collection<Sone> getLocalSones() {
+       public Collection<LocalSone> getLocalSones() {
                lock.readLock().lock();
                try {
-                       return from(allSones.values()).filter(LOCAL_SONE_FILTER).toSet();
+                       return from(allSones.values()).filter(LOCAL_SONE_FILTER).transform(new Function<Sone, LocalSone>() {
+                               @Override
+                               public LocalSone apply(Sone sone) {
+                                       // FIXME – Sones will not always implement LocalSone
+                                       return (LocalSone) sone;
+                               }
+                       }).toSet();
                } finally {
                        lock.readLock().unlock();
                }
@@ -604,7 +631,7 @@ public class MemoryDatabase extends AbstractService implements Database {
        }
 
        @Override
-       public Collection<String> getFriends(Sone localSone) {
+       public Collection<String> getFriends(LocalSone localSone) {
                if (!localSone.isLocal()) {
                        return Collections.emptySet();
                }
@@ -612,7 +639,12 @@ public class MemoryDatabase extends AbstractService implements Database {
        }
 
        @Override
-       public boolean isFriend(Sone localSone, String friendSoneId) {
+       public Optional<Long> getSoneFollowingTime(String remoteSoneId) {
+               return memoryFriendDatabase.getSoneFollowingTime(remoteSoneId);
+       }
+
+       @Override
+       public boolean isFriend(LocalSone localSone, String friendSoneId) {
                if (!localSone.isLocal()) {
                        return false;
                }
@@ -620,18 +652,12 @@ public class MemoryDatabase extends AbstractService implements Database {
        }
 
        @Override
-       public void addFriend(Sone localSone, String friendSoneId) {
-               if (!localSone.isLocal()) {
-                       return;
-               }
+       public void addFriend(LocalSone localSone, String friendSoneId) {
                memoryFriendDatabase.addFriend(localSone.getId(), friendSoneId);
        }
 
        @Override
-       public void removeFriend(Sone localSone, String friendSoneId) {
-               if (!localSone.isLocal()) {
-                       return;
-               }
+       public void removeFriend(LocalSone localSone, String friendSoneId) {
                memoryFriendDatabase.removeFriend(localSone.getId(), friendSoneId);
        }