X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fdata%2FSone.java;h=5c0e4865ef9ff1bac5f6b989b08aac9d6ee41831;hb=9ceea683ab66b047fc4ded3ee6f92b33ceea3968;hp=3e808a80da71513d09a628e35a6ad7a5a3c937c5;hpb=7c85033af8457c99cb87feb930f228de0abf70fe;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 3e808a8..5c0e486 100644 --- a/src/main/java/net/pterodactylus/sone/data/Sone.java +++ b/src/main/java/net/pterodactylus/sone/data/Sone.java @@ -24,10 +24,10 @@ 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.sone.template.SoneAccessor; import net.pterodactylus.util.logging.Logging; import freenet.keys.FreenetURI; @@ -44,36 +44,39 @@ public class Sone { /** The logger. */ private static final Logger logger = Logging.getLogger(Sone.class); - /** A GUID for this Sone. */ - private final UUID id; + /** The ID of this Sone. */ + private final String id; /** The name of this Sone. */ - private String name; + private volatile String name; /** The URI under which the Sone is stored in Freenet. */ - private FreenetURI requestUri; + private volatile FreenetURI requestUri; /** The URI used to insert a new version of this Sone. */ /* This will be null for remote Sones! */ - private FreenetURI insertUri; + private volatile FreenetURI insertUri; /** The time of the last inserted update. */ - private long time; + private volatile long time; /** The profile of this Sone. */ - private Profile profile; + private volatile Profile profile; /** All friend Sones. */ - private final Set friendSones = new HashSet(); + private final Set friendSones = Collections.synchronizedSet(new HashSet()); /** All posts. */ - private final Set posts = new HashSet(); + private final Set posts = Collections.synchronizedSet(new HashSet()); /** All replies. */ - private final Set replies = new HashSet(); + private final Set replies = Collections.synchronizedSet(new HashSet()); - /** The IDs of all blocked Sones. */ - private final Set blockedSoneIds = new HashSet(); + /** The IDs of all liked posts. */ + private final Set likedPostIds = Collections.synchronizedSet(new HashSet()); + + /** The IDs of all liked replies. */ + private final Set likedReplyIds = Collections.synchronizedSet(new HashSet()); /** Modification count. */ private volatile long modificationCounter = 0; @@ -85,7 +88,7 @@ public class Sone { * The ID of this Sone */ public Sone(String id) { - this.id = UUID.fromString(id); + this.id = id; } // @@ -98,7 +101,7 @@ public class Sone { * @return The ID of this Sone */ public String getId() { - return id.toString(); + return id; } /** @@ -139,7 +142,19 @@ public class Sone { * @return This Sone (for method chaining) */ public Sone setRequestUri(FreenetURI requestUri) { - this.requestUri = requestUri; + if (this.requestUri == null) { + this.requestUri = requestUri; + updateEditions(); + return this; + } + if (!this.requestUri.equalsKeypair(requestUri)) { + logger.log(Level.WARNING, "Request URI %s tried to overwrite %s!", new Object[] { requestUri, this.requestUri }); + return this; + } + long latestEdition = requestUri.getEdition(); + if ((latestEdition > this.requestUri.getEdition()) || (latestEdition > this.requestUri.getSuggestedEdition())) { + this.requestUri.setSuggestedEdition(latestEdition); + } return this; } @@ -160,7 +175,19 @@ public class Sone { * @return This Sone (for method chaining) */ public Sone setInsertUri(FreenetURI insertUri) { - this.insertUri = insertUri; + if (this.insertUri == null) { + this.insertUri = insertUri; + updateEditions(); + return this; + } + if (!this.insertUri.equalsKeypair(insertUri)) { + logger.log(Level.WARNING, "Request URI %s tried to overwrite %s!", new Object[] { insertUri, this.insertUri }); + return this; + } + long latestEdition = insertUri.getEdition(); + if ((latestEdition > this.insertUri.getEdition()) || (latestEdition > this.insertUri.getSuggestedEdition())) { + this.insertUri.setSuggestedEdition(latestEdition); + } return this; } @@ -214,8 +241,20 @@ public class Sone { * * @return The friend Sones of this Sone */ - public Set getFriends() { - return Collections.unmodifiableSet(friendSones); + public List getFriends() { + List friends = new ArrayList(friendSones); + Collections.sort(friends, new Comparator() { + + @Override + public int compare(Sone leftSone, Sone rightSone) { + int diff = SoneAccessor.getNiceName(leftSone).compareToIgnoreCase(SoneAccessor.getNiceName(rightSone)); + if (diff != 0) { + return diff; + } + return (int) Math.max(Integer.MIN_VALUE, Math.min(Integer.MAX_VALUE, rightSone.getTime() - leftSone.getTime())); + } + }); + return friends; } /** @@ -225,10 +264,9 @@ public class Sone { * The new (and only) friends of this Sone * @return This Sone (for method chaining) */ - public synchronized Sone setFriends(Collection friends) { + public Sone setFriends(Collection friends) { friendSones.clear(); friendSones.addAll(friends); - modificationCounter++; return this; } @@ -251,9 +289,9 @@ public class Sone { * The friend Sone to add * @return This Sone (for method chaining) */ - public synchronized Sone addFriend(Sone friendSone) { - if (!friendSone.equals(this) && friendSones.add(friendSone)) { - modificationCounter++; + public Sone addFriend(Sone friendSone) { + if (!friendSone.equals(this)) { + friendSones.add(friendSone); } return this; } @@ -265,10 +303,8 @@ public class Sone { * The friend Sone to remove * @return This Sone (for method chaining) */ - public synchronized Sone removeFriend(Sone friendSone) { - if (friendSones.remove(friendSone)) { - modificationCounter++; - } + public Sone removeFriend(Sone friendSone) { + friendSones.remove(friendSone); return this; } @@ -380,49 +416,129 @@ public class Sone { } /** - * Returns the IDs of all blocked Sones. These Sones will not propagated - * using the “known Sones” mechanism. + * Returns the IDs of all liked posts. + * + * @return All liked posts’ IDs + */ + public Set getLikedPostIds() { + return Collections.unmodifiableSet(likedPostIds); + } + + /** + * Sets the IDs of all liked posts. + * + * @param likedPostIds + * All liked posts’ IDs + * @return This Sone (for method chaining) + */ + public synchronized Sone setLikePostIds(Set likedPostIds) { + this.likedPostIds.clear(); + this.likedPostIds.addAll(likedPostIds); + modificationCounter++; + return this; + } + + /** + * Checks whether the given post ID is liked by this Sone. + * + * @param postId + * The ID of the post + * @return {@code true} if this Sone likes the given post, {@code false} + * otherwise + */ + public boolean isLikedPostId(String postId) { + return likedPostIds.contains(postId); + } + + /** + * Adds the given post ID to the list of posts this Sone likes. + * + * @param postId + * The ID of the post + * @return This Sone (for method chaining) + */ + public synchronized Sone addLikedPostId(String postId) { + if (likedPostIds.add(postId)) { + modificationCounter++; + } + return this; + } + + /** + * Removes the given post ID from the list of posts this Sone likes. + * + * @param postId + * The ID of the post + * @return This Sone (for method chaining) + */ + public synchronized Sone removeLikedPostId(String postId) { + if (likedPostIds.remove(postId)) { + modificationCounter++; + } + return this; + } + + /** + * Returns the IDs of all liked replies. + * + * @return All liked replies’ IDs + */ + public Set getLikedReplyIds() { + return Collections.unmodifiableSet(likedReplyIds); + } + + /** + * Sets the IDs of all liked replies. * - * @return The IDs of all blocked Sones + * @param likedReplyIds + * All liked replies’ IDs + * @return This Sone (for method chaining) */ - public Set getBlockedSoneIds() { - return Collections.unmodifiableSet(blockedSoneIds); + public synchronized Sone setLikeReplyIds(Set likedReplyIds) { + this.likedReplyIds.clear(); + this.likedReplyIds.addAll(likedReplyIds); + modificationCounter++; + return this; } /** - * Returns whether the given Sone ID is blocked. + * Checks whether the given reply ID is liked by this Sone. * - * @param soneId - * The Sone ID to check - * @return {@code true} if the given Sone ID is blocked, {@code false} + * @param replyId + * The ID of the reply + * @return {@code true} if this Sone likes the given reply, {@code false} * otherwise */ - public boolean isSoneBlocked(String soneId) { - return blockedSoneIds.contains(soneId); + public boolean isLikedReplyId(String replyId) { + return likedReplyIds.contains(replyId); } /** - * Adds the given ID to the list of blocked IDs. + * Adds the given reply ID to the list of replies this Sone likes. * - * @param soneId - * The Sone ID to block + * @param replyId + * The ID of the reply + * @return This Sone (for method chaining) */ - public synchronized void addBlockedSoneId(String soneId) { - if (blockedSoneIds.add(soneId)) { + public synchronized Sone addLikedReplyId(String replyId) { + if (likedReplyIds.add(replyId)) { modificationCounter++; } + return this; } /** - * Removes the given ID from the list of blocked IDs. + * Removes the given post ID from the list of replies this Sone likes. * - * @param soneId - * The Sone ID to unblock + * @param replyId + * The ID of the reply + * @return This Sone (for method chaining) */ - public synchronized void removeBlockedSoneId(String soneId) { - if (blockedSoneIds.remove(soneId)) { + public synchronized Sone removeLikedReplyId(String replyId) { + if (likedReplyIds.remove(replyId)) { modificationCounter++; } + return this; } /** @@ -447,16 +563,36 @@ public class Sone { /** * 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); - if (this.insertUri != null) { - this.insertUri = this.insertUri.setSuggestedEdition(latestEdition); + * @param latestEdition + * The latest edition to update the URIs to + */ + public void updateUris(long latestEdition) { + if ((requestUri != null) && (requestUri.getEdition() < latestEdition)) { + requestUri = requestUri.setSuggestedEdition(latestEdition); + } + if ((insertUri != null) && (insertUri.getEdition() < latestEdition)) { + insertUri = insertUri.setSuggestedEdition(latestEdition); + } + } + + // + // PRIVATE METHODS + // + + /** + * Updates the editions of the request URI and the insert URI (if latter is + * not {@code null}) with the greater edition of either one. + */ + private void updateEditions() { + long requestEdition = 0; + if (requestUri != null) { + requestEdition = requestUri.getEdition(); + } + long insertEdition = 0; + if (insertUri != null) { + insertEdition = insertUri.getEdition(); } + updateUris(Math.max(requestEdition, insertEdition)); } //