/* * Copyright (C) 2008-2017, 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 . */ package com.juick; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.juick.xml.adapters.SimpleDateAdapter; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.builder.ToStringBuilder; import javax.xml.bind.annotation.*; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import java.time.Instant; import java.util.*; /** * @author Ugnich Anton */ @XmlRootElement(name = "juick", namespace = "http://juick.com/message") @XmlAccessorType() public class Message implements Comparable { private int mid = 0; private int rid = 0; private int replyto = 0; private String text = null; private User user = null; private final List tags; private Instant ts; @XmlTransient @JsonIgnore public int TimeAgo = 0; @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; public String Video = null; public Place Place = null; private int likes; public final List childs; private PM PM; private Recommendation Recommendation; private String replyQuote; public Message() { tags = new ArrayList<>(); childs = new ArrayList<>(); } public void parseTags(String strTags) { if (StringUtils.isNotEmpty(strTags)) { Set tagSet = new TreeSet<>(tags); for (String str : strTags.split(" ")) { Tag tag = new Tag(str); if (!tagSet.contains(tag)) { tags.add(tag); tagSet.add(tag); } } } } @Override public String toString() { return new ToStringBuilder(this) .append("mid", mid) .append("rid", rid) .append("replyto", replyto) .append("TimeAgo", TimeAgo) .append("privacy", privacy) .append("FriendsOnly", FriendsOnly) .append("ReadOnly", ReadOnly) .append("Hidden", Hidden) .append("VisitorCanComment", VisitorCanComment) .append("replies", replies) .append("likes", likes) .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(Object obj) throws ClassCastException { if (obj == this) return 0; if (!(obj instanceof Message)) throw new ClassCastException(); Message jmsg = (Message) obj; int cmp = Integer.compare(jmsg.getMid(), getMid()); if (cmp == 0) cmp = Integer.compare(getRid(), jmsg.getRid()); return cmp; } @JsonIgnore public int getChildsCount() { int cnt = childs.size(); for (Message child : childs) { cnt += child.getChildsCount(); } return cnt; } public void cleanupChilds() { if (!childs.isEmpty()) { for (Message child : childs) { child.cleanupChilds(); } childs.clear(); } } @JsonIgnore public String getTagsString() { StringBuilder builder = new StringBuilder(); if (!tags.isEmpty()) { for (Tag Tag : tags) builder.append(" *").append(Tag.getName()); if (FriendsOnly) builder.append(" *friends"); if (privacy == -2) builder.append(" *private"); else if (privacy == -1) builder.append(" *friends"); else if (privacy == 2) builder.append(" *public"); if (ReadOnly) builder.append(" *readonly"); } return builder.toString(); } @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 com.juick.User getUser() { return user; } public void setUser(com.juick.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 getTimestamp() { return ts; } public void setTimestamp(Instant timestamp) { this.ts = timestamp; } public com.juick.PM getPM() { return PM; } public void setPM(com.juick.PM PM) { this.PM = PM; } public Recommendation getRecommendation() { return Recommendation; } public void setRecommendation(Recommendation recommendation) { this.Recommendation = recommendation; } @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 List getTags() { return tags; } public void setTags(List tags) { this.tags.clear(); if (CollectionUtils.isNotEmpty(tags)) this.tags.addAll(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 public int getLikes() { return likes; } public void setLikes(int likes) { this.likes = likes; } @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; } }