/*
* 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.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.Lob;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
import javax.persistence.Transient;
import org.apache.solr.common.SolrInputDocument;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import org.emonocot.model.constants.MediaType;
import org.emonocot.model.marshall.json.TaxonDeserializer;
import org.emonocot.model.marshall.json.TaxonSerializer;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.Where;
/**
*
* @author ben
*
*/
@Entity
public class IdentificationKey extends Multimedia {
private static final long serialVersionUID = 7893868318442314512L;
private Long id;
private Set<Taxon> taxa = new HashSet<Taxon>();
private Set<Annotation> annotations = new HashSet<Annotation>();
private String matrix;
private List<Comment> comments = new ArrayList<Comment>();
@Id
@GeneratedValue(generator = "table-hilo", strategy = GenerationType.TABLE)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "Taxon_IdentificationKey", joinColumns = {@JoinColumn(name = "keys_id")}, inverseJoinColumns = {@JoinColumn(name = "Taxon_id")})
@Cascade({ CascadeType.SAVE_UPDATE, CascadeType.MERGE })
@JsonSerialize(contentUsing = TaxonSerializer.class)
public Set<Taxon> getTaxa() {
return taxa;
}
/**
* @param taxon the taxon to set
*/
@JsonDeserialize(contentUsing = TaxonDeserializer.class)
public void setTaxa(Set<Taxon> taxa) {
this.taxa = taxa;
}
/**
*
* @param matrix Set the matrix
*/
public void setMatrix(String matrix) {
this.matrix = matrix;
}
/**
*
* @return the matrix
*/
@Lob
public String getMatrix() {
return matrix;
}
@OneToMany(fetch = FetchType.LAZY, orphanRemoval = true)
@JoinColumn(name = "annotatedObjId")
@Where(clause = "annotatedObjType = 'IdentificationKey'")
@Cascade({ CascadeType.SAVE_UPDATE, CascadeType.MERGE, CascadeType.DELETE })
@JsonIgnore
public Set<Annotation> getAnnotations() {
return annotations;
}
/**
* @param annotations
* the annotations to set
*/
public void setAnnotations(Set<Annotation> annotations) {
this.annotations = annotations;
}
/**
* @return the comments
*/
@OneToMany(fetch = FetchType.LAZY, orphanRemoval = true)
@JoinColumn(name = "commentPage_id")
@OrderBy("created DESC")
@Where(clause = "commentPage_type = 'IdentificationKey'")
@Cascade({ CascadeType.SAVE_UPDATE, CascadeType.MERGE, CascadeType.DELETE })
@JsonIgnore
public List<Comment> getComments() {
return comments;
}
/**
* @param comments the comments to set
*/
@JsonIgnore
public void setComments(List<Comment> comments) {
this.comments = comments;
}
@Override
@Transient
public MediaType getType() {
return MediaType.Dataset;
}
@Override
public SolrInputDocument toSolrInputDocument() {
SolrInputDocument sid = super.toSolrInputDocument();
StringBuilder summary = new StringBuilder().append(getTitle()).append(" ")
.append(getCreator()).append(" ").append(getDescription());
if(getTaxa() != null) {
boolean first = true;
for(Taxon t : getTaxa()) {
if(first) {
addField(sid,"taxon.order_s", t.getOrder());
addField(sid,"taxon.subgenus_s", t.getSubgenus());
}
addField(sid,"taxon.family_ss", t.getFamily());
addField(sid,"taxon.genus_ss", t.getGenus());
addField(sid,"taxon.subfamily_ss", t.getSubfamily());
addField(sid,"taxon.subtribe_ss", t.getSubtribe());
addField(sid,"taxon.tribe_ss", t.getTribe());
summary.append(" ").append(t.getClazz())
.append(" ").append(t.getFamily())
.append(" ").append(t.getGenus())
.append(" ").append(t.getKingdom())
.append(" ").append(t.getOrder())
.append(" ").append(t.getPhylum())
.append(" ").append(t.getSubfamily())
.append(" ").append(t.getSubgenus())
.append(" ").append(t.getSubtribe())
.append(" ").append(t.getTribe());
first = false;
}
}
sid.addField("searchable.solrsummary_t", summary.toString());
return sid;
}
}