X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fdata%2FSone.java;h=a0f87b227d257ade161c5e01ce251da237eb479c;hb=22788933e4a2b4ee39f298ebcefda5b93b0496fb;hp=4195484225b2719e08d32a209f5fe27ff7297a8e;hpb=5295218397ae3b97662bb49b9b9613b1ad3a4199;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 4195484..a0f87b2 100644 --- a/src/main/java/net/pterodactylus/sone/data/Sone.java +++ b/src/main/java/net/pterodactylus/sone/data/Sone.java @@ -79,10 +79,10 @@ public class Sone { private volatile long time; /** The profile of this Sone. */ - private volatile Profile profile; + private volatile Profile profile = new Profile(); /** All friend Sones. */ - private final Set friendSones = Collections.synchronizedSet(new HashSet()); + private final Set friendSones = Collections.synchronizedSet(new HashSet()); /** All posts. */ private final Set posts = Collections.synchronizedSet(new HashSet()); @@ -96,9 +96,6 @@ public class Sone { /** The IDs of all liked replies. */ private final Set likedReplyIds = Collections.synchronizedSet(new HashSet()); - /** Modification count. */ - private volatile long modificationCounter = 0; - /** * Creates a new Sone. * @@ -164,7 +161,7 @@ public class Sone { * @return The request URI of this Sone */ public FreenetURI getRequestUri() { - return requestUri.setSuggestedEdition(latestEdition); + return (requestUri != null) ? requestUri.setSuggestedEdition(latestEdition) : null; } /** @@ -267,7 +264,7 @@ public class Sone { * * @return A copy of the profile */ - public Profile getProfile() { + public synchronized Profile getProfile() { return new Profile(profile); } @@ -281,7 +278,6 @@ public class Sone { */ public synchronized void setProfile(Profile profile) { this.profile = new Profile(profile); - modificationCounter++; } /** @@ -289,9 +285,8 @@ public class Sone { * * @return The friend Sones of this Sone */ - public List getFriends() { - List friends = new ArrayList(friendSones); - Collections.sort(friends, NICE_NAME_COMPARATOR); + public List getFriends() { + List friends = new ArrayList(friendSones); return friends; } @@ -302,7 +297,7 @@ public class Sone { * The new (and only) friends of this Sone * @return This Sone (for method chaining) */ - public Sone setFriends(Collection friends) { + public Sone setFriends(Collection friends) { friendSones.clear(); friendSones.addAll(friends); return this; @@ -311,13 +306,13 @@ public class Sone { /** * Returns whether this Sone has the given Sone as a friend Sone. * - * @param friendSone - * The friend Sone to check for + * @param friendSoneId + * The ID of the Sone to check for * @return {@code true} if this Sone has the given Sone as a friend, * {@code false} otherwise */ - public boolean hasFriend(Sone friendSone) { - return friendSones.contains(friendSone); + public boolean hasFriend(String friendSoneId) { + return friendSones.contains(friendSoneId); } /** @@ -327,8 +322,8 @@ public class Sone { * The friend Sone to add * @return This Sone (for method chaining) */ - public Sone addFriend(Sone friendSone) { - if (!friendSone.equals(this)) { + public Sone addFriend(String friendSone) { + if (!friendSone.equals(id)) { friendSones.add(friendSone); } return this; @@ -337,12 +332,12 @@ public class Sone { /** * Removes the given Sone as a friend Sone. * - * @param friendSone - * The friend Sone to remove + * @param friendSoneId + * The ID of the friend Sone to remove * @return This Sone (for method chaining) */ - public Sone removeFriend(Sone friendSone) { - friendSones.remove(friendSone); + public Sone removeFriend(String friendSoneId) { + friendSones.remove(friendSoneId); return this; } @@ -370,7 +365,6 @@ public class Sone { public synchronized Sone setPosts(Collection posts) { this.posts.clear(); this.posts.addAll(posts); - modificationCounter++; return this; } @@ -384,7 +378,6 @@ public class Sone { 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++; } } @@ -395,8 +388,8 @@ public class Sone { * The post to remove */ public synchronized void removePost(Post post) { - if (post.getSone().equals(this) && posts.remove(post)) { - modificationCounter++; + if (post.getSone().equals(this)) { + posts.remove(post); } } @@ -419,7 +412,6 @@ public class Sone { public synchronized Sone setReplies(Collection replies) { this.replies.clear(); this.replies.addAll(replies); - modificationCounter++; return this; } @@ -431,8 +423,8 @@ public class Sone { * The reply to add */ public synchronized void addReply(Reply reply) { - if (reply.getSone().equals(this) && replies.add(reply)) { - modificationCounter++; + if (reply.getSone().equals(this)) { + replies.add(reply); } } @@ -443,8 +435,8 @@ public class Sone { * The reply to remove */ public synchronized void removeReply(Reply reply) { - if (reply.getSone().equals(this) && replies.remove(reply)) { - modificationCounter++; + if (reply.getSone().equals(this)) { + replies.remove(reply); } } @@ -467,7 +459,6 @@ public class Sone { public synchronized Sone setLikePostIds(Set likedPostIds) { this.likedPostIds.clear(); this.likedPostIds.addAll(likedPostIds); - modificationCounter++; return this; } @@ -491,9 +482,7 @@ public class Sone { * @return This Sone (for method chaining) */ public synchronized Sone addLikedPostId(String postId) { - if (likedPostIds.add(postId)) { - modificationCounter++; - } + likedPostIds.add(postId); return this; } @@ -505,9 +494,7 @@ public class Sone { * @return This Sone (for method chaining) */ public synchronized Sone removeLikedPostId(String postId) { - if (likedPostIds.remove(postId)) { - modificationCounter++; - } + likedPostIds.remove(postId); return this; } @@ -530,7 +517,6 @@ public class Sone { public synchronized Sone setLikeReplyIds(Set likedReplyIds) { this.likedReplyIds.clear(); this.likedReplyIds.addAll(likedReplyIds); - modificationCounter++; return this; } @@ -554,9 +540,7 @@ public class Sone { * @return This Sone (for method chaining) */ public synchronized Sone addLikedReplyId(String replyId) { - if (likedReplyIds.add(replyId)) { - modificationCounter++; - } + likedReplyIds.add(replyId); return this; } @@ -568,29 +552,72 @@ public class Sone { * @return This Sone (for method chaining) */ public synchronized Sone removeLikedReplyId(String replyId) { - if (likedReplyIds.remove(replyId)) { - modificationCounter++; - } + likedReplyIds.remove(replyId); return this; } /** - * Returns the modification counter. + * Returns a fingerprint of this Sone. The fingerprint only depends on data + * that is actually stored when a Sone is inserted. The fingerprint can be + * used to detect changes in Sone data and can also be used to detect if + * previous changes are reverted. * - * @return The modification counter + * @return The fingerprint of this Sone */ - public synchronized long getModificationCounter() { - return modificationCounter; - } + public synchronized String getFingerprint() { + StringBuilder fingerprint = new StringBuilder(); + fingerprint.append("Profile("); + if (profile.getFirstName() != null) { + fingerprint.append("FirstName(").append(profile.getFirstName()).append(')'); + } + if (profile.getMiddleName() != null) { + fingerprint.append("MiddleName(").append(profile.getMiddleName()).append(')'); + } + if (profile.getLastName() != null) { + fingerprint.append("LastName(").append(profile.getLastName()).append(')'); + } + if (profile.getBirthDay() != null) { + fingerprint.append("BirthDay(").append(profile.getBirthDay()).append(')'); + } + if (profile.getBirthMonth() != null) { + fingerprint.append("BirthMonth(").append(profile.getBirthMonth()).append(')'); + } + if (profile.getBirthYear() != null) { + fingerprint.append("BirthYear(").append(profile.getBirthYear()).append(')'); + } + fingerprint.append(")"); - /** - * Sets the modification counter. - * - * @param modificationCounter - * The new modification counter - */ - public synchronized void setModificationCounter(long modificationCounter) { - this.modificationCounter = modificationCounter; + fingerprint.append("Posts("); + for (Post post : getPosts()) { + fingerprint.append("Post(").append(post.getId()).append(')'); + } + fingerprint.append(")"); + + List replies = new ArrayList(getReplies()); + Collections.sort(replies, Reply.TIME_COMPARATOR); + fingerprint.append("Replies("); + for (Reply reply : replies) { + fingerprint.append("Reply(").append(reply.getId()).append(')'); + } + fingerprint.append(')'); + + List likedPostIds = new ArrayList(getLikedPostIds()); + Collections.sort(likedPostIds); + fingerprint.append("LikedPosts("); + for (String likedPostId : likedPostIds) { + fingerprint.append("Post(").append(likedPostId).append(')'); + } + fingerprint.append(')'); + + List likedReplyIds = new ArrayList(getLikedReplyIds()); + Collections.sort(likedReplyIds); + fingerprint.append("LikedReplies("); + for (String likedReplyId : likedReplyIds) { + fingerprint.append("Reply(").append(likedReplyId).append(')'); + } + fingerprint.append(')'); + + return fingerprint.toString(); } // @@ -621,7 +648,7 @@ public class Sone { */ @Override public String toString() { - return getClass().getName() + "[identity=" + identity + ",requestUri=" + requestUri + ",insertUri=" + insertUri + ",friends(" + friendSones.size() + "),posts(" + posts.size() + "),replies(" + replies.size() + ")]"; + return getClass().getName() + "[identity=" + identity + ",requestUri=" + requestUri + ",insertUri(" + String.valueOf(insertUri).length() + "),friends(" + friendSones.size() + "),posts(" + posts.size() + "),replies(" + replies.size() + ")]"; } }