/**
* =============================================================================
*
* ORCID (R) Open Source
* http://orcid.org
*
* Copyright (c) 2012-2014 ORCID, Inc.
* Licensed under an MIT-Style License (MIT)
* http://orcid.org/open-source-license
*
* This copyright and license information (including a link to the full license)
* shall be included in its entirety in all copies or substantial portion of
* the software.
*
* =============================================================================
*/
package org.orcid.persistence.jpa.entities;
import static org.orcid.utils.NullUtils.compareObjectsNullSafe;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
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.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import org.apache.commons.lang3.StringUtils;
import org.orcid.jaxb.model.common_v2.Visibility;
import org.orcid.jaxb.model.record_v2.WorkType;
import org.orcid.jaxb.model.record_v2.PeerReviewType;
import org.orcid.jaxb.model.record_v2.Role;
import org.orcid.utils.OrcidStringUtils;
@Entity
@Table(name = "peer_review")
public class PeerReviewEntity extends SourceAwareEntity<Long> implements Comparable<PeerReviewEntity>, ProfileAware, DisplayIndexInterface {
private static final long serialVersionUID = -172752706595347541L;
private Long id;
private ProfileEntity profile;
private Role role;
private OrgEntity org;
private String externalIdentifiersJson;
private String url;
private PeerReviewType type;
private CompletionDateEntity completionDate;
private Visibility visibility;
private String subjectExternalIdentifiersJson;
private WorkType subjectType;
private String subjectContainerName;
private String subjectName;
private String subjectTranslatedName;
private String subjectTranslatedNameLanguageCode;
private String subjectUrl;
private String groupId;
private Long displayIndex;
@Override
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "peer_review_seq")
@SequenceGenerator(name = "peer_review_seq", sequenceName = "peer_review_seq")
public Long getId() {
return id;
}
@Basic
@Enumerated(EnumType.STRING)
@Column(name = "peer_review_role")
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
@ManyToOne(fetch = FetchType.EAGER, cascade = { CascadeType.DETACH, CascadeType.REFRESH })
@JoinColumn(name = "org_id", nullable = false)
public OrgEntity getOrg() {
return org;
}
public void setOrg(OrgEntity org) {
this.org = org;
}
@Column(name = "external_identifiers_json")
public String getExternalIdentifiersJson() {
return externalIdentifiersJson;
}
public void setExternalIdentifiersJson(String externalIdentifiersJson) {
this.externalIdentifiersJson = externalIdentifiersJson;
}
@Column(name = "url", length = 350)
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
@Basic
@Enumerated(EnumType.STRING)
@Column(name = "peer_review_type")
public PeerReviewType getType() {
return type;
}
public void setType(PeerReviewType type) {
this.type = type;
}
public CompletionDateEntity getCompletionDate() {
return completionDate;
}
public void setCompletionDate(CompletionDateEntity completionDate) {
this.completionDate = completionDate;
}
@Basic
@Enumerated(EnumType.STRING)
public Visibility getVisibility() {
return visibility;
}
public void setVisibility(Visibility visibility) {
this.visibility = visibility;
}
public void setId(Long id) {
this.id = id;
}
public void setProfile(ProfileEntity profile) {
this.profile = profile;
}
@Override
@ManyToOne(cascade = { CascadeType.REFRESH }, fetch = FetchType.EAGER)
@JoinColumn(name = "orcid", nullable = false)
public ProfileEntity getProfile() {
return profile;
}
@Column(name = "subject_external_identifiers_json")
public String getSubjectExternalIdentifiersJson() {
return subjectExternalIdentifiersJson;
}
public void setSubjectExternalIdentifiersJson(String subjectExternalIdentifiersJson) {
this.subjectExternalIdentifiersJson = subjectExternalIdentifiersJson;
}
@Basic
@Enumerated(EnumType.STRING)
@Column(name = "subject_type")
public WorkType getSubjectType() {
return subjectType;
}
public void setSubjectType(WorkType subjectType) {
this.subjectType = subjectType;
}
@Column(name = "subject_container_name")
public String getSubjectContainerName() {
return subjectContainerName;
}
public void setSubjectContainerName(String subjectContainerName) {
this.subjectContainerName = subjectContainerName;
}
@Column(name = "subject_name")
public String getSubjectName() {
return subjectName;
}
public void setSubjectName(String subjectName) {
this.subjectName = subjectName;
}
@Column(name = "subject_translated_name")
public String getSubjectTranslatedName() {
return subjectTranslatedName;
}
public void setSubjectTranslatedName(String subjectTranslatedName) {
this.subjectTranslatedName = subjectTranslatedName;
}
@Column(name = "subject_translated_name_language_code")
public String getSubjectTranslatedNameLanguageCode() {
return subjectTranslatedNameLanguageCode;
}
public void setSubjectTranslatedNameLanguageCode(String subjectTranslatedNameLanguageCode) {
this.subjectTranslatedNameLanguageCode = subjectTranslatedNameLanguageCode;
}
@Column(name = "subject_url")
public String getSubjectUrl() {
return subjectUrl;
}
public void setSubjectUrl(String subjectUrl) {
this.subjectUrl = subjectUrl;
}
@Column(name = "group_id")
public String getGroupId() {
return groupId;
}
public void setGroupId(String groupId) {
this.groupId = groupId;
}
/*
* Dictates the display order for works (and versions of works)
* works with higher numbers should be displayed first.
*
* Currently only updatable via ProfileWorkDaoImpl.updateToMaxDisplay
*
*/
@Column(name = "display_index", updatable=false)
public Long getDisplayIndex() {
return displayIndex;
}
public void setDisplayIndex(Long displayIndex) {
this.displayIndex = displayIndex;
}
public int compareTo(PeerReviewEntity other) {
if (other == null) {
throw new NullPointerException("Can't compare with null");
}
int typeCompare = compareObjectsNullSafe(type, other.getType());
if(typeCompare != 0) {
return typeCompare;
}
int roleCompare = compareObjectsNullSafe(role, other.getRole());
if(roleCompare != 0) {
return roleCompare;
}
int completionDateCompare = compareObjectsNullSafe((FuzzyDateEntity)completionDate, (FuzzyDateEntity)other.getCompletionDate());
if(completionDateCompare != 0) {
return completionDateCompare;
}
int urlCompare = OrcidStringUtils.compareStrings(url, other.getUrl());
if(urlCompare != 0) {
return urlCompare;
}
int extIdsCompare = OrcidStringUtils.compareStrings(externalIdentifiersJson, other.getExternalIdentifiersJson());
if(extIdsCompare != 0) {
return extIdsCompare;
}
int compareOrgName = OrcidStringUtils.compareStrings(org.getName(), other.getOrg().getName());
if (compareOrgName != 0) {
return compareOrgName;
}
int compareOrgCountry = OrcidStringUtils.compareStrings(org.getCountry() == null ? null : org.getCountry().value(), other.getOrg().getCountry() == null ? null : other.getOrg()
.getCountry().value());
if (compareOrgCountry != 0) {
return compareOrgCountry;
}
int compareOrgCity = OrcidStringUtils.compareStrings(org.getCity(), other.getOrg().getCity());
if (compareOrgCity != 0) {
return compareOrgCity;
}
int subjectExtIdCompare = OrcidStringUtils.compareStrings(subjectExternalIdentifiersJson, other.getSubjectExternalIdentifiersJson());
if(subjectExtIdCompare != 0) {
return subjectExtIdCompare;
}
int subjectTypeCompare = compareObjectsNullSafe(subjectType, other.getSubjectType());
if(subjectTypeCompare != 0) {
return subjectTypeCompare;
}
int subjectContainerNameCompare = OrcidStringUtils.compareStrings(subjectContainerName, other.getSubjectContainerName());
if(subjectContainerNameCompare != 0) {
return subjectContainerNameCompare;
}
int subjectNameCompare = OrcidStringUtils.compareStrings(subjectName, other.getSubjectName());
if(subjectNameCompare != 0) {
return subjectNameCompare;
}
int subjectTranslatedNameCompare = OrcidStringUtils.compareStrings(subjectTranslatedName, other.getSubjectTranslatedName());
if(subjectTranslatedNameCompare != 0) {
return subjectTranslatedNameCompare;
}
int subjectTranslatedNameLanguageCodeCompare = OrcidStringUtils.compareStrings(subjectTranslatedNameLanguageCode, other.getSubjectTranslatedNameLanguageCode());
if(subjectTranslatedNameLanguageCodeCompare != 0) {
return subjectTranslatedNameLanguageCodeCompare;
}
int subjectUrlCompare = OrcidStringUtils.compareStrings(subjectUrl, other.getSubjectUrl());
if(subjectUrlCompare != 0) {
return subjectUrlCompare;
}
int groupIdCompare = OrcidStringUtils.compareStrings(groupId, other.getGroupId());
if(groupIdCompare != 0) {
return groupIdCompare;
}
if(StringUtils.isEmpty(getElementSourceId())) {
if(!StringUtils.isEmpty(other.getElementSourceId())) {
return -1;
}
} else {
if(StringUtils.isEmpty(other.getElementSourceId())) {
return 1;
} else {
int sourceCompare = OrcidStringUtils.compareStrings(getElementSourceId(), other.getElementSourceId());
if(sourceCompare != 0) {
return sourceCompare;
}
}
}
return 0;
}
public void clean() {
externalIdentifiersJson = null;
url = null;
type = null;
completionDate = null;
visibility = null;
subjectExternalIdentifiersJson = null;
subjectContainerName = null;
subjectName = null;
subjectTranslatedName = null;
subjectTranslatedNameLanguageCode = null;
subjectUrl = null;
groupId = null;
}
}