/*
* This is eMonocot, a global online biodiversity information resource.
*
* Copyright © 2011–2015 The Board of Trustees of the Royal Botanic Gardens, Kew and The University of Oxford
*
* eMonocot 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.
*
* eMonocot 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.
*
* The complete text of the GNU Affero General Public License is in the source repository as the file
* ‘COPYING’. It is also available from <http://www.gnu.org/licenses/>.
*/
package org.emonocot.model;
import java.util.HashMap;
import java.util.Map;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.Transient;
import org.apache.solr.common.SolrInputDocument;
import org.emonocot.model.auth.User;
import org.emonocot.model.marshall.json.AnnotatableObjectDeserializer;
import org.emonocot.model.marshall.json.AnnotatableObjectSerializer;
import org.emonocot.model.marshall.json.DateTimeDeserializer;
import org.emonocot.model.marshall.json.DateTimeSerializer;
import org.emonocot.model.marshall.json.OrganisationDeserialiser;
import org.emonocot.model.marshall.json.OrganisationSerializer;
import org.emonocot.model.marshall.json.UserDeserializer;
import org.emonocot.model.marshall.json.UserSerializer;
import org.emonocot.model.registry.Organisation;
import org.hibernate.annotations.Any;
import org.hibernate.annotations.Type;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
/**
* @author jk00kg
* A comment provided by a portal {@link User} about some item of Data
*/
@Entity
public class Comment extends Base implements Searchable {
private static DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss'Z'");
/**
*
*/
private static final long serialVersionUID = -5773904824251895404L;
private Long id;
private String comment;
private String subject;
/**
* The object which this comment is about
*/
private Base aboutData;
private DateTime created;
private Status status;
private User user;
/**
* If this comment is a response to another comment, the immediate parent comment
*/
private Comment inResponseTo;
/**
* The object (page) on which this comment should appear
*/
private Base commentPage;
private Organisation authority;
private Map<String,String> alternativeIdentifiers = new HashMap<String,String>();
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
/**
*
* @return the primary authority
*/
@ManyToOne(fetch = FetchType.LAZY)
@JsonSerialize(using = OrganisationSerializer.class)
public Organisation getAuthority() {
return authority;
}
/**
*
* @param authority Set the authority
*/
@JsonDeserialize(using = OrganisationDeserialiser.class)
public void setAuthority(Organisation authority) {
this.authority = authority;
}
/**
* @return the inResponseTo
*/
@ManyToOne(fetch = FetchType.LAZY)
@JsonIgnore
public Comment getInResponseTo() {
return inResponseTo;
}
/**
* @param inResponseTo the inResponseTo to set
*/
@JsonIgnore
public void setInResponseTo(Comment inResponseTo) {
this.inResponseTo = inResponseTo;
}
/**
* @return the commentPage
*/
@Any(metaColumn = @Column(name = "commentPage_type"),
fetch = FetchType.LAZY, metaDef = "CommentMetaDef")
@JoinColumn(name = "commentPage_id", nullable = true)
@JsonSerialize(using = AnnotatableObjectSerializer.class)
public Base getCommentPage() {
return commentPage;
}
/**
* @param commentPage the commentPage to set
*/
@JsonDeserialize(using = AnnotatableObjectDeserializer.class)
public void setCommentPage(Base commentPage) {
this.commentPage = commentPage;
}
/* (non-Javadoc)
* @see org.emonocot.model.Identifiable#getIdentifier()
*/
@Override
public String getIdentifier() {
return identifier;
}
/* (non-Javadoc)
* @see org.emonocot.model.Identifiable#setIdentifier(java.lang.String)
*/
@Override
public void setIdentifier(String identifier) {
this.identifier = identifier;
}
/**
* @return the id
*/
@Id
@GeneratedValue(generator = "table-hilo", strategy = GenerationType.TABLE)
public Long getId() {
return id;
}
/**
* @param id
*/
public void setId(Long id) {
this.id = id;
}
/**
* @return the comment
*/
@Lob
public String getComment() {
return comment;
}
/**
* @param comment the comment to set
*/
public void setComment(String comment) {
this.comment = comment;
}
/**
* @return the aboutData
*/
@Any(metaColumn = @Column(name = "aboutData_type"),
fetch = FetchType.LAZY, metaDef = "CommentMetaDef")
@JoinColumn(name = "aboutData_id", nullable = true)
@JsonSerialize(using = AnnotatableObjectSerializer.class)
public Base getAboutData() {
return aboutData;
}
/**
* @param aboutData the aboutData to set
*/
@JsonDeserialize(using = AnnotatableObjectDeserializer.class)
public void setAboutData(Base aboutData) {
this.aboutData = aboutData;
}
/**
*
* @return Get the time this object was created.
*/
@Type(type="dateTimeUserType")
@JsonSerialize(using = DateTimeSerializer.class)
public DateTime getCreated() {
return created;
}
/**
*
* @param created
* Set the created time for this object.
*/
@JsonDeserialize(using = DateTimeDeserializer.class)
public void setCreated(DateTime created) {
this.created = created;
}
/**
* @return the status
*/
@Enumerated(EnumType.STRING)
public Status getStatus() {
return status;
}
/**
* @param status the status to set
*/
public void setStatus(Status status) {
this.status = status;
}
/**
* @return the user
*/
@ManyToOne
@JoinColumn(name = "user_id")
@JsonSerialize(using = UserSerializer.class)
public User getUser() {
return user;
}
/**
* @param user the user to set
*/
@JsonDeserialize(using = UserDeserializer.class)
public void setUser(User user) {
this.user = user;
}
@ElementCollection
public Map<String,String> getAlternativeIdentifiers() {
return alternativeIdentifiers;
}
public void setAlternativeIdentifiers(Map<String,String> alternativeIdentifiers) {
this.alternativeIdentifiers = alternativeIdentifiers;
}
/**
* @author jk00kg
* The sending status of a comment
*/
public enum Status {
PENDING,
REFUSED,
SENT;
}
@Transient
@JsonIgnore
public String getClassName() {
return "Comment";
}
@Override
@Transient
@JsonIgnore
public String getDocumentId() {
return getClassName() + "_" + getId();
}
@Override
public SolrInputDocument toSolrInputDocument() {
SolrInputDocument sid = new SolrInputDocument();
sid.addField("id", getClassName() + "_" + getId());
sid.addField("base.id_l", getId());
sid.addField("base.class_searchable_b", false);
sid.addField("base.class_s", getClass().getName());
if(getAboutData() != null) {
sid.addField("comment.about_class_s",getAboutData().getClass().getName());
}
StringBuilder summary = new StringBuilder().append(getComment());
if(getCommentPage() != null) {
if(getCommentPage() instanceof Taxon) {
sid.addField("comment.comment_page_class_s","org.emonocot.model.Taxon");
Taxon taxon = (Taxon)getCommentPage();
summary.append(" ").append(" ").append(taxon.getClazz()).append(" ").append(taxon.getFamily()).append(" ")
.append(taxon.getGenus()).append(" ").append(taxon.getKingdom()).append(" ").append(taxon.getOrder()).append(" ")
.append(taxon.getPhylum()).append(" ").append(taxon.getScientificName()).append(" ")
.append(taxon.getScientificNameAuthorship()).append(" ").append(taxon.getSpecificEpithet()).append(" ")
.append(taxon.getSubfamily()).append(" ").append(taxon.getSubgenus()).append(" ")
.append(taxon.getSubtribe()).append(" ").append(taxon.getTaxonomicStatus()).append(" ")
.append(taxon.getTribe());
sid.addField("taxon.family_ss", taxon.getFamily());
} else if(getCommentPage() instanceof IdentificationKey) {
sid.addField("comment.comment_page_class_s","org.emonocot.model.IdentificationKey");
IdentificationKey identificationKey = (IdentificationKey)getCommentPage();
summary.append(" ").append(identificationKey.getTitle());
} else if(getCommentPage() instanceof Image) {
Image image = (Image)getCommentPage();
summary.append(" ").append(image.getTitle());
sid.addField("comment.comment_page_class_s","org.emonocot.model.Image");
}
}
//sid.addField("comment.comment_t",getComment());
sid.addField("comment.created_dt",dateTimeFormatter.print(getCreated()));
sid.addField("comment.status_t",getStatus());
sid.addField("comment.subject_s",getSubject());
sid.addField("searchable.solrsummary_t", summary.toString());
return sid;
}
}