/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.authority;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrInputDocument;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
*
* @author Antoine Snyers (antoine at atmire.com)
* @author Kevin Van de Velde (kevin at atmire dot com)
* @author Ben Bosman (ben at atmire dot com)
* @author Mark Diggory (markd at atmire dot com)
*/
public class PersonAuthorityValue extends AuthorityValue {
private String firstName;
private String lastName;
private List<String> nameVariants = new ArrayList<String>();
private String institution;
private List<String> emails = new ArrayList<String>();
public PersonAuthorityValue() {
}
public PersonAuthorityValue(SolrDocument document) {
super(document);
}
public String getName() {
String name = "";
if (StringUtils.isNotBlank(lastName)) {
name = lastName;
if (StringUtils.isNotBlank(firstName)) {
name += ", ";
}
}
if (StringUtils.isNotBlank(firstName)) {
name += firstName;
}
return name;
}
public void setName(String name) {
if (StringUtils.isNotBlank(name)) {
String[] split = name.split(",");
if (split.length > 0) {
setLastName(split[0].trim());
if (split.length > 1) {
setFirstName(split[1].trim());
}
}
}
if (!StringUtils.equals(getValue(), name)) {
setValue(name);
}
}
@Override
public void setValue(String value) {
super.setValue(value);
setName(value);
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public List<String> getNameVariants() {
return nameVariants;
}
public void addNameVariant(String name) {
if (StringUtils.isNotBlank(name)) {
nameVariants.add(name);
}
}
public String getInstitution() {
return institution;
}
public void setInstitution(String institution) {
this.institution = institution;
}
public List<String> getEmails() {
return emails;
}
public void addEmail(String email) {
if (StringUtils.isNotBlank(email)) {
emails.add(email);
}
}
@Override
public SolrInputDocument getSolrInputDocument() {
SolrInputDocument doc = super.getSolrInputDocument();
if (StringUtils.isNotBlank(getFirstName())) {
doc.addField("first_name", getFirstName());
}
if (StringUtils.isNotBlank(getLastName())) {
doc.addField("last_name", getLastName());
}
for (String nameVariant : getNameVariants()) {
doc.addField("name_variant", nameVariant);
}
for (String email : emails) {
doc.addField("email", email);
}
doc.addField("institution", getInstitution());
return doc;
}
@Override
public void setValues(SolrDocument document) {
super.setValues(document);
this.firstName = ObjectUtils.toString(document.getFieldValue("first_name"));
this.lastName = ObjectUtils.toString(document.getFieldValue("last_name"));
nameVariants = new ArrayList<String>();
Collection<Object> document_name_variant = document.getFieldValues("name_variant");
if (document_name_variant != null) {
for (Object name_variants : document_name_variant) {
addNameVariant(String.valueOf(name_variants));
}
}
if (document.getFieldValue("institution") != null) {
this.institution = String.valueOf(document.getFieldValue("institution"));
}
Collection<Object> emails = document.getFieldValues("email");
if (emails != null) {
for (Object email : emails) {
addEmail(String.valueOf(email));
}
}
}
@Override
public Map<String, String> choiceSelectMap() {
Map<String, String> map = super.choiceSelectMap();
if (StringUtils.isNotBlank(getFirstName())) {
map.put("first-name", getFirstName());
} else {
map.put("first-name", "/");
}
if (StringUtils.isNotBlank(getLastName())) {
map.put("last-name", getLastName());
} else {
map.put("last-name", "/");
}
if (!getEmails().isEmpty()) {
boolean added = false;
for (String email : getEmails()) {
if (!added && StringUtils.isNotBlank(email)) {
map.put("email",email);
added = true;
}
}
}
if (StringUtils.isNotBlank(getInstitution())) {
map.put("institution", getInstitution());
}
return map;
}
@Override
public String getAuthorityType() {
return "person";
}
@Override
public String generateString() {
return AuthorityValueGenerator.GENERATE + getAuthorityType() + AuthorityValueGenerator.SPLIT + getName();
// the part after "AuthorityValueGenerator.GENERATE + getAuthorityType() + AuthorityValueGenerator.SPLIT" is the value of the "info" parameter in public AuthorityValue newInstance(String info)
}
@Override
public AuthorityValue newInstance(String info) {
PersonAuthorityValue authorityValue = new PersonAuthorityValue();
authorityValue.setValue(info);
return authorityValue;
}
@Override
public String toString() {
return "PersonAuthorityValue{" +
"firstName='" + firstName + '\'' +
", lastName='" + lastName + '\'' +
", nameVariants=" + nameVariants +
", institution='" + institution + '\'' +
", emails=" + emails +
"} " + super.toString();
}
public boolean hasTheSameInformationAs(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
if(!super.hasTheSameInformationAs(o)){
return false;
}
PersonAuthorityValue that = (PersonAuthorityValue) o;
if (emails != null ? !emails.equals(that.emails) : that.emails != null) {
return false;
}
if (firstName != null ? !firstName.equals(that.firstName) : that.firstName != null) {
return false;
}
if (institution != null ? !institution.equals(that.institution) : that.institution != null) {
return false;
}
if (lastName != null ? !lastName.equals(that.lastName) : that.lastName != null) {
return false;
}
if (nameVariants != null ? !nameVariants.equals(that.nameVariants) : that.nameVariants != null) {
return false;
}
return true;
}
}