/* * Copyright (C) 2008-2020, Juick * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.juick.model; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.juick.util.adapters.SimpleDateAdapter; import jakarta.xml.bind.annotation.XmlAccessorType; import jakarta.xml.bind.annotation.XmlAttribute; import jakarta.xml.bind.annotation.XmlElement; import jakarta.xml.bind.annotation.XmlRootElement; import jakarta.xml.bind.annotation.XmlTransient; import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import org.apache.commons.lang3.builder.ToStringBuilder; import javax.annotation.Nonnull; import java.io.Serializable; import java.net.URI; import java.time.Instant; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Objects; import java.util.Set; /** * @author Ugnich Anton */ @XmlRootElement(name = "juick", namespace = "http://juick.com/message") @XmlAccessorType() public class Message implements Comparable<Message>, Serializable { private int mid = 0; private int rid = 0; private int replyto = 0; private String text = null; private User user = null; private Set<Tag> tags; private Instant created; private Instant updated; private Instant updatedAt; private boolean unread; @JsonIgnore private int privacy = 1; @XmlTransient @JsonIgnore public boolean FriendsOnly = false; @XmlTransient @JsonIgnore public boolean ReadOnly = false; @XmlTransient @JsonIgnore public boolean Hidden = false; @JsonIgnore @XmlTransient public boolean VisitorCanComment = true; private int replies = 0; private String repliesBy; private String attachmentType; @XmlTransient private Photo photo; @XmlTransient private Attachment attachment; private User to; private String replyQuote; @XmlTransient private Set<Reaction> reactions; private boolean service; private URI replyUri; private URI replyToUri; private boolean html; private Set<User> recommendations; private List<Entity> entities; public Message() { tags = new LinkedHashSet<>(); reactions = new HashSet<>(); recommendations = new HashSet<>(); } @Override public String toString() { return new ToStringBuilder(this) .append("mid", mid) .append("rid", rid) .append("replyto", replyto) .append("privacy", privacy) .append("FriendsOnly", FriendsOnly) .append("ReadOnly", ReadOnly) .append("Hidden", Hidden) .append("VisitorCanComment", VisitorCanComment) .append("replies", replies) .append("likes", getLikes()) .append("reactions", reactions) .toString(); } @Override public boolean equals(Object obj) { if (obj == this) return true; if (!(obj instanceof Message)) return false; Message jmsg = (Message) obj; return (this.getMid() == jmsg.getMid() && this.getRid() == jmsg.getRid()); } @Override public int compareTo(Message jmsg) throws ClassCastException { if (jmsg == this) return 0; int cmp = Integer.compare(jmsg.getMid(), getMid()); if (cmp == 0) cmp = Integer.compare(getRid(), jmsg.getRid()); return cmp; } @JsonProperty("mid") @XmlAttribute(name = "mid") public int getMid() { return mid; } public void setMid(int mid) { this.mid = mid; } @JsonProperty("rid") @XmlAttribute(name = "rid") public int getRid() { return rid; } public void setRid(int rid) { this.rid = rid; } @XmlElement(name = "user", namespace = "http://juick.com/user") public User getUser() { return user; } public void setUser(User user) { this.user = user; } @JsonProperty("body") @XmlElement(name = "body") public String getText() { return text; } public void setText(String text) { this.text = text; } @JsonProperty("timestamp") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "UTC") @XmlAttribute(name = "ts") @XmlJavaTypeAdapter(SimpleDateAdapter.class) public Instant getCreated() { return created; } public void setCreated(Instant timestamp) { this.created = timestamp; } @XmlTransient public User getTo() { return to; } public void setTo(User to) { this.to = to; } @XmlAttribute(name = "quote") public String getReplyQuote() { return replyQuote; } public void setReplyQuote(String quote) { replyQuote = quote; } @JsonProperty("replyto") @XmlAttribute(name = "replyto") public int getReplyto() { return replyto; } public void setReplyto(int replyto) { this.replyto = replyto; } @JsonProperty("tags") @XmlElement(name = "tag") public Set<Tag> getTags() { return tags; } public void setTags(Set<Tag> tags) { this.tags = tags; } @XmlAttribute public int getPrivacy() { return privacy; } public void setPrivacy(int privacy) { this.privacy = privacy; } public Photo getPhoto() { return photo; } public void setPhoto(Photo photo) { this.photo = photo; } @XmlAttribute(name = "attach") @JsonProperty("attach") public String getAttachmentType() { return attachmentType; } public void setAttachmentType(String attachmentType) { this.attachmentType = attachmentType; } @XmlTransient public int getReplies() { return replies; } public void setReplies(int replies) { this.replies = replies; } @XmlTransient @Deprecated public int getLikes() { return recommendations.size(); } @JsonProperty("repliesby") public String getRepliesBy() { return repliesBy; } public void setRepliesBy(String repliesBy) { this.repliesBy = repliesBy; } public Attachment getAttachment() { return attachment; } public void setAttachment(Attachment attachment) { this.attachment = attachment; } /** * @return timestamp of the last comment */ @XmlTransient public Instant getUpdated() { return updated; } public void setUpdated(Instant updated) { this.updated = updated; } @XmlTransient public boolean isUnread() { return unread; } public void setUnread(boolean unread) { this.unread = unread; } @XmlTransient public Set<Reaction> getReactions() { return reactions; } public void setReactions(Set<Reaction> reactions) { this.reactions = reactions; } @Override public int hashCode() { return Objects.hash(mid, rid); } public boolean isService() { return service; } public void setService(boolean service) { this.service = service; } public Set<User> getRecommendations() { return recommendations; } public void setRecommendations(Set<User> recommendations) { this.recommendations = recommendations; } /** * @return timestamp of the last edit */ @XmlTransient @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "UTC") @JsonProperty("updated_at") public Instant getUpdatedAt() { return updatedAt; } public void setUpdatedAt(Instant updatedAt) { this.updatedAt = updatedAt; } public URI getReplyUri() { return replyUri; } public void setReplyUri(URI replyUri) { this.replyUri = replyUri; } @XmlAttribute(name = "html") public boolean isHtml() { return html; } public void setHtml(boolean html) { this.html = html; } @XmlTransient public URI getReplyToUri() { return replyToUri; } public void setReplyToUri(URI replyToUri) { this.replyToUri = replyToUri; } public List<Entity> getEntities() { return entities; } public void setEntities(List<Entity> entities) { this.entities = entities; } }