+ /**
+ * Sets the text of this post.
+ *
+ * @param text
+ * The text of this post
+ * @return This post (for method chaining)
+ */
+ public Post setText(String text) {
+ this.text = text;
+ return this;
+ }
+
+ /**
+ * Returns all replies to this post in unspecified order.
+ *
+ * @return All replies to this post
+ */
+ public List<Reply> getReplies() {
+ List<Reply> sortedReplies = new ArrayList<Reply>(replies);
+ Collections.sort(sortedReplies, new Comparator<Reply>() {
+
+ @Override
+ public int compare(Reply leftReply, Reply rightReply) {
+ return (int) Math.max(Integer.MIN_VALUE, Math.min(Integer.MAX_VALUE, leftReply.getTime() - rightReply.getTime()));
+ }
+
+ });
+ return sortedReplies;
+ }
+
+ /**
+ * Adds a reply to this post. The reply will not be added if its
+ * {@link Reply#getPost() post} is not equal to this post.
+ *
+ * @param reply
+ * The reply to add
+ */
+ public void addReply(Reply reply) {
+ if (reply.getPost().equals(this)) {
+ replies.add(reply);
+ }
+ }
+
+ /**
+ * Removes a reply from this post.
+ *
+ * @param reply
+ * The reply to remove
+ */
+ public void removeReply(Reply reply) {
+ if (reply.getPost().equals(this)) {
+ replies.remove(reply);
+ }
+ }
+
+ //
+ // OBJECT METHODS
+ //
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public int hashCode() {
+ return id.hashCode() ^ sone.hashCode() ^ (int) (time >> 32) ^ (int) (time & 0xffffffff) ^ text.hashCode();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean equals(Object object) {
+ if (!(object instanceof Post)) {
+ return false;
+ }
+ Post post = (Post) object;
+ return post.id.equals(id) && post.sone.equals(sone) && (post.time == time) && post.text.equals(text);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public String toString() {
+ return getClass().getName() + "[id=" + id + ",sone=" + sone + ",time=" + time + ",text=" + text + ",replies(" + replies.size() + ")]";
+ }
+