X-Git-Url: https://git.pterodactylus.net/?p=Sone.git;a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fdata%2FSone.java;h=e5ebcf1df439ff42ec71540233e42bd8c99e153c;hp=901d676bc9b55df1b5f3774f85da8bc0c1ffad85;hb=c9e306ac8e3ada846e87a0cc256a20fc148f381c;hpb=14dd8f2dcddb3ebfa0618677f10fe11b8f86ecdd diff --git a/src/main/java/net/pterodactylus/sone/data/Sone.java b/src/main/java/net/pterodactylus/sone/data/Sone.java index 901d676..e5ebcf1 100644 --- a/src/main/java/net/pterodactylus/sone/data/Sone.java +++ b/src/main/java/net/pterodactylus/sone/data/Sone.java @@ -21,9 +21,10 @@ 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.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.CopyOnWriteArraySet; import java.util.logging.Level; import java.util.logging.Logger; @@ -48,6 +49,26 @@ import freenet.keys.FreenetURI; public class Sone implements Fingerprintable, Comparable { /** + * Enumeration for the possible states of a {@link Sone}. + * + * @author David ‘Bombe’ Roden + */ + public enum SoneStatus { + + /** The Sone is unknown, i.e. not yet downloaded. */ + unknown, + + /** The Sone is idle, i.e. not being downloaded or inserted. */ + idle, + + /** The Sone is currently being inserted. */ + inserting, + + /** The Sone is currently being downloaded. */ + downloading, + } + + /** * The possible values for the “show custom avatars” option. * * @author David ‘Bombe’ Roden @@ -170,29 +191,35 @@ public class Sone implements Fingerprintable, Comparable { /** The time of the last inserted update. */ private volatile long time; + /** The status of this Sone. */ + private volatile SoneStatus status = SoneStatus.unknown; + /** The profile of this Sone. */ private volatile Profile profile = new Profile(this); /** The client used by the Sone. */ private volatile Client client; + /** Whether this Sone is known. */ + private volatile boolean known; + /** All friend Sones. */ - private final Set friendSones = Collections.synchronizedSet(new HashSet()); + private final Set friendSones = new CopyOnWriteArraySet(); /** All posts. */ - private final Set posts = Collections.synchronizedSet(new HashSet()); + private final Set posts = new CopyOnWriteArraySet(); /** All replies. */ - private final Set replies = Collections.synchronizedSet(new HashSet()); + private final Set replies = new CopyOnWriteArraySet(); /** The IDs of all liked posts. */ - private final Set likedPostIds = Collections.synchronizedSet(new HashSet()); + private final Set likedPostIds = new CopyOnWriteArraySet(); /** The IDs of all liked replies. */ - private final Set likedReplyIds = Collections.synchronizedSet(new HashSet()); + private final Set likedReplyIds = new CopyOnWriteArraySet(); /** The albums of this Sone. */ - private final List albums = Collections.synchronizedList(new ArrayList()); + private final List albums = new CopyOnWriteArrayList(); /** Sone-specific options. */ private final Options options = new Options(); @@ -278,7 +305,7 @@ public class Sone implements Fingerprintable, Comparable { return this; } if (!this.requestUri.equalsKeypair(requestUri)) { - logger.log(Level.WARNING, "Request URI %s tried to overwrite %s!", new Object[] { requestUri, this.requestUri }); + logger.log(Level.WARNING, String.format("Request URI %s tried to overwrite %s!", requestUri, this.requestUri)); return this; } return this; @@ -306,7 +333,7 @@ public class Sone implements Fingerprintable, Comparable { return this; } if (!this.insertUri.equalsKeypair(insertUri)) { - logger.log(Level.WARNING, "Request URI %s tried to overwrite %s!", new Object[] { insertUri, this.insertUri }); + logger.log(Level.WARNING, String.format("Request URI %s tried to overwrite %s!", insertUri, this.insertUri)); return this; } return this; @@ -331,7 +358,7 @@ public class Sone implements Fingerprintable, Comparable { */ public void setLatestEdition(long latestEdition) { if (!(latestEdition > this.latestEdition)) { - logger.log(Level.FINE, "New latest edition %d is not greater than current latest edition %d!", new Object[] { latestEdition, this.latestEdition }); + logger.log(Level.FINE, String.format("New latest edition %d is not greater than current latest edition %d!", latestEdition, this.latestEdition)); return; } this.latestEdition = latestEdition; @@ -359,13 +386,37 @@ public class Sone implements Fingerprintable, Comparable { } /** + * Returns the status of this Sone. + * + * @return The status of this Sone + */ + public SoneStatus getStatus() { + return status; + } + + /** + * Sets the new status of this Sone. + * + * @param status + * The new status of this Sone + * @return This Sone + * @throws IllegalArgumentException + * if {@code status} is {@code null} + */ + public Sone setStatus(SoneStatus status) { + Validation.begin().isNotNull("Sone Status", status).check(); + this.status = status; + 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. * * @return A copy of the profile */ - public synchronized Profile getProfile() { + public Profile getProfile() { return new Profile(profile); } @@ -377,7 +428,7 @@ public class Sone implements Fingerprintable, Comparable { * @param profile * The profile to set */ - public synchronized void setProfile(Profile profile) { + public void setProfile(Profile profile) { this.profile = new Profile(profile); } @@ -403,6 +454,27 @@ public class Sone implements Fingerprintable, Comparable { } /** + * Returns whether this Sone is known. + * + * @return {@code true} if this Sone is known, {@code false} otherwise + */ + public boolean isKnown() { + return known; + } + + /** + * Sets whether this Sone is known. + * + * @param known + * {@code true} if this Sone is known, {@code false} otherwise + * @return This Sone + */ + public Sone setKnown(boolean known) { + this.known = known; + return this; + } + + /** * Returns all friend Sones of this Sone. * * @return The friend Sones of this Sone @@ -471,7 +543,7 @@ public class Sone implements Fingerprintable, Comparable { * The new (and only) posts of this Sone * @return This Sone (for method chaining) */ - public synchronized Sone setPosts(Collection posts) { + public Sone setPosts(Collection posts) { synchronized (this) { this.posts.clear(); this.posts.addAll(posts); @@ -486,9 +558,9 @@ public class Sone implements Fingerprintable, Comparable { * @param post * The post to add */ - public synchronized void addPost(Post post) { + public void addPost(Post post) { if (post.getSone().equals(this) && posts.add(post)) { - logger.log(Level.FINEST, "Adding %s to “%s”.", new Object[] { post, getName() }); + logger.log(Level.FINEST, String.format("Adding %s to “%s”.", post, getName())); } } @@ -498,7 +570,7 @@ public class Sone implements Fingerprintable, Comparable { * @param post * The post to remove */ - public synchronized void removePost(Post post) { + public void removePost(Post post) { if (post.getSone().equals(this)) { posts.remove(post); } @@ -509,7 +581,7 @@ public class Sone implements Fingerprintable, Comparable { * * @return All replies this Sone made */ - public synchronized Set getReplies() { + public Set getReplies() { return Collections.unmodifiableSet(replies); } @@ -520,7 +592,7 @@ public class Sone implements Fingerprintable, Comparable { * The new (and only) replies of this Sone * @return This Sone (for method chaining) */ - public synchronized Sone setReplies(Collection replies) { + public Sone setReplies(Collection replies) { this.replies.clear(); this.replies.addAll(replies); return this; @@ -533,7 +605,7 @@ public class Sone implements Fingerprintable, Comparable { * @param reply * The reply to add */ - public synchronized void addReply(PostReply reply) { + public void addReply(PostReply reply) { if (reply.getSone().equals(this)) { replies.add(reply); } @@ -545,7 +617,7 @@ public class Sone implements Fingerprintable, Comparable { * @param reply * The reply to remove */ - public synchronized void removeReply(PostReply reply) { + public void removeReply(PostReply reply) { if (reply.getSone().equals(this)) { replies.remove(reply); } @@ -567,7 +639,7 @@ public class Sone implements Fingerprintable, Comparable { * All liked posts’ IDs * @return This Sone (for method chaining) */ - public synchronized Sone setLikePostIds(Set likedPostIds) { + public Sone setLikePostIds(Set likedPostIds) { this.likedPostIds.clear(); this.likedPostIds.addAll(likedPostIds); return this; @@ -592,7 +664,7 @@ public class Sone implements Fingerprintable, Comparable { * The ID of the post * @return This Sone (for method chaining) */ - public synchronized Sone addLikedPostId(String postId) { + public Sone addLikedPostId(String postId) { likedPostIds.add(postId); return this; } @@ -604,7 +676,7 @@ public class Sone implements Fingerprintable, Comparable { * The ID of the post * @return This Sone (for method chaining) */ - public synchronized Sone removeLikedPostId(String postId) { + public Sone removeLikedPostId(String postId) { likedPostIds.remove(postId); return this; } @@ -625,7 +697,7 @@ public class Sone implements Fingerprintable, Comparable { * All liked replies’ IDs * @return This Sone (for method chaining) */ - public synchronized Sone setLikeReplyIds(Set likedReplyIds) { + public Sone setLikeReplyIds(Set likedReplyIds) { this.likedReplyIds.clear(); this.likedReplyIds.addAll(likedReplyIds); return this; @@ -650,7 +722,7 @@ public class Sone implements Fingerprintable, Comparable { * The ID of the reply * @return This Sone (for method chaining) */ - public synchronized Sone addLikedReplyId(String replyId) { + public Sone addLikedReplyId(String replyId) { likedReplyIds.add(replyId); return this; } @@ -662,7 +734,7 @@ public class Sone implements Fingerprintable, Comparable { * The ID of the reply * @return This Sone (for method chaining) */ - public synchronized Sone removeLikedReplyId(String replyId) { + public Sone removeLikedReplyId(String replyId) { likedReplyIds.remove(replyId); return this; } @@ -717,7 +789,7 @@ public class Sone implements Fingerprintable, Comparable { * @param album * The album to add */ - public synchronized void addAlbum(Album album) { + public void addAlbum(Album album) { Validation.begin().isNotNull("Album", album).check().isEqual("Album Owner", album.getSone(), this).check(); albums.add(album); } @@ -728,7 +800,7 @@ public class Sone implements Fingerprintable, Comparable { * @param albums * The albums of this Sone */ - public synchronized void setAlbums(Collection albums) { + public void setAlbums(Collection albums) { Validation.begin().isNotNull("Albums", albums).check(); this.albums.clear(); for (Album album : albums) { @@ -742,7 +814,7 @@ public class Sone implements Fingerprintable, Comparable { * @param album * The album to remove */ - public synchronized void removeAlbum(Album album) { + public void removeAlbum(Album album) { Validation.begin().isNotNull("Album", album).check().isEqual("Album Owner", album.getSone(), this).check(); albums.remove(album); }