/*
- * Sone - SoneImpl.java - Copyright © 2010–2013 David Roden
+ * Sone - SoneImpl.java - Copyright © 2010–2016 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
import java.util.logging.Level;
import java.util.logging.Logger;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
import net.pterodactylus.sone.data.Album;
-import net.pterodactylus.sone.data.impl.AlbumImpl;
import net.pterodactylus.sone.data.Client;
import net.pterodactylus.sone.data.Post;
import net.pterodactylus.sone.data.PostReply;
import net.pterodactylus.sone.data.Sone;
import net.pterodactylus.sone.data.SoneOptions;
import net.pterodactylus.sone.data.SoneOptions.DefaultSoneOptions;
+import net.pterodactylus.sone.database.Database;
import net.pterodactylus.sone.freenet.wot.Identity;
import net.pterodactylus.sone.freenet.wot.OwnIdentity;
public class SoneImpl implements Sone {
/** The logger. */
- private static final Logger logger = getLogger("Sone.Data");
+ private static final Logger logger = getLogger(SoneImpl.class.getName());
+
+ /** The database. */
+ private final Database database;
/** The ID of this Sone. */
private final String id;
/** Whether this Sone is known. */
private volatile boolean known;
- /** All friend Sones. */
- private final Set<String> friendSones = new CopyOnWriteArraySet<String>();
-
/** All posts. */
private final Set<Post> posts = new CopyOnWriteArraySet<Post>();
/**
* Creates a new Sone.
*
+ * @param database The database
* @param identity
* The identity of the Sone
* @param local
* {@code true} if the Sone is a local Sone, {@code false} otherwise
*/
- public SoneImpl(Identity identity, boolean local) {
+ public SoneImpl(Database database, Identity identity, boolean local) {
+ this.database = database;
this.id = identity.getId();
this.identity = identity;
this.local = local;
*
* @return The identity of this Sone
*/
+ @Nonnull
public String getId() {
return id;
}
*
* @return The identity of this Sone
*/
+ @Nonnull
public Identity getIdentity() {
return identity;
}
*
* @return The name of this Sone
*/
+ @Nonnull
public String getName() {
return (identity != null) ? identity.getNickname() : null;
}
*
* @return The request URI of this Sone
*/
+ @Nonnull
public FreenetURI getRequestUri() {
try {
return new FreenetURI(getIdentity().getRequestUri())
*
* @return The insert URI of this Sone
*/
+ @Nullable
public FreenetURI getInsertUri() {
if (!isLocal()) {
return null;
* The time of the update (in milliseconds since Jan 1, 1970 UTC)
* @return This Sone (for method chaining)
*/
+ @Nonnull
public Sone setTime(long time) {
this.time = time;
return this;
*
* @return The status of this Sone
*/
+ @Nonnull
public SoneStatus getStatus() {
return status;
}
* @throws IllegalArgumentException
* if {@code status} is {@code null}
*/
- public Sone setStatus(SoneStatus status) {
+ @Nonnull
+ public Sone setStatus(@Nonnull SoneStatus status) {
this.status = checkNotNull(status, "status must not be null");
return this;
}
*
* @return A copy of the profile
*/
+ @Nonnull
public Profile getProfile() {
return new Profile(profile);
}
* @param profile
* The profile to set
*/
- public void setProfile(Profile profile) {
+ public void setProfile(@Nonnull Profile profile) {
this.profile = new Profile(profile);
}
*
* @return The client used by this Sone, or {@code null}
*/
+ @Nullable
public Client getClient() {
return client;
}
* The client used by this Sone, or {@code null}
* @return This Sone (for method chaining)
*/
- public Sone setClient(Client client) {
+ @Nonnull
+ public Sone setClient(@Nullable Client client) {
this.client = client;
return this;
}
* {@code true} if this Sone is known, {@code false} otherwise
* @return This Sone
*/
+ @Nonnull
public Sone setKnown(boolean known) {
this.known = known;
return this;
*
* @return The friend Sones of this Sone
*/
- public List<String> getFriends() {
- return new ArrayList<String>(friendSones);
+ @Nonnull
+ public Collection<String> getFriends() {
+ return database.getFriends(this);
}
/**
* @return {@code true} if this Sone has the given Sone as a friend, {@code
* false} otherwise
*/
- public boolean hasFriend(String friendSoneId) {
- return friendSones.contains(friendSoneId);
- }
-
- /**
- * Adds the given Sone as a friend Sone.
- *
- * @param friendSone
- * The friend Sone to add
- * @return This Sone (for method chaining)
- */
- public Sone addFriend(String friendSone) {
- if (!friendSone.equals(id)) {
- friendSones.add(friendSone);
- }
- return this;
- }
-
- /**
- * Removes the given Sone as a friend Sone.
- *
- * @param friendSoneId
- * The ID of the friend Sone to remove
- * @return This Sone (for method chaining)
- */
- public Sone removeFriend(String friendSoneId) {
- friendSones.remove(friendSoneId);
- return this;
+ public boolean hasFriend(@Nonnull String friendSoneId) {
+ return database.isFriend(this, friendSoneId);
}
/**
*
* @return All posts of this Sone
*/
+ @Nonnull
public List<Post> getPosts() {
List<Post> sortedPosts;
synchronized (this) {
sortedPosts = new ArrayList<Post>(posts);
}
- Collections.sort(sortedPosts, Post.TIME_COMPARATOR);
+ Collections.sort(sortedPosts, Post.NEWEST_FIRST);
return sortedPosts;
}
* The new (and only) posts of this Sone
* @return This Sone (for method chaining)
*/
- public Sone setPosts(Collection<Post> posts) {
+ @Nonnull
+ public Sone setPosts(@Nonnull Collection<Post> posts) {
synchronized (this) {
this.posts.clear();
this.posts.addAll(posts);
* @param post
* The post to add
*/
- public void addPost(Post post) {
+ public void addPost(@Nonnull Post post) {
if (post.getSone().equals(this) && posts.add(post)) {
logger.log(Level.FINEST, String.format("Adding %s to “%s”.", post, getName()));
}
* @param post
* The post to remove
*/
- public void removePost(Post post) {
+ public void removePost(@Nonnull Post post) {
if (post.getSone().equals(this)) {
posts.remove(post);
}
*
* @return All replies this Sone made
*/
+ @Nonnull
public Set<PostReply> getReplies() {
return Collections.unmodifiableSet(replies);
}
* The new (and only) replies of this Sone
* @return This Sone (for method chaining)
*/
- public Sone setReplies(Collection<PostReply> replies) {
+ @Nonnull
+ public Sone setReplies(@Nonnull Collection<PostReply> replies) {
this.replies.clear();
this.replies.addAll(replies);
return this;
* @param reply
* The reply to add
*/
- public void addReply(PostReply reply) {
+ public void addReply(@Nonnull PostReply reply) {
if (reply.getSone().equals(this)) {
replies.add(reply);
}
* @param reply
* The reply to remove
*/
- public void removeReply(PostReply reply) {
+ public void removeReply(@Nonnull PostReply reply) {
if (reply.getSone().equals(this)) {
replies.remove(reply);
}
*
* @return All liked posts’ IDs
*/
+ @Nonnull
public Set<String> getLikedPostIds() {
return Collections.unmodifiableSet(likedPostIds);
}
* All liked posts’ IDs
* @return This Sone (for method chaining)
*/
- public Sone setLikePostIds(Set<String> likedPostIds) {
+ @Nonnull
+ public Sone setLikePostIds(@Nonnull Set<String> likedPostIds) {
this.likedPostIds.clear();
this.likedPostIds.addAll(likedPostIds);
return this;
* @return {@code true} if this Sone likes the given post, {@code false}
* otherwise
*/
- public boolean isLikedPostId(String postId) {
+ public boolean isLikedPostId(@Nonnull String postId) {
return likedPostIds.contains(postId);
}
* The ID of the post
* @return This Sone (for method chaining)
*/
- public Sone addLikedPostId(String postId) {
+ @Nonnull
+ public Sone addLikedPostId(@Nonnull String postId) {
likedPostIds.add(postId);
return this;
}
* The ID of the post
* @return This Sone (for method chaining)
*/
- public Sone removeLikedPostId(String postId) {
+ @Nonnull
+ public Sone removeLikedPostId(@Nonnull String postId) {
likedPostIds.remove(postId);
return this;
}
*
* @return All liked replies’ IDs
*/
+ @Nonnull
public Set<String> getLikedReplyIds() {
return Collections.unmodifiableSet(likedReplyIds);
}
* All liked replies’ IDs
* @return This Sone (for method chaining)
*/
- public Sone setLikeReplyIds(Set<String> likedReplyIds) {
+ @Nonnull
+ public Sone setLikeReplyIds(@Nonnull Set<String> likedReplyIds) {
this.likedReplyIds.clear();
this.likedReplyIds.addAll(likedReplyIds);
return this;
* @return {@code true} if this Sone likes the given reply, {@code false}
* otherwise
*/
- public boolean isLikedReplyId(String replyId) {
+ public boolean isLikedReplyId(@Nonnull String replyId) {
return likedReplyIds.contains(replyId);
}
* The ID of the reply
* @return This Sone (for method chaining)
*/
- public Sone addLikedReplyId(String replyId) {
+ @Nonnull
+ public Sone addLikedReplyId(@Nonnull String replyId) {
likedReplyIds.add(replyId);
return this;
}
* The ID of the reply
* @return This Sone (for method chaining)
*/
- public Sone removeLikedReplyId(String replyId) {
+ @Nonnull
+ public Sone removeLikedReplyId(@Nonnull String replyId) {
likedReplyIds.remove(replyId);
return this;
}
*
* @return The root album of this Sone
*/
+ @Nonnull
public Album getRootAlbum() {
return rootAlbum;
}
*
* @return The options of this Sone
*/
+ @Nonnull
public SoneOptions getOptions() {
return options;
}
* The options of this Sone
*/
/* TODO - remove this method again, maybe add an option provider */
- public void setOptions(SoneOptions options) {
+ public void setOptions(@Nonnull SoneOptions options) {
this.options = options;
}
/** {@inheritDoc} */
@Override
public String toString() {
- return getClass().getName() + "[identity=" + identity + ",friends(" + friendSones.size() + "),posts(" + posts.size() + "),replies(" + replies.size() + "),albums(" + getRootAlbum().getAlbums().size() + ")]";
+ return getClass().getName() + "[identity=" + identity + ",posts(" + posts.size() + "),replies(" + replies.size() + "),albums(" + getRootAlbum().getAlbums().size() + ")]";
}
}