Use Sone builder to set the posts of a Sone.
[Sone.git] / src / main / java / net / pterodactylus / sone / data / impl / SoneImpl.java
index 2fdd40c..2479276 100644 (file)
@@ -25,6 +25,7 @@ import java.net.MalformedURLException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.concurrent.CopyOnWriteArraySet;
@@ -33,6 +34,7 @@ import java.util.logging.Logger;
 
 import net.pterodactylus.sone.data.Album;
 import net.pterodactylus.sone.data.Client;
+import net.pterodactylus.sone.data.LocalSone;
 import net.pterodactylus.sone.data.Post;
 import net.pterodactylus.sone.data.PostReply;
 import net.pterodactylus.sone.data.Profile;
@@ -46,6 +48,7 @@ import net.pterodactylus.sone.freenet.wot.OwnIdentity;
 
 import freenet.keys.FreenetURI;
 
+import com.google.common.collect.FluentIterable;
 import com.google.common.hash.Hasher;
 import com.google.common.hash.Hashing;
 
@@ -56,7 +59,7 @@ import com.google.common.hash.Hashing;
  *
  * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
  */
-public class SoneImpl implements Sone {
+public class SoneImpl implements LocalSone {
 
        /** The logger. */
        private static final Logger logger = getLogger("Sone.Data");
@@ -77,7 +80,7 @@ public class SoneImpl implements Sone {
        private volatile long latestEdition;
 
        /** The time of the last inserted update. */
-       private volatile long time;
+       private final long time;
 
        /** The status of this Sone. */
        private volatile SoneStatus status = SoneStatus.unknown;
@@ -86,13 +89,13 @@ public class SoneImpl implements Sone {
        private volatile Profile profile = new Profile(this);
 
        /** The client used by the Sone. */
-       private volatile Client client;
+       private final Client client;
 
        /** Whether this Sone is known. */
        private volatile boolean known;
 
        /** All posts. */
-       private final Set<Post> posts = new CopyOnWriteArraySet<Post>();
+       private final Collection<Post> posts = new HashSet<Post>();
 
        /** All replies. */
        private final Set<PostReply> replies = new CopyOnWriteArraySet<PostReply>();
@@ -118,11 +121,14 @@ public class SoneImpl implements Sone {
         * @param local
         *              {@code true} if the Sone is a local Sone, {@code false} otherwise
         */
-       public SoneImpl(Database database, Identity identity, boolean local) {
+       public SoneImpl(Database database, Identity identity, boolean local, long time, Client client, Collection<Post> posts) {
                this.database = database;
                this.id = identity.getId();
                this.identity = identity;
                this.local = local;
+               this.time = time;
+               this.client = client;
+               this.posts.addAll(posts);
        }
 
        //
@@ -238,18 +244,6 @@ public class SoneImpl implements Sone {
        }
 
        /**
-        * Sets the time of the last inserted update of this Sone.
-        *
-        * @param time
-        *              The time of the update (in milliseconds since Jan 1, 1970 UTC)
-        * @return This Sone (for method chaining)
-        */
-       public Sone setTime(long time) {
-               this.time = time;
-               return this;
-       }
-
-       /**
         * Returns the status of this Sone.
         *
         * @return The status of this Sone
@@ -312,7 +306,6 @@ public class SoneImpl implements Sone {
         * @return This Sone (for method chaining)
         */
        public Sone setClient(Client client) {
-               this.client = client;
                return this;
        }
 
@@ -364,12 +357,9 @@ public class SoneImpl implements Sone {
         * @return All posts of this Sone
         */
        public List<Post> getPosts() {
-               List<Post> sortedPosts;
                synchronized (this) {
-                       sortedPosts = new ArrayList<Post>(posts);
+                       return FluentIterable.from(posts).toSortedList(Post.TIME_COMPARATOR);
                }
-               Collections.sort(sortedPosts, Post.TIME_COMPARATOR);
-               return sortedPosts;
        }
 
        /**
@@ -380,10 +370,6 @@ public class SoneImpl implements Sone {
         * @return This Sone (for method chaining)
         */
        public Sone setPosts(Collection<Post> posts) {
-               synchronized (this) {
-                       this.posts.clear();
-                       this.posts.addAll(posts);
-               }
                return this;
        }