Use unique IDs for images
[Sone.git] / src / main / java / net / pterodactylus / sone / data / impl / SoneImpl.java
index 154bfc8..97fe8eb 100644 (file)
@@ -30,9 +30,11 @@ import java.util.Set;
 import java.util.concurrent.CopyOnWriteArraySet;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import javax.annotation.Nullable;
 
 import net.pterodactylus.sone.data.Album;
 import net.pterodactylus.sone.data.Client;
+import net.pterodactylus.sone.data.Image;
 import net.pterodactylus.sone.data.Post;
 import net.pterodactylus.sone.data.PostReply;
 import net.pterodactylus.sone.data.Profile;
@@ -40,9 +42,13 @@ import net.pterodactylus.sone.data.Reply;
 import net.pterodactylus.sone.data.Sone;
 import net.pterodactylus.sone.data.SoneOptions;
 import net.pterodactylus.sone.data.SoneOptions.DefaultSoneOptions;
+import net.pterodactylus.sone.database.Database;
 import net.pterodactylus.sone.freenet.wot.Identity;
 import net.pterodactylus.sone.freenet.wot.OwnIdentity;
 
+import com.google.common.base.Optional;
+import com.google.common.base.Predicate;
+import com.google.common.collect.FluentIterable;
 import freenet.keys.FreenetURI;
 
 import com.google.common.hash.Hasher;
@@ -58,7 +64,10 @@ import com.google.common.hash.Hashing;
 public class SoneImpl implements Sone {
 
        /** The logger. */
-       private static final Logger logger = getLogger("Sone.Data");
+       private static final Logger logger = getLogger(SoneImpl.class.getName());
+
+       /** The database. */
+       private final Database database;
 
        /** The ID of this Sone. */
        private final String id;
@@ -87,9 +96,6 @@ public class SoneImpl implements Sone {
        /** Whether this Sone is known. */
        private volatile boolean known;
 
-       /** All friend Sones. */
-       private final Set<String> friendSones = new CopyOnWriteArraySet<String>();
-
        /** All posts. */
        private final Set<Post> posts = new CopyOnWriteArraySet<Post>();
 
@@ -111,12 +117,14 @@ public class SoneImpl implements Sone {
        /**
         * Creates a new Sone.
         *
+        * @param database The database
         * @param identity
         *              The identity of the Sone
         * @param local
         *              {@code true} if the Sone is a local Sone, {@code false} otherwise
         */
-       public SoneImpl(Identity identity, boolean local) {
+       public SoneImpl(Database database, Identity identity, boolean local) {
+               this.database = database;
                this.id = identity.getId();
                this.identity = identity;
                this.local = local;
@@ -340,7 +348,7 @@ public class SoneImpl implements Sone {
         * @return The friend Sones of this Sone
         */
        public Collection<String> getFriends() {
-               return new ArrayList<String>(friendSones);
+               return database.getFriends(this);
        }
 
        /**
@@ -352,33 +360,7 @@ public class SoneImpl implements Sone {
         *         false} otherwise
         */
        public boolean hasFriend(String friendSoneId) {
-               return friendSones.contains(friendSoneId);
-       }
-
-       /**
-        * Adds the given Sone as a friend Sone.
-        *
-        * @param friendSone
-        *              The friend Sone to add
-        * @return This Sone (for method chaining)
-        */
-       public Sone addFriend(String friendSone) {
-               if (!friendSone.equals(id)) {
-                       friendSones.add(friendSone);
-               }
-               return this;
-       }
-
-       /**
-        * Removes the given Sone as a friend Sone.
-        *
-        * @param friendSoneId
-        *              The ID of the friend Sone to remove
-        * @return This Sone (for method chaining)
-        */
-       public Sone removeFriend(String friendSoneId) {
-               friendSones.remove(friendSoneId);
-               return this;
+               return database.isFriend(this, friendSoneId);
        }
 
        /**
@@ -607,6 +589,16 @@ public class SoneImpl implements Sone {
                return rootAlbum;
        }
 
+       @Override
+       public Optional<Image> getImageByInternalId(final String internalId) {
+               return FluentIterable.from(toAllImages.apply(this)).filter(new Predicate<Image>() {
+                       @Override
+                       public boolean apply(@Nullable Image input) {
+                               return (input != null) && input.getInternalId().equals(internalId);
+                       }
+               }).first();
+       }
+
        /**
         * Returns Sone-specific options.
         *
@@ -711,7 +703,7 @@ public class SoneImpl implements Sone {
        /** {@inheritDoc} */
        @Override
        public String toString() {
-               return getClass().getName() + "[identity=" + identity + ",friends(" + friendSones.size() + "),posts(" + posts.size() + "),replies(" + replies.size() + "),albums(" + getRootAlbum().getAlbums().size() + ")]";
+               return getClass().getName() + "[identity=" + identity + ",posts(" + posts.size() + "),replies(" + replies.size() + "),albums(" + getRootAlbum().getAlbums().size() + ")]";
        }
 
 }