X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fdata%2FSone.java;h=6467c20258ac186fe34aba3f4d4b306df149db9a;hb=3d888e800617335535c1a4b2cbac3e02acfdde34;hp=b969bd4f9234b8acd2373ae245f052ae051bd60e;hpb=2284032867d6f03bf4eb7c70204ec33bd39ed006;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 b969bd4..d7a7dee 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–2013 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,143 +17,533 @@ package net.pterodactylus.sone.data; -import java.util.Collections; -import java.util.HashSet; +import static com.google.common.collect.FluentIterable.from; +import static java.util.Arrays.asList; +import static net.pterodactylus.sone.data.Album.FLATTENER; +import static net.pterodactylus.sone.data.Album.IMAGES; + +import java.util.Collection; +import java.util.Comparator; +import java.util.List; import java.util.Set; -import java.util.UUID; + +import net.pterodactylus.sone.core.Options; +import net.pterodactylus.sone.freenet.wot.Identity; +import net.pterodactylus.sone.freenet.wot.OwnIdentity; +import net.pterodactylus.sone.template.SoneAccessor; import freenet.keys.FreenetURI; +import com.google.common.base.Predicate; +import com.google.common.primitives.Ints; + /** - * A Sone defines everything about a user: the {@link User} itself, her profile, - * her status updates. + * A Sone defines everything about a user: her profile, her status updates, her + * replies, her likes and dislikes, etc. * * @author David ‘Bombe’ Roden */ -public class Sone { +public interface Sone extends Identified, Fingerprintable, Comparable { - /** A GUID for this Sone. */ - private final UUID id = UUID.randomUUID(); + /** + * Enumeration for the possible states of a {@link Sone}. + * + * @author David ‘Bombe’ Roden + */ + public enum SoneStatus { - /** The URI under which the Sone is stored in Freenet. */ - private final FreenetURI requestUri; + /** The Sone is unknown, i.e. not yet downloaded. */ + unknown, - /** The URI used to insert a new version of this Sone. */ - /* This will be null for remote Sones! */ - private final FreenetURI insertUri; + /** The Sone is idle, i.e. not being downloaded or inserted. */ + idle, - /** All friend Sones. */ - private final Set friendSones = new HashSet(); + /** The Sone is currently being inserted. */ + inserting, + + /** The Sone is currently being downloaded. */ + downloading, + } /** - * Creates a new Sone. + * The possible values for the “show custom avatars” option. * - * @param requestUri - * The request URI of the Sone + * @author David ‘Bombe’ Roden */ - public Sone(FreenetURI requestUri) { - this(requestUri, null); + public static enum ShowCustomAvatars { + + /** Never show custom avatars. */ + NEVER, + + /** Only show custom avatars of followed Sones. */ + FOLLOWED, + + /** Only show custom avatars of Sones you manually trust. */ + MANUALLY_TRUSTED, + + /** Only show custom avatars of automatically trusted Sones. */ + TRUSTED, + + /** Always show custom avatars. */ + ALWAYS, + } + /** comparator that sorts Sones by their nice name. */ + public static final Comparator NICE_NAME_COMPARATOR = new Comparator() { + + @Override + public int compare(Sone leftSone, Sone rightSone) { + int diff = SoneAccessor.getNiceName(leftSone).compareToIgnoreCase(SoneAccessor.getNiceName(rightSone)); + if (diff != 0) { + return diff; + } + return leftSone.getId().compareToIgnoreCase(rightSone.getId()); + } + + }; + + /** Comparator that sorts Sones by last activity (least recent active first). */ + public static final Comparator LAST_ACTIVITY_COMPARATOR = new Comparator() { + + @Override + public int compare(Sone firstSone, Sone secondSone) { + return (int) Math.min(Integer.MAX_VALUE, Math.max(Integer.MIN_VALUE, secondSone.getTime() - firstSone.getTime())); + } + }; + + /** Comparator that sorts Sones by numbers of posts (descending). */ + public static final Comparator POST_COUNT_COMPARATOR = new Comparator() { + + /** + * {@inheritDoc} + */ + @Override + public int compare(Sone leftSone, Sone rightSone) { + return (leftSone.getPosts().size() != rightSone.getPosts().size()) ? (rightSone.getPosts().size() - leftSone.getPosts().size()) : (rightSone.getReplies().size() - leftSone.getReplies().size()); + } + }; + + /** Comparator that sorts Sones by number of images (descending). */ + public static final Comparator IMAGE_COUNT_COMPARATOR = new Comparator() { + + /** + * {@inheritDoc} + */ + @Override + public int compare(Sone leftSone, Sone rightSone) { + int rightSoneImageCount = from(asList(rightSone.getRootAlbum())).transformAndConcat(FLATTENER).transformAndConcat(IMAGES).size(); + int leftSoneImageCount = from(asList(leftSone.getRootAlbum())).transformAndConcat(FLATTENER).transformAndConcat(IMAGES).size(); + /* sort descending. */ + return Ints.compare(rightSoneImageCount, leftSoneImageCount); + } + }; + + /** Filter to remove Sones that have not been downloaded. */ + public static final Predicate EMPTY_SONE_FILTER = new Predicate() { + + @Override + public boolean apply(Sone sone) { + return (sone == null) ? false : sone.getTime() != 0; + } + }; + + /** Filter that matches all {@link Sone#isLocal() local Sones}. */ + public static final Predicate LOCAL_SONE_FILTER = new Predicate() { + + @Override + public boolean apply(Sone sone) { + return (sone == null) ? false : sone.getIdentity() instanceof OwnIdentity; + } + + }; + + /** Filter that matches Sones that have at least one album. */ + public static final Predicate HAS_ALBUM_FILTER = new Predicate() { + + @Override + public boolean apply(Sone sone) { + return (sone == null) ? false : !sone.getRootAlbum().getAlbums().isEmpty(); + } + }; + /** - * Creates a new Sone. + * Returns the identity of this Sone. * - * @param requestUri - * The request URI of the Sone - * @param insertUri - * The insert URI of the Sone + * @return The identity of this Sone */ - public Sone(FreenetURI requestUri, FreenetURI insertUri) { - this.requestUri = requestUri; - this.insertUri = insertUri; - } + Identity getIdentity(); - // - // ACCESSORS - // + /** + * Sets the identity of this Sone. The {@link Identity#getId() ID} of the + * identity has to match this Sone’s {@link #getId()}. + * + * @param identity + * The identity of this Sone + * @return This Sone (for method chaining) + * @throws IllegalArgumentException + * if the ID of the identity does not match this Sone’s ID + */ + Sone setIdentity(Identity identity) throws IllegalArgumentException; /** - * Returns the ID of this Sone. + * Returns the name of this Sone. * - * @return The ID of this Sone + * @return The name of this Sone */ - public String getId() { - return id.toString(); - } + String getName(); + + /** + * Returns whether this Sone is a local Sone. + * + * @return {@code true} if this Sone is a local Sone, {@code false} otherwise + */ + boolean isLocal(); /** * Returns the request URI of this Sone. * * @return The request URI of this Sone */ - public FreenetURI getRequestUri() { - return requestUri; - } + FreenetURI getRequestUri(); + + /** + * Sets the request URI of this Sone. + * + * @param requestUri + * The request URI of this Sone + * @return This Sone (for method chaining) + */ + Sone setRequestUri(FreenetURI requestUri); /** * Returns the insert URI of this Sone. * * @return The insert URI of this Sone */ - public FreenetURI getInsertUri() { - return insertUri; - } + FreenetURI getInsertUri(); + + /** + * Sets the insert URI of this Sone. + * + * @param insertUri + * The insert URI of this Sone + * @return This Sone (for method chaining) + */ + Sone setInsertUri(FreenetURI insertUri); + + /** + * Returns the latest edition of this Sone. + * + * @return The latest edition of this Sone + */ + long getLatestEdition(); + + /** + * 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); + + /** + * Return the time of the last inserted update of this Sone. + * + * @return The time of the update (in milliseconds since Jan 1, 1970 UTC) + */ + long getTime(); + + /** + * 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) + */ + Sone setTime(long time); + + /** + * Returns the status of this Sone. + * + * @return The status of this Sone + */ + SoneStatus getStatus(); + + /** + * 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} + */ + Sone setStatus(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. + * + * @return A copy of the profile + */ + 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! + * + * @param profile + * The profile to set + */ + void setProfile(Profile profile); + + /** + * Returns the client used by this Sone. + * + * @return The client used by this Sone, or {@code null} + */ + Client getClient(); + + /** + * Sets the client used by this Sone. + * + * @param client + * The client used by this Sone, or {@code null} + * @return This Sone (for method chaining) + */ + Sone setClient(Client client); + + /** + * Returns whether this Sone is known. + * + * @return {@code true} if this Sone is known, {@code false} otherwise + */ + boolean isKnown(); + + /** + * Sets whether this Sone is known. + * + * @param known + * {@code true} if this Sone is known, {@code false} otherwise + * @return This Sone + */ + Sone setKnown(boolean known); /** * Returns all friend Sones of this Sone. * * @return The friend Sones of this Sone */ - public Set getFriendSones() { - return Collections.unmodifiableSet(friendSones); - } + List getFriends(); /** * Returns whether this Sone has the given Sone as a friend 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 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 */ - public boolean hasFriendSone(Sone friendSone) { - return friendSones.contains(friendSone); - } + boolean hasFriend(String friendSoneId); /** * Adds the given Sone as a friend Sone. * * @param friendSone - * The friend Sone to add + * The friend Sone to add * @return This Sone (for method chaining) */ - public Sone addFriendSone(Sone friendSone) { - friendSones.add(friendSone); - return this; - } + Sone addFriend(String friendSone); /** * Removes the given Sone as a friend Sone. * - * @param friendSone - * The friend Sone to remove + * @param friendSoneId + * The ID of the friend Sone to remove * @return This Sone (for method chaining) */ - public Sone removeFriendSone(Sone friendSone) { - friendSones.remove(friendSone); - return this; - } + Sone removeFriend(String friendSoneId); + + /** + * Returns the list of posts of this Sone, sorted by time, newest first. + * + * @return All posts of this Sone + */ + List getPosts(); - // - // OBJECT METHODS - // + /** + * Sets all posts of this Sone at once. + * + * @param posts + * The new (and only) posts of this Sone + * @return This Sone (for method chaining) + */ + Sone setPosts(Collection posts); /** - * {@inheritDoc} + * 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 */ - @Override - public int hashCode() { - return id.hashCode(); - } + void addPost(Post post); + + /** + * Removes the given post from this Sone. + * + * @param post + * The post to remove + */ + void removePost(Post post); + + /** + * Returns all replies this Sone made. + * + * @return All replies this Sone made + */ + 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) + */ + Sone setReplies(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 + */ + void addReply(PostReply reply); + + /** + * Removes a reply from this Sone. + * + * @param reply + * The reply to remove + */ + void removeReply(PostReply reply); + + /** + * Returns the IDs of all liked posts. + * + * @return All liked posts’ IDs + */ + Set getLikedPostIds(); + + /** + * Sets the IDs of all liked posts. + * + * @param likedPostIds + * All liked posts’ IDs + * @return This Sone (for method chaining) + */ + Sone setLikePostIds(Set likedPostIds); + + /** + * Checks whether the given post ID is liked by this Sone. + * + * @param postId + * The ID of the post + * @return {@code true} if this Sone likes the given post, {@code false} + * otherwise + */ + boolean isLikedPostId(String postId); + + /** + * 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) + */ + Sone addLikedPostId(String postId); + + /** + * Removes the given post ID from the list of posts this Sone likes. + * + * @param postId + * The ID of the post + * @return This Sone (for method chaining) + */ + Sone removeLikedPostId(String postId); + + /** + * Returns the IDs of all liked replies. + * + * @return All liked replies’ IDs + */ + Set getLikedReplyIds(); + + /** + * Sets the IDs of all liked replies. + * + * @param likedReplyIds + * All liked replies’ IDs + * @return This Sone (for method chaining) + */ + Sone setLikeReplyIds(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(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) + */ + Sone addLikedReplyId(String replyId); + + /** + * Removes the given post ID from the list of replies this Sone likes. + * + * @param replyId + * The ID of the reply + * @return This Sone (for method chaining) + */ + Sone removeLikedReplyId(String replyId); + + /** + * Returns the root album that contains all visible albums of this Sone. + * + * @return The root album of this Sone + */ + Album getRootAlbum(); + + /** + * Returns Sone-specific options. + * + * @return The options of this Sone + */ + Options 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(Options options); }