/** * 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.eperson; import org.apache.commons.lang.BooleanUtils; import org.apache.commons.lang.StringUtils; import org.dspace.content.DSpaceObject; import org.dspace.content.DSpaceObjectLegacySupport; import org.dspace.content.Item; import org.dspace.core.Constants; import org.dspace.core.Context; import org.dspace.eperson.factory.EPersonServiceFactory; import org.dspace.eperson.service.EPersonService; import org.hibernate.proxy.HibernateProxyHelper; import javax.persistence.*; import java.sql.SQLException; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * Class representing an e-person. * * @author David Stuve * @version $Revision$ */ @Entity @Table(name = "eperson") public class EPerson extends DSpaceObject implements DSpaceObjectLegacySupport { @Column(name="eperson_id", insertable = false, updatable = false) private Integer legacyId; @Column(name="netid", length = 64) private String netid; @Column(name="last_active") @Temporal(TemporalType.TIMESTAMP) private Date lastActive; @Column(name="can_log_in", nullable = true) private Boolean canLogIn; @Column(name="email", unique=true, length = 64) private String email; @Column(name="require_certificate") private boolean requireCertificate = false; @Column(name="self_registered") private boolean selfRegistered = false; @Column(name="password", length = 128) private String password; @Column(name="salt", length = 32) private String salt; @Column(name="digest_algorithm", length = 16) private String digestAlgorithm; @ManyToMany(fetch = FetchType.LAZY, mappedBy = "epeople") private final List<Group> groups = new ArrayList<>(); /** The e-mail field (for sorting) */ public static final int EMAIL = 1; /** The last name (for sorting) */ public static final int LASTNAME = 2; /** The e-mail field (for sorting) */ public static final int ID = 3; /** The netid field (for sorting) */ public static final int NETID = 4; /** The e-mail field (for sorting) */ public static final int LANGUAGE = 5; @Transient protected transient EPersonService ePersonService; /** * Protected constructor, create object using: * {@link org.dspace.eperson.service.EPersonService#create(Context)} * */ protected EPerson() { } @Override public Integer getLegacyId() { return legacyId; } /** * Return true if this object equals obj, false otherwise. * * @param obj another EPerson. * @return true if EPerson objects are equal in ID, email, and full name */ @Override public boolean equals(Object obj) { if (obj == null) { return false; } Class<?> objClass = HibernateProxyHelper.getClassWithoutInitializingProxy(obj); if (getClass() != objClass) { return false; } final EPerson other = (EPerson) obj; if (this.getID() != other.getID()) { return false; } if (!StringUtils.equals(this.getEmail(), other.getEmail())) { return false; } if (!StringUtils.equals(this.getFullName(), other.getFullName())) { return false; } return true; } /** * Return a hash code for this object. * * @return int hash of object */ @Override public int hashCode() { int hash = 5; hash = 89 * hash + this.getID().hashCode(); hash = 89 * hash + (this.getEmail() != null? this.getEmail().hashCode():0); hash = 89 * hash + (this.getFullName() != null? this.getFullName().hashCode():0); return hash; } /** * Get the e-person's language * * @return language code (or null if the column is an SQL NULL) */ public String getLanguage() { return getePersonService().getMetadataFirstValue(this, "eperson", "language", null, Item.ANY); } /** * Set the EPerson's language. Value is expected to be a Unix/POSIX * Locale specification of the form {language} or {language}_{territory}, * e.g. "en", "en_US", "pt_BR" (the latter is Brazilian Portugese). * * @param context * The relevant DSpace Context. * @param language * language code * @throws SQLException * An exception that provides information on a database access error or other errors. */ public void setLanguage(Context context, String language) throws SQLException { getePersonService().setMetadataSingleValue(context, this, "eperson", "language", null, null, language); } /** * Get the e-person's email address * * @return their email address (or null if the column is an SQL NULL) */ public String getEmail() { return email; } /** * Set the EPerson's email * * @param s * the new email */ public void setEmail(String s) { this.email = StringUtils.lowerCase(s); setModified(); } /** * Get the e-person's netid * * @return their netid (DB constraints ensure it's never NULL) */ public String getNetid() { return netid; } /** * Set the EPerson's netid * * @param netid * the new netid */ public void setNetid(String netid) { this.netid = netid; setModified(); } /** * Get the e-person's full name, combining first and last name in a * displayable string. * * @return their full name (first + last name; if both are NULL, returns email) */ public String getFullName() { String f = getFirstName(); String l= getLastName(); if ((l == null) && (f == null)) { return getEmail(); } else if (f == null) { return l; } else { return (f + " " + l); } } /** * Get the eperson's first name. * * @return their first name (or null if the column is an SQL NULL) */ public String getFirstName() { return getePersonService().getMetadataFirstValue(this, "eperson", "firstname", null, Item.ANY); } /** * Set the eperson's first name * * @param context * The relevant DSpace Context. * @param firstname * the person's first name * @throws SQLException * An exception that provides information on a database access error or other errors. */ public void setFirstName(Context context, String firstname) throws SQLException { getePersonService().setMetadataSingleValue(context, this, "eperson", "firstname", null, null, firstname); setModified(); } /** * Get the eperson's last name. * * @return their last name (or null if the column is an SQL NULL) */ public String getLastName() { return getePersonService().getMetadataFirstValue(this, "eperson", "lastname", null, Item.ANY); } /** * Set the eperson's last name * * @param context * The relevant DSpace Context. * @param lastname * the person's last name * @throws SQLException * An exception that provides information on a database access error or other errors. */ public void setLastName(Context context, String lastname) throws SQLException { getePersonService().setMetadataSingleValue(context, this, "eperson", "lastname", null, null, lastname); setModified(); } /** * Indicate whether the user can log in * * @param login * boolean yes/no */ public void setCanLogIn(boolean login) { this.canLogIn = login; setModified(); } /** * Can the user log in? * * @return boolean, yes/no */ public boolean canLogIn() { return BooleanUtils.isTrue(canLogIn); } /** * Set require cert yes/no * * @param isrequired * boolean yes/no */ public void setRequireCertificate(boolean isrequired) { this.requireCertificate = isrequired; setModified(); } /** * Get require certificate or not * * @return boolean, yes/no (or false if the column is an SQL NULL) */ public boolean getRequireCertificate() { return requireCertificate; } /** * Indicate whether the user self-registered * * @param sr * boolean yes/no */ public void setSelfRegistered(boolean sr) { this.selfRegistered = sr; setModified(); } /** * Is the user self-registered? * * @return boolean, yes/no (or false if the column is an SQL NULL) */ public boolean getSelfRegistered() { return selfRegistered; } /** * Stamp the EPerson's last-active date. * * @param when latest activity timestamp, or null to clear. */ public void setLastActive(Date when) { this.lastActive = when; } /** * Get the EPerson's last-active stamp. * * @return date when last logged on, or null. */ public Date getLastActive() { return lastActive; } /** * @return type found in Constants, see {@link org.dspace.core.Constants#Constants Constants} */ @Override public int getType() { return Constants.EPERSON; } @Override public String getName() { return getEmail(); } String getDigestAlgorithm() { return digestAlgorithm; } void setDigestAlgorithm(String digestAlgorithm) { this.digestAlgorithm = digestAlgorithm; } String getSalt() { return salt; } void setSalt(String salt) { this.salt = salt; } String getPassword() { return password; } void setPassword(String password) { this.password = password; } public List<Group> getGroups() { return groups; } private EPersonService getePersonService() { if(ePersonService == null) { ePersonService = EPersonServiceFactory.getInstance().getEPersonService(); } return ePersonService; } }