/* * Juick * Copyright (C) 2008-2011, Ugnich Anton * * 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.lang3.StringUtils; import javax.xml.bind.annotation.*; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import java.util.*; import java.util.stream.Collectors; /** * * @author Ugnich Anton */ @XmlRootElement(name = "juick", namespace = "http://juick.com/message") @XmlAccessorType(XmlAccessType.PUBLIC_MEMBER) 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 List Tags = new ArrayList<>(); private Date date; @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; public String Video = null; public Place Place = null; private int likes; public List childs = new ArrayList<>(); private PM PM; private Recommendation Recommendation; private String replyQuote; public Message() { } public Message(Message msg) { setMid(msg.getMid()); setRid(msg.getRid()); replyto = msg.replyto; setText(msg.getText()); setUser(msg.getUser()); Tags = msg.Tags; setDate(msg.getDate()); TimeAgo = msg.TimeAgo; privacy = msg.privacy; FriendsOnly = msg.FriendsOnly; ReadOnly = msg.ReadOnly; Hidden = msg.Hidden; setReplies(msg.getReplies()); attachmentType = msg.attachmentType; photo = msg.photo; Video = msg.Video; Place = msg.Place; setLikes(msg.getLikes()); childs = msg.childs; PM = msg.PM; Recommendation = msg.Recommendation; } public void parseTags(String strTags) { if (strTags != null) { List tags = Arrays.asList(strTags.split(" ")); Tags.addAll(tags.stream().map(Tag::new).collect(Collectors.toList())); } } @Override public boolean equals(Object obj) { 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 instanceof Message)) { throw new ClassCastException(); } Message jmsg = (Message) obj; if (this.getMid() != jmsg.getMid()) { if (this.getMid() > jmsg.getMid()) { return -1; } else { return 1; } } if (this.getRid() != jmsg.getRid()) { if (this.getRid() < jmsg.getRid()) { return -1; } else { return 1; } } return 0; } @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 getAttachmentURL() { if (attachmentType != null) { String url = "http://i.juick.com/"; url += attachmentType.equals("mp4") ? "video" : "photos-1024"; url += "/" + getMid(); if (getRid() > 0) { url += "-" + getRid(); } url += "." + attachmentType; return url; } else { return null; } } @JsonIgnore public String getTagsString() { String ret = ""; if (!Tags.isEmpty()) { for (Tag Tag : Tags) { ret += " *" + Tag.getName(); } if (FriendsOnly) { ret += " *friends"; } if (privacy == -2) { ret += " *private"; } if (privacy == -1) { ret += " *friends"; } if (privacy == 2) { ret += " *public"; } if (ReadOnly) { ret += " *readonly"; } } return ret; } @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 Date getDate() { return date; } public void setDate(Date date) { this.date = date; } 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) { 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 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; } @JsonProperty("photo") @XmlTransient public Photo getPhotoURLs() { if (StringUtils.isNotBlank(attachmentType)) { Photo photo = new Photo(); if (rid > 0) { photo.setSmall(String.format("https://i.juick.com/photos-512/%d-%d.%s", mid, rid, attachmentType)); photo.setMedium(String.format("https://i.juick.com/photos-1024/%d-%d.%s", mid, rid, attachmentType)); photo.setThumbnail(String.format("https://i.juick.com/ps/%d-%d.%s", mid, rid, attachmentType)); } else { photo.setSmall(String.format("https://i.juick.com/photos-512/%d.%s", mid, attachmentType)); photo.setMedium(String.format("https://i.juick.com/photos-1024/%d.%s", mid, attachmentType)); photo.setThumbnail(String.format("https://i.juick.com/ps/%d.%s", mid, attachmentType)); } return photo; } return null; } }