X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fdata%2FSone.java;h=715d95b01e574f9927a4d45144963a7d7e036448;hb=07d3fa7dac96e8a5eff41487d647974df8c26f8d;hp=6d729c37696e57c5e7c63799ae71cfe1a3e605cb;hpb=2f31aeb3fe3bab27ac1a58e2e0e6f2133a5370d1;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 6d729c3..836baa1 100644 --- a/src/main/java/net/pterodactylus/sone/data/Sone.java +++ b/src/main/java/net/pterodactylus/sone/data/Sone.java @@ -1,5 +1,5 @@ /* - * FreenetSone - Sone.java - Copyright © 2010 David Roden + * Sone - Sone.java - Copyright © 2010–2020 David Roden * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -17,345 +17,408 @@ package net.pterodactylus.sone.data; -import java.util.ArrayList; +import static com.google.common.collect.FluentIterable.from; +import static net.pterodactylus.sone.data.Album.FLATTENER; +import static net.pterodactylus.sone.data.Album.IMAGES; + +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.util.logging.Logging; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import net.pterodactylus.sone.freenet.wot.Identity; + import freenet.keys.FreenetURI; +import com.google.common.base.Function; + /** * A Sone defines everything about a user: her profile, her status updates, her * replies, her likes and dislikes, etc. - *

- * Operations that modify the Sone need to synchronize on the Sone in question. - * - * @author David ‘Bombe’ Roden */ -public class Sone { - - /** The logger. */ - private static final Logger logger = Logging.getLogger(Sone.class); +public interface Sone extends Identified, Fingerprintable, Comparable { - /** A GUID for this Sone. */ - private final UUID id; + /** + * Enumeration for the possible states of a {@link Sone}. + */ + public enum SoneStatus { - /** The name of this Sone. */ - private final String name; + /** The Sone is unknown, i.e. not yet downloaded. */ + unknown, - /** The URI under which the Sone is stored in Freenet. */ - private FreenetURI requestUri; + /** The Sone is idle, i.e. not being downloaded or inserted. */ + idle, - /** The URI used to insert a new version of this Sone. */ - /* This will be null for remote Sones! */ - private FreenetURI insertUri; + /** The Sone is currently being inserted. */ + inserting, - /** The profile of this Sone. */ - private Profile profile; + /** The Sone is currently being downloaded. */ + downloading, + } - /** All friend Sones. */ - private final Set friendSones = new HashSet(); + public static final Function> toAllAlbums = new Function>() { + @Override + public List apply(@Nullable Sone sone) { + return (sone == null) ? Collections.emptyList() : FLATTENER.apply( + sone.getRootAlbum()); + } + }; + + public static final Function> toAllImages = new Function>() { + @Override + public List apply(@Nullable Sone sone) { + return (sone == null) ? Collections.emptyList() : + from(FLATTENER.apply(sone.getRootAlbum())) + .transformAndConcat(IMAGES).toList(); + } + }; - /** All posts. */ - private final List posts = new ArrayList(); + /** + * Returns the identity of this Sone. + * + * @return The identity of this Sone + */ + @Nonnull + Identity getIdentity(); - /** All replies. */ - private final Set replies = new HashSet(); + /** + * Returns the name of this Sone. + * + * @return The name of this Sone + */ + @Nonnull + String getName(); - /** Modification count. */ - private volatile long modificationCounter = 0; + /** + * Returns whether this Sone is a local Sone. + * + * @return {@code true} if this Sone is a local Sone, {@code false} otherwise + */ + boolean isLocal(); /** - * Creates a new Sone. + * Returns the request URI of this Sone. * - * @param id - * The ID of this Sone - * @param name - * The name of the Sone - * @param requestUri - * The request URI of the Sone + * @return The request URI of this Sone */ - public Sone(UUID id, String name, FreenetURI requestUri) { - this(id, name, requestUri, null); - } + @Nonnull + FreenetURI getRequestUri(); /** - * Creates a new Sone. + * Returns the latest edition of this 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 + * @return The latest edition of this Sone */ - public Sone(UUID id, String name, FreenetURI requestUri, FreenetURI insertUri) { - this.id = id; - this.name = name; - this.requestUri = requestUri; - this.insertUri = insertUri; - } + long getLatestEdition(); - // - // ACCESSORS - // + /** + * Sets the latest edition of this Sone. If the given latest edition is not + * greater than the current latest edition, the latest edition of this Sone is + * not changed. + * + * @param latestEdition + * The latest edition of this Sone + */ + void setLatestEdition(long latestEdition); /** - * Returns the ID of this Sone. + * Return the time of the last inserted update of this Sone. * - * @return The ID of this Sone + * @return The time of the update (in milliseconds since Jan 1, 1970 UTC) */ - public String getId() { - return id.toString(); - } + long getTime(); /** - * Returns the name of this Sone. + * Sets the time of the last inserted update of this Sone. * - * @return The name of this Sone + * @param time + * The time of the update (in milliseconds since Jan 1, 1970 UTC) + * @return This Sone (for method chaining) */ - public String getName() { - return name; - } + @Nonnull + Sone setTime(long time); /** - * Returns the request URI of this Sone. + * Returns the status of this Sone. * - * @return The request URI of this Sone + * @return The status of this Sone */ - public FreenetURI getRequestUri() { - return requestUri; - } + @Nonnull + SoneStatus getStatus(); /** - * Returns the insert URI of this Sone. + * Sets the new status of this Sone. * - * @return The insert URI of this Sone + * @param status + * The new status of this Sone + * @return This Sone + * @throws IllegalArgumentException + * if {@code status} is {@code null} */ - public FreenetURI getInsertUri() { - return insertUri; - } + @Nonnull + Sone setStatus(@Nonnull SoneStatus status); /** - * 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. + * 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 Profile getProfile() { - return new Profile(profile); - } + @Nonnull + Profile getProfile(); /** - * Sets the profile of this Sone. A copy of the given profile is stored so - * that subsequent modifications of the given profile are not reflected in - * this Sone! + * Sets the profile of this Sone. A copy of the given profile is stored so that + * subsequent modifications of the given profile are not reflected in this + * Sone! * * @param profile - * The profile to set + * The profile to set */ - public synchronized void setProfile(Profile profile) { - this.profile = new Profile(profile); - modificationCounter++; - } + void setProfile(@Nonnull Profile profile); /** - * Returns all friend Sones of this Sone. + * Returns the client used by this Sone. * - * @return The friend Sones of this Sone + * @return The client used by this Sone, or {@code null} */ - public Set getFriends() { - return Collections.unmodifiableSet(friendSones); - } + @Nullable + Client getClient(); /** - * Returns whether this Sone has the given Sone as a friend Sone. + * Sets the client used by this Sone. * - * @param friendSone - * The friend Sone to check for - * @return {@code true} if this Sone has the given Sone as a friend, - * {@code false} otherwise + * @param client + * The client used by this Sone, or {@code null} + * @return This Sone (for method chaining) */ - public boolean hasFriend(Sone friendSone) { - return friendSones.contains(friendSone); - } + @Nonnull + Sone setClient(@Nullable Client client); /** - * Adds the given Sone as a friend Sone. + * Returns whether this Sone is known. * - * @param friendSone - * The friend Sone to add - * @return This Sone (for method chaining) + * @return {@code true} if this Sone is known, {@code false} otherwise */ - public synchronized Sone addFriend(Sone friendSone) { - if (!friendSone.equals(this) && friendSones.add(friendSone)) { - modificationCounter++; - } - return this; - } + boolean isKnown(); /** - * Removes the given Sone as a friend Sone. + * Sets whether this Sone is known. * - * @param friendSone - * The friend Sone to remove - * @return This Sone (for method chaining) + * @param known + * {@code true} if this Sone is known, {@code false} otherwise + * @return This Sone */ - public synchronized Sone removeFriend(Sone friendSone) { - if (friendSones.remove(friendSone)) { - modificationCounter++; - } - return this; - } + @Nonnull + Sone setKnown(boolean known); + + /** + * Returns all friend Sones of this Sone. + * + * @return The friend Sones of this Sone + */ + @Nonnull + Collection getFriends(); + + /** + * Returns whether this Sone has the given Sone as a friend Sone. + * + * @param friendSoneId + * The ID of the Sone to check for + * @return {@code true} if this Sone has the given Sone as a friend, {@code + * false} otherwise + */ + boolean hasFriend(@Nonnull String friendSoneId); /** * Returns the list of posts of this Sone, sorted by time, newest first. * * @return All posts of this Sone */ - public List getPosts() { - List sortedPosts = new ArrayList(posts); - Collections.sort(sortedPosts, new Comparator() { - - @Override - public int compare(Post leftPost, Post rightPost) { - return (int) Math.max(Integer.MIN_VALUE, Math.min(Integer.MAX_VALUE, rightPost.getTime() - leftPost.getTime())); - } + @Nonnull + List getPosts(); - }); - return sortedPosts; - } + /** + * Sets all posts of this Sone at once. + * + * @param posts + * The new (and only) posts of this Sone + * @return This Sone (for method chaining) + */ + @Nonnull + Sone setPosts(@Nonnull Collection posts); /** - * Adds the given post to this Sone. The post will not be added if its - * {@link Post#getSone() Sone} is not this Sone. + * Adds the given post to this Sone. The post will not be added if its {@link + * Post#getSone() Sone} is not this Sone. * * @param post - * The post to add + * The post to add */ - 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++; - } - } + void addPost(@Nonnull Post post); /** * Removes the given post from this Sone. * * @param post - * The post to remove + * The post to remove */ - public synchronized void removePost(Post post) { - if (post.getSone().equals(this) && posts.remove(post)) { - modificationCounter++; - } - } + void removePost(@Nonnull Post post); /** * Returns all replies this Sone made. * * @return All replies this Sone made */ - public Set getReplies() { - return Collections.unmodifiableSet(replies); - } + @Nonnull + Set getReplies(); + + /** + * Sets all replies of this Sone at once. + * + * @param replies + * The new (and only) replies of this Sone + * @return This Sone (for method chaining) + */ + @Nonnull + Sone setReplies(@Nonnull Collection replies); /** * Adds a reply to this Sone. If the given reply was not made by this Sone, * nothing is added to this Sone. * * @param reply - * The reply to add + * The reply to add */ - public synchronized void addReply(Reply reply) { - if (reply.getSone().equals(this) && replies.add(reply)) { - modificationCounter++; - } - } + void addReply(@Nonnull PostReply reply); /** * Removes a reply from this Sone. * * @param reply - * The reply to remove + * The reply to remove */ - public synchronized void removeReply(Reply reply) { - if (reply.getSone().equals(this) && replies.remove(reply)) { - modificationCounter++; - } - } + void removeReply(@Nonnull PostReply reply); /** - * Returns the modification counter. + * Returns the IDs of all liked posts. * - * @return The modification counter + * @return All liked posts’ IDs */ - public synchronized long getModificationCounter() { - return modificationCounter; - } + @Nonnull + Set getLikedPostIds(); /** - * Sets the modification counter. + * Sets the IDs of all liked posts. * - * @param modificationCounter - * The new modification counter + * @param likedPostIds + * All liked posts’ IDs + * @return This Sone (for method chaining) */ - public synchronized void setModificationCounter(long modificationCounter) { - this.modificationCounter = modificationCounter; - } + @Nonnull + Sone setLikePostIds(@Nonnull Set likedPostIds); /** - * Updates the suggested edition in both the request URI and the insert URI. + * Checks whether the given post ID is liked by this Sone. * - * @param requestUri - * The request URI that resulted from an insert + * @param postId + * The ID of the post + * @return {@code true} if this Sone likes the given post, {@code false} + * otherwise */ - public void updateUris(FreenetURI requestUri) { - /* TODO - check for the correct URI. */ - long latestEdition = requestUri.getSuggestedEdition(); - this.requestUri = this.requestUri.setSuggestedEdition(latestEdition); - this.insertUri = this.insertUri.setSuggestedEdition(latestEdition); - } + boolean isLikedPostId(@Nonnull String postId); - // - // OBJECT METHODS - // + /** + * 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) + */ + @Nonnull + Sone addLikedPostId(@Nonnull String postId); /** - * {@inheritDoc} + * Removes the given post ID from the list of posts this Sone likes. + * + * @param postId + * The ID of the post */ - @Override - public int hashCode() { - return getId().hashCode(); - } + void removeLikedPostId(@Nonnull String postId); /** - * {@inheritDoc} + * Returns the IDs of all liked replies. + * + * @return All liked replies’ IDs */ - @Override - public boolean equals(Object object) { - if (!(object instanceof Sone)) { - return false; - } - return ((Sone) object).id.equals(getId()); - } + @Nonnull + Set getLikedReplyIds(); /** - * {@inheritDoc} + * Sets the IDs of all liked replies. + * + * @param likedReplyIds + * All liked replies’ IDs + * @return This Sone (for method chaining) */ - @Override - public String toString() { - return getClass().getName() + "[id=" + getId() + ",name=" + getName() + ",requestUri=" + getRequestUri() + ",insertUri=" + getInsertUri() + ",friends(" + friendSones.size() + "),posts(" + posts.size() + "),replies(" + replies.size() + ")]"; - } + @Nonnull + Sone setLikeReplyIds(@Nonnull Set likedReplyIds); + + /** + * Checks whether the given reply ID is liked by this Sone. + * + * @param replyId + * The ID of the reply + * @return {@code true} if this Sone likes the given reply, {@code false} + * otherwise + */ + boolean isLikedReplyId(@Nonnull String replyId); + + /** + * Adds the given reply ID to the list of replies this Sone likes. + * + * @param replyId + * The ID of the reply + * @return This Sone (for method chaining) + */ + @Nonnull + Sone addLikedReplyId(@Nonnull String replyId); + + /** + * Removes the given post ID from the list of replies this Sone likes. + * + * @param replyId + * The ID of the reply + */ + void removeLikedReplyId(@Nonnull String replyId); + + /** + * Returns the root album that contains all visible albums of this Sone. + * + * @return The root album of this Sone + */ + @Nonnull + Album getRootAlbum(); + + /** + * Returns Sone-specific options. + * + * @return The options of this Sone + */ + @Nonnull + SoneOptions getOptions(); + + /** + * Sets the options of this Sone. + * + * @param options + * The options of this Sone + */ + /* TODO - remove this method again, maybe add an option provider */ + void setOptions(@Nonnull SoneOptions options); }