X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;ds=inline;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fdata%2FSone.java;h=5fd601b45a61993f3f75c0942e19dce3507acfef;hb=0f99e3610b9be8ce2c662e4755ee7f286ae23028;hp=62741e785c5a569a6ec1809e06901c843946805a;hpb=13540271116aaa7b350d283ce8a8b97fce7e8123;p=Sone.git diff --git a/src/main/java/net/pterodactylus/sone/data/Sone.java b/src/main/java/net/pterodactylus/sone/data/Sone.java index 62741e7..5fd601b 100644 --- a/src/main/java/net/pterodactylus/sone/data/Sone.java +++ b/src/main/java/net/pterodactylus/sone/data/Sone.java @@ -17,16 +17,22 @@ package net.pterodactylus.sone.data; +import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.HashSet; +import java.util.List; import java.util.Set; import java.util.UUID; +import java.util.logging.Level; +import java.util.logging.Logger; +import net.pterodactylus.util.logging.Logging; import freenet.keys.FreenetURI; /** - * A Sone defines everything about a user: the {@link User} itself, her profile, - * her status updates. + * A Sone defines everything about a user: her profile, her status updates, her + * replies, her likes and dislikes, etc. *

* Operations that modify the Sone need to synchronize on the Sone in question. * @@ -34,6 +40,9 @@ import freenet.keys.FreenetURI; */ public class Sone { + /** The logger. */ + private static final Logger logger = Logging.getLogger(Sone.class); + /** A GUID for this Sone. */ private final UUID id; @@ -41,11 +50,11 @@ public class Sone { private final String name; /** The URI under which the Sone is stored in Freenet. */ - private final FreenetURI requestUri; + private FreenetURI requestUri; /** The URI used to insert a new version of this Sone. */ /* This will be null for remote Sones! */ - private final FreenetURI insertUri; + private FreenetURI insertUri; /** The profile of this Sone. */ private Profile profile; @@ -53,6 +62,12 @@ public class Sone { /** All friend Sones. */ private final Set friendSones = new HashSet(); + /** All posts. */ + private final List posts = new ArrayList(); + + /** All replies. */ + private final Set replies = new HashSet(); + /** Modification count. */ private volatile long modificationCounter = 0; @@ -141,13 +156,15 @@ public class Sone { } /** - * Sets the profile of this Sone. + * Sets the profile of this Sone. A copy of the given profile is stored so + * that subsequent modifications of the given profile are not reflected in + * this Sone! * * @param profile * The profile to set */ public synchronized void setProfile(Profile profile) { - this.profile = profile; + this.profile = new Profile(profile); modificationCounter++; } @@ -201,6 +218,84 @@ public class Sone { } /** + * Returns the list of posts of this Sone, sorted by time, newest first. + * + * @return All posts of this Sone + */ + public List getPosts() { + List sortedPosts = new ArrayList(posts); + Collections.sort(sortedPosts, new Comparator() { + + @Override + public int compare(Post leftPost, Post rightPost) { + return (int) Math.max(Integer.MIN_VALUE, Math.min(Integer.MAX_VALUE, rightPost.getTime() - leftPost.getTime())); + } + + }); + return sortedPosts; + } + + /** + * Adds the given post to this Sone. The post will not be added if its + * {@link Post#getSone() Sone} is not this Sone. + * + * @param post + * The post to add + */ + public synchronized void addPost(Post post) { + if (post.getSone().equals(this) && posts.add(post)) { + logger.log(Level.FINEST, "Adding %s to “%s”.", new Object[] { post, getName() }); + modificationCounter++; + } + } + + /** + * Removes the given post from this Sone. + * + * @param post + * The post to remove + */ + public synchronized void removePost(Post post) { + if (post.getSone().equals(this) && posts.remove(post)) { + modificationCounter++; + } + } + + /** + * Returns all replies this Sone made. + * + * @return All replies this Sone made + */ + public Set getReplies() { + return Collections.unmodifiableSet(replies); + } + + /** + * Adds a reply to this Sone. If the given reply was not made by this Sone, + * nothing is added to this Sone. + * + * @param reply + * The reply to add + */ + public synchronized void addReply(Reply reply) { + if (reply.getSone().equals(this) && replies.add(reply)) { + modificationCounter++; + } + } + + /** + * Removes a reply from this Sone. + * + * @param reply + * The reply to remove + */ + public synchronized void removeReply(Reply reply) { + if (reply.getSone().equals(this) && replies.remove(reply)) { + modificationCounter++; + } + } + + /** * Returns the modification counter. * * @return The modification counter @@ -219,6 +314,19 @@ public class Sone { this.modificationCounter = modificationCounter; } + /** + * Updates the suggested edition in both the request URI and the insert URI. + * + * @param requestUri + * The request URI that resulted from an insert + */ + public void updateUris(FreenetURI requestUri) { + /* TODO - check for the correct URI. */ + long latestEdition = requestUri.getSuggestedEdition(); + this.requestUri = this.requestUri.setSuggestedEdition(latestEdition); + this.insertUri = this.insertUri.setSuggestedEdition(latestEdition); + } + // // OBJECT METHODS // @@ -242,4 +350,12 @@ public class Sone { return ((Sone) object).id.equals(id); } + /** + * {@inheritDoc} + */ + @Override + public String toString() { + return getName() + "[id=" + getId() + ",requestUri=" + getRequestUri() + ",insertUri=" + getInsertUri() + ",posts(" + posts.size() + "),replies(" + replies.size() + ")]"; + } + }