}
};
+ /** Comparator that sorts Sones by number of images (descending). */
+ public static final Comparator<Sone> IMAGE_COUNT_COMPARATOR = new Comparator<Sone>() {
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public int compare(Sone leftSone, Sone rightSone) {
+ return rightSone.getAllImages().size() - leftSone.getAllImages().size();
+ }
+ };
+
/** Filter to remove Sones that have not been downloaded. */
public static final Filter<Sone> EMPTY_SONE_FILTER = new Filter<Sone>() {
};
+ /** Filter that matches Sones that have at least one album. */
+ public static final Filter<Sone> HAS_ALBUM_FILTER = new Filter<Sone>() {
+
+ @Override
+ public boolean filterObject(Sone sone) {
+ return !sone.getAlbums().isEmpty();
+ }
+ };
+
/** The logger. */
private static final Logger logger = Logging.getLogger(Sone.class);
private final Set<Post> posts = Collections.synchronizedSet(new HashSet<Post>());
/** All replies. */
- private final Set<Reply> replies = Collections.synchronizedSet(new HashSet<Reply>());
+ private final Set<PostReply> replies = Collections.synchronizedSet(new HashSet<PostReply>());
/** The IDs of all liked posts. */
private final Set<String> likedPostIds = Collections.synchronizedSet(new HashSet<String>());
/** Sone-specific options. */
private final Options options = new Options();
+ /** The avatar of this Sone. */
+ private volatile String avatar;
+
/**
* Creates a new Sone.
*
}
/**
- * 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 Sone setFriends(Collection<String> friends) {
- friendSones.clear();
- friendSones.addAll(friends);
- return this;
- }
-
- /**
* Returns whether this Sone has the given Sone as a friend Sone.
*
* @param friendSoneId
*
* @return All replies this Sone made
*/
- public synchronized Set<Reply> getReplies() {
+ public synchronized Set<PostReply> getReplies() {
return Collections.unmodifiableSet(replies);
}
* The new (and only) replies of this Sone
* @return This Sone (for method chaining)
*/
- public synchronized Sone setReplies(Collection<Reply> replies) {
+ public synchronized Sone setReplies(Collection<PostReply> replies) {
this.replies.clear();
this.replies.addAll(replies);
return this;
* @param reply
* The reply to add
*/
- public synchronized void addReply(Reply reply) {
+ public synchronized void addReply(PostReply reply) {
if (reply.getSone().equals(this)) {
replies.add(reply);
}
* @param reply
* The reply to remove
*/
- public synchronized void removeReply(Reply reply) {
+ public synchronized void removeReply(PostReply reply) {
if (reply.getSone().equals(this)) {
replies.remove(reply);
}
}
/**
+ * Returns the ID of the currently selected avatar image.
+ *
+ * @return The ID of the currently selected avatar image, or {@code null} if
+ * no avatar is selected.
+ */
+ public String getAvatar() {
+ return avatar;
+ }
+
+ /**
+ * Sets the avatar image.
+ *
+ * @param avatar
+ * The new avatar image, or {@code null} to not select an avatar
+ * image.
+ * @return This Sone
+ */
+ public Sone setAvatar(Image avatar) {
+ if (avatar == null) {
+ this.avatar = null;
+ return this;
+ }
+ Validation.begin().isEqual("Image Owner", avatar.getSone(), this).check();
+ this.avatar = avatar.getId();
+ return this;
+ }
+
+ /**
* Returns Sone-specific options.
*
* @return The options of this Sone
}
fingerprint.append(")");
- List<Reply> replies = new ArrayList<Reply>(getReplies());
+ List<PostReply> replies = new ArrayList<PostReply>(getReplies());
Collections.sort(replies, Reply.TIME_COMPARATOR);
fingerprint.append("Replies(");
- for (Reply reply : replies) {
+ for (PostReply reply : replies) {
fingerprint.append("Reply(").append(reply.getId()).append(')');
}
fingerprint.append(')');
}
fingerprint.append(')');
+ fingerprint.append("Avatar(").append(avatar).append(')');
+
return fingerprint.toString();
}