X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fdata%2FSone.java;h=bd2416608dc8199450c500a1ac50b067785a0391;hb=a4cd99055d3814bc087efb8fa77ae861dff4e0fd;hp=8dcb442e3599af36f69c694360c952456b494a2d;hpb=1f597810693fe2af05e821342b83490cd75c2672;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 8dcb442..bd24166 100644 --- a/src/main/java/net/pterodactylus/sone/data/Sone.java +++ b/src/main/java/net/pterodactylus/sone/data/Sone.java @@ -18,13 +18,18 @@ package net.pterodactylus.sone.data; import java.util.ArrayList; +import java.util.Collection; 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.sone.template.SoneAccessor; +import net.pterodactylus.util.logging.Logging; import freenet.keys.FreenetURI; /** @@ -37,11 +42,14 @@ 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; /** The name of this Sone. */ - private final String name; + private String name; /** The URI under which the Sone is stored in Freenet. */ private FreenetURI requestUri; @@ -50,6 +58,9 @@ public class Sone { /* This will be null for remote Sones! */ private FreenetURI insertUri; + /** The time of the last inserted update. */ + private long time; + /** The profile of this Sone. */ private Profile profile; @@ -57,11 +68,14 @@ public class Sone { private final Set friendSones = new HashSet(); /** All posts. */ - private final List posts = new ArrayList(); + private final Set posts = new HashSet(); /** All replies. */ private final Set replies = new HashSet(); + /** The IDs of all blocked Sones. */ + private final Set blockedSoneIds = new HashSet(); + /** Modification count. */ private volatile long modificationCounter = 0; @@ -70,32 +84,9 @@ public class Sone { * * @param id * The ID of this Sone - * @param name - * The name of the Sone - * @param requestUri - * The request URI of the Sone */ - public Sone(UUID id, String name, FreenetURI requestUri) { - this(id, name, requestUri, null); - } - - /** - * Creates a new Sone. - * - * @param id - * The ID of this Sone - * @param name - * The name of the Sone - * @param requestUri - * The request URI of the Sone - * @param insertUri - * The insert URI of the Sone - */ - public Sone(UUID id, String name, FreenetURI requestUri, FreenetURI insertUri) { - this.id = id; - this.name = name; - this.requestUri = requestUri; - this.insertUri = insertUri; + public Sone(String id) { + this.id = UUID.fromString(id); } // @@ -121,6 +112,18 @@ public class Sone { } /** + * Sets the name of this Sone. + * + * @param name + * The name of this Sone + * @return This sone (for method chaining) + */ + public Sone setName(String name) { + this.name = name; + return this; + } + + /** * Returns the request URI of this Sone. * * @return The request URI of this Sone @@ -130,6 +133,18 @@ public class Sone { } /** + * Sets the request URI of this Sone. + * + * @param requestUri + * The request URI of this Sone + * @return This Sone (for method chaining) + */ + public Sone setRequestUri(FreenetURI requestUri) { + this.requestUri = requestUri; + return this; + } + + /** * Returns the insert URI of this Sone. * * @return The insert URI of this Sone @@ -139,6 +154,39 @@ public class Sone { } /** + * Sets the insert URI of this Sone. + * + * @param insertUri + * The insert URI of this Sone + * @return This Sone (for method chaining) + */ + public Sone setInsertUri(FreenetURI insertUri) { + this.insertUri = insertUri; + return this; + } + + /** + * Return the time of the last inserted update of this Sone. + * + * @return The time of the update (in milliseconds since Jan 1, 1970 UTC) + */ + public long getTime() { + return time; + } + + /** + * 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 a copy of the profile. If you want to update values in the * profile of this Sone, update the values in the returned {@link Profile} * and use {@link #setProfile(Profile)} to change the profile in this Sone. @@ -167,8 +215,34 @@ public class Sone { * * @return The friend Sones of this Sone */ - public Set getFriendSones() { - 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).compareTo(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; + } + + /** + * Sets all friends of this Sone at once. + * + * @param friends + * The new (and only) friends of this Sone + * @return This Sone (for method chaining) + */ + public synchronized Sone setFriends(Collection friends) { + friendSones.clear(); + friendSones.addAll(friends); + modificationCounter++; + return this; } /** @@ -179,7 +253,7 @@ public class Sone { * @return {@code true} if this Sone has the given Sone as a friend, * {@code false} otherwise */ - public boolean hasFriendSone(Sone friendSone) { + public boolean hasFriend(Sone friendSone) { return friendSones.contains(friendSone); } @@ -190,8 +264,8 @@ public class Sone { * The friend Sone to add * @return This Sone (for method chaining) */ - public synchronized Sone addFriendSone(Sone friendSone) { - if (friendSones.add(friendSone)) { + public synchronized Sone addFriend(Sone friendSone) { + if (!friendSone.equals(this) && friendSones.add(friendSone)) { modificationCounter++; } return this; @@ -204,7 +278,7 @@ public class Sone { * The friend Sone to remove * @return This Sone (for method chaining) */ - public synchronized Sone removeFriendSone(Sone friendSone) { + public synchronized Sone removeFriend(Sone friendSone) { if (friendSones.remove(friendSone)) { modificationCounter++; } @@ -230,6 +304,20 @@ public class Sone { } /** + * Sets all posts of this Sone at once. + * + * @param posts + * The new (and only) posts of this Sone + * @return This Sone (for method chaining) + */ + public synchronized Sone setPosts(Collection posts) { + this.posts.clear(); + this.posts.addAll(posts); + modificationCounter++; + return this; + } + + /** * Adds the given post to this Sone. The post will not be added if its * {@link Post#getSone() Sone} is not this Sone. * @@ -238,6 +326,7 @@ 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++; } } @@ -260,10 +349,25 @@ public class Sone { * @return All replies this Sone made */ public Set getReplies() { + logger.log(Level.FINEST, "Friends of %s: %s", new Object[] { this, friendSones }); return Collections.unmodifiableSet(replies); } /** + * Sets all replies of this Sone at once. + * + * @param replies + * The new (and only) replies of this Sone + * @return This Sone (for method chaining) + */ + public synchronized Sone setReplies(Collection replies) { + this.replies.clear(); + this.replies.addAll(replies); + modificationCounter++; + return this; + } + + /** * Adds a reply to this Sone. If the given reply was not made by this Sone, * nothing is added to this Sone. * @@ -289,6 +393,52 @@ public class Sone { } /** + * Returns the IDs of all blocked Sones. These Sones will not propagated + * using the “known Sones” mechanism. + * + * @return The IDs of all blocked Sones + */ + public Set getBlockedSoneIds() { + return Collections.unmodifiableSet(blockedSoneIds); + } + + /** + * Returns whether the given Sone ID is blocked. + * + * @param soneId + * The Sone ID to check + * @return {@code true} if the given Sone ID is blocked, {@code false} + * otherwise + */ + public boolean isSoneBlocked(String soneId) { + return blockedSoneIds.contains(soneId); + } + + /** + * Adds the given ID to the list of blocked IDs. + * + * @param soneId + * The Sone ID to block + */ + public synchronized void addBlockedSoneId(String soneId) { + if (blockedSoneIds.add(soneId)) { + modificationCounter++; + } + } + + /** + * Removes the given ID from the list of blocked IDs. + * + * @param soneId + * The Sone ID to unblock + */ + public synchronized void removeBlockedSoneId(String soneId) { + if (blockedSoneIds.remove(soneId)) { + modificationCounter++; + } + } + + /** * Returns the modification counter. * * @return The modification counter @@ -317,7 +467,9 @@ public class Sone { /* TODO - check for the correct URI. */ long latestEdition = requestUri.getSuggestedEdition(); this.requestUri = this.requestUri.setSuggestedEdition(latestEdition); - this.insertUri = this.insertUri.setSuggestedEdition(latestEdition); + if (this.insertUri != null) { + this.insertUri = this.insertUri.setSuggestedEdition(latestEdition); + } } // @@ -343,4 +495,12 @@ public class Sone { return ((Sone) object).id.equals(id); } + /** + * {@inheritDoc} + */ + @Override + public String toString() { + return getClass().getName() + "[id=" + id + ",name=" + name + ",requestUri=" + requestUri + ",insertUri=" + insertUri + ",friends(" + friendSones.size() + "),posts(" + posts.size() + "),replies(" + replies.size() + ")]"; + } + }