package org.nextprot.api.core.domain;
import com.google.common.base.Preconditions;
import org.jsondoc.core.annotation.ApiObject;
import org.jsondoc.core.annotation.ApiObjectField;
import org.nextprot.api.commons.utils.DateFormatter;
import org.nextprot.api.core.domain.publication.*;
import java.io.Serializable;
import java.util.Collections;
import java.util.Date;
import java.util.Set;
import java.util.SortedSet;
@ApiObject(name = "publication", description = "A publication")
public class Publication implements Serializable{
private static final long serialVersionUID = 4404147147281845675L;
@ApiObjectField(description = "The neXtProt identifier of the publication")
private Long id;
@ApiObjectField(description = "The MD5 of the publication")
private String md5;
@ApiObjectField(description = "The title of the publication")
private String title;
@ApiObjectField(description = "The abstract text")
private String abstractText;
@ApiObjectField(description = "The type")
private String publicationType;
@ApiObjectField(description = "The publication date")
private Date publicationDate;
@ApiObjectField(description = "The publication date in text")
private String textDate;
@ApiObjectField(description = "The submission to db text (EMBL, PDB, ...")
private String submission;
@ApiObjectField(description = "Publications related to 15 entries or more")
private Boolean isLargeScale;
@ApiObjectField(description = "Curated Publications")
private Boolean isCurated;
// TODO: reassess the way we define 'curared/computed' and get rid of the 'limit 1' in publication-by-ressource.sql
// Refs cited in UniProt should be 'curated' even if not (yet) attached to a specific annotation
@ApiObjectField(description = "Computed Publications")
private Boolean isComputed;
@ApiObjectField(description = "The list of authors")
private SortedSet<PublicationAuthor> authors;
@ApiObjectField(description = "The associated cross references")
private Set<DbXref> dbXrefs;
private PublicationResourceLocator publicationResourceLocator;
public boolean isLocalizable() {
return publicationResourceLocator != null;
}
public boolean isLocatedInScientificJournal() {
return isLocalizable() && publicationResourceLocator instanceof JournalResourceLocator;
}
/**
* @return true if found in a edited volume book
*/
public boolean isLocatedInEditedVolumeBook() {
return isLocalizable() && publicationResourceLocator instanceof EditedVolumeBookResourceLocator;
}
/**
* @return true if found in a standard book (a journal or a edited volume book)
*/
public boolean isLocalizableInBookMedium() {
return isLocalizable() && publicationResourceLocator instanceof BookResourceLocator;
}
public Boolean getIsLargeScale() {
return isLargeScale;
}
public void setIsLargeScale(Boolean isLargeScale) {
this.isLargeScale = isLargeScale;
}
public Boolean getIsCurated() {
return isCurated;
}
public void setIsCurated(Boolean isCurated) {
this.isCurated = isCurated;
}
public Boolean getIsComputed() {
return isComputed;
}
public void setIsComputed(Boolean isComputed) {
this.isComputed = isComputed;
}
public long getPublicationId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getMD5() {
return md5;
}
public void setMD5(String md5) {
this.md5 = md5;
}
public boolean hasTitle() {
return title != null && !title.isEmpty();
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getSubmission() {
return submission;
}
public void setSubmission(String submission) {
this.submission = submission;
}
public String getAbstractText() {
return abstractText;
}
public void setAbstractText(String abstractText) {
this.abstractText = abstractText;
}
public boolean hasPublicationDate() {
return publicationDate != null;
}
public Date getPublicationDate() {
return publicationDate;
}
public String getPublicationYear() {
if (publicationDate == null)
return null;
return new DateFormatter().format(publicationDate, DateFormatter.YEAR_PRECISION);
}
public void setPublicationDate(Date publicationDate) {
this.publicationDate = publicationDate;
}
public String getVolume() {
if (isLocatedInScientificJournal())
return ((JournalResourceLocator) publicationResourceLocator).getVolume();
else
return "";
}
public String getIssue() {
if (isLocatedInScientificJournal())
return ((JournalResourceLocator) publicationResourceLocator).getIssue();
else
return "";
}
public String getFirstPage() {
if (isLocalizableInBookMedium())
return ((BookResourceLocator) publicationResourceLocator).getFirstPage();
else
return "";
}
public String getLastPage() {
if (isLocalizableInBookMedium())
return ((BookResourceLocator) publicationResourceLocator).getLastPage();
else
return "";
}
public String getPublisherName() {
if (isLocatedInEditedVolumeBook())
return ((EditedVolumeBookResourceLocator) publicationResourceLocator).getPublisher();
return "";
}
public String getPublisherCity() {
if (isLocatedInEditedVolumeBook())
return ((EditedVolumeBookResourceLocator) publicationResourceLocator).getCity();
return "";
}
public String getPublicationType() {
return publicationType;
}
public void setPublicationType(String publicationType) {
this.publicationType = publicationType;
}
public String getTextDate() {
return textDate;
}
public void setTextDate(String textDate) {
this.textDate = textDate;
}
public JournalResourceLocator getJournalResourceLocator() {
return isLocatedInScientificJournal() ? (JournalResourceLocator) publicationResourceLocator : null;
}
public PublicationResourceLocator getPublicationResourceLocator() {
return publicationResourceLocator;
}
public String getPublicationLocatorName() {
return isLocalizable() ? publicationResourceLocator.getName() : null;
}
public void setJournalResourceLocator(JournalResourceLocator journalLocation, String volume, String issue, String firstPage, String lastPage) {
Preconditions.checkNotNull(journalLocation);
journalLocation.setFirstPage(firstPage);
journalLocation.setLastPage(lastPage);
journalLocation.setVolume(volume);
journalLocation.setIssue(issue);
this.publicationResourceLocator = journalLocation;
}
public void setEditedVolumeBookLocation(String name, String publisher, String city, String firstPage, String lastPage) {
EditedVolumeBookResourceLocator book = new EditedVolumeBookResourceLocator();
book.setName(name);
book.setPublisher(publisher);
book.setCity(city);
book.setFirstPage(firstPage);
book.setLastPage(lastPage);
this.publicationResourceLocator = book;
}
public void setOnlineResourceLocation(String name, String url) {
WebPublicationPage webPage = new WebPublicationPage();
webPage.setName(name);
webPage.setUrl(url);
this.publicationResourceLocator = webPage;
}
public boolean hasAuthors() {
return authors != null && !authors.isEmpty();
}
public SortedSet<PublicationAuthor> getAuthors() {
return authors;
}
public void setAuthors(SortedSet<PublicationAuthor> authors) {
this.authors = authors;
}
public boolean hasEditors() {
return isLocatedInEditedVolumeBook() && ((EditedVolumeBookResourceLocator) publicationResourceLocator).hasEditors();
}
public Set<PublicationAuthor> getEditors() {
if (isLocatedInEditedVolumeBook())
return ((EditedVolumeBookResourceLocator) publicationResourceLocator).getEditors();
return Collections.emptySet();
}
public void setEditors(SortedSet<PublicationAuthor> editors) {
if (isLocatedInEditedVolumeBook()) {
((EditedVolumeBookResourceLocator) publicationResourceLocator).addEditors(editors);
}
}
public boolean hasDbXrefs() {
return dbXrefs != null && !dbXrefs.isEmpty();
}
public Set<DbXref> getDbXrefs() {
return dbXrefs;
}
public void setDbXrefs(Set<DbXref> dbXrefs) {
this.dbXrefs = dbXrefs;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("id=");
sb.append(this.id);
sb.append("\n");
sb.append("md5=");
sb.append(this.md5);
sb.append("\n");
sb.append("title=");
sb.append(this.title);
sb.append("\n");
sb.append("submission=");
sb.append((this.submission != null) ? this.submission : "null");
sb.append("\n");
sb.append("volume=");
sb.append(getVolume());
sb.append("; issue=");
sb.append(getIssue());
sb.append("\n");
sb.append("pub_type=");
sb.append(this.publicationType);
sb.append("\n");
sb.append("journal=");
sb.append(this.publicationResourceLocator);
sb.append("\n");
sb.append("authorsCnt=");
sb.append((this.authors != null) ? this.authors.size() : "null");
sb.append("\n");
// date is not defined for online publication type
if (hasPublicationDate()) {
sb.append("date=");
sb.append(this.publicationDate.toString());
sb.append("\n");
}
return sb.toString();
}
}