/** * Yona, 21st Century Project Hosting SW *
* Copyright Yona & Yobi Authors & NAVER Corp. & NAVER LABS Corp.
* https://yona.io
**/
package models;
import com.avaje.ebean.annotation.Transactional;
import models.resource.Resource;
import models.resource.ResourceConvertible;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.joda.time.Duration;
import play.data.validation.Constraints;
import play.db.ebean.Model;
import utils.JodaDateUtil;
import javax.annotation.Nonnull;
import javax.persistence.*;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
@MappedSuperclass
abstract public class Comment extends Model implements TimelineItem, ResourceConvertible {
private static final long serialVersionUID = 1L;
@Id
public Long id;
@Lob @Constraints.Required
public String contents;
@Constraints.Required
public Date createdDate;
public Long authorId;
public String authorLoginId;
public String authorName;
public Long projectId;
@Transient
public String parentCommentId;
@Transient
public String previousContents;
public Comment() {
createdDate = new Date();
}
public Comment(User author, String contents) {
this();
setAuthor(author);
this.contents = contents;
}
public Duration ago() {
return JodaDateUtil.ago(this.createdDate);
}
@Override
abstract public Resource asResource();
abstract public AbstractPosting getParent();
@Transient
public void setAuthor(User user) {
authorId = user.id;
authorLoginId = user.loginId;
authorName = user.name;
}
@Transactional
public void save() {
super.save();
updateMention();
getParent().update();
}
@Transactional
public void update() {
super.update();
updateMention();
}
protected void updateMention() {
Mention.update(this.asResource(), NotificationEvent.getMentionedUsers(this.contents));
}
public void delete() {
Attachment.deleteAll(asResource());
NotificationEvent.deleteBy(this.asResource());
super.delete();
getParent().update();
}
public static Comparator