X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fdata%2FSone.java;h=3e808a80da71513d09a628e35a6ad7a5a3c937c5;hb=7c85033af8457c99cb87feb930f228de0abf70fe;hp=588c7af71630b5b71e150c0fd959364b2e52d24a;hpb=0718135c70c14c2e438cc31382fea6207e993701;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 588c7af..3e808a8 100644 --- a/src/main/java/net/pterodactylus/sone/data/Sone.java +++ b/src/main/java/net/pterodactylus/sone/data/Sone.java @@ -18,6 +18,7 @@ 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; @@ -47,7 +48,7 @@ public class 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; @@ -56,6 +57,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; @@ -63,11 +67,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; @@ -76,32 +83,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); } // @@ -127,6 +111,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 @@ -136,6 +132,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 @@ -145,6 +153,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. @@ -173,11 +214,25 @@ public class Sone { * * @return The friend Sones of this Sone */ - public Set getFriendSones() { + public Set getFriends() { return Collections.unmodifiableSet(friendSones); } /** + * 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; + } + + /** * Returns whether this Sone has the given Sone as a friend Sone. * * @param friendSone @@ -185,7 +240,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); } @@ -196,8 +251,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; @@ -210,7 +265,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++; } @@ -236,6 +291,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. * @@ -267,10 +336,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. * @@ -296,6 +380,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 @@ -324,7 +454,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); + } } // @@ -355,7 +487,7 @@ public class Sone { */ @Override public String toString() { - return getClass().getName() + "[id=" + getId() + ",name=" + getName() + ",requestUri=" + getRequestUri() + ",insertUri=" + getInsertUri() + ",posts(" + posts.size() + "),replies(" + replies.size() + ")]"; + return getClass().getName() + "[id=" + id + ",name=" + name + ",requestUri=" + requestUri + ",insertUri=" + insertUri + ",friends(" + friendSones.size() + "),posts(" + posts.size() + "),replies(" + replies.size() + ")]"; } }