/*
* 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;
}
@XmlTransient
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;
}
}