/** * OLAT - Online Learning and Training<br> * http://www.olat.org * <p> * Licensed under the Apache License, Version 2.0 (the "License"); <br> * you may not use this file except in compliance with the License.<br> * You may obtain a copy of the License at * <p> * http://www.apache.org/licenses/LICENSE-2.0 * <p> * Unless required by applicable law or agreed to in writing,<br> * software distributed under the License is distributed on an "AS IS" BASIS, <br> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> * See the License for the specific language governing permissions and <br> * limitations under the License. * <p> * Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> * University of Zurich, Switzerland. * <hr> * <a href="http://www.openolat.org"> * OpenOLAT - Online Learning and Training</a><br> * This file has been modified by the OpenOLAT community. Changes are licensed * under the Apache 2.0 license as the original file. */ package org.olat.user; import java.util.Date; import java.util.Locale; import java.util.Map; import javax.persistence.Column; import javax.persistence.Embedded; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToOne; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.persistence.Transient; import javax.persistence.Version; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Parameter; import org.olat.basesecurity.IdentityImpl; import org.olat.core.id.Identity; import org.olat.core.id.Persistable; import org.olat.core.id.Preferences; import org.olat.core.id.User; import org.olat.core.id.UserConstants; import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; import org.olat.user.propertyhandlers.UserPropertyHandler; /** * Desciption: * <p> * The user represents an known OLAT user. A user can log into OLAT * and user the system. * <p> * The user properties are wrapped in UserPropertyHandler objects that wrap the logic needed * to display and edit those properties in forms. Use the UserManager to access * those wrappers. For your convinience you can set and get user field values * directly from this user implementation, you don't have to use the manager for * this. * <p> * Note that setting any values on the user object does not persist anything. * Whenever a field is modified use the UserManager to save the object. * <p> * @author Florian Gnägi */ @Entity @Table(name="o_user") public class UserImpl implements Persistable, User { private static final long serialVersionUID = -2872102058369727753L; private static final OLog log = Tracing.createLoggerFor(UserImpl.class); @Id @GeneratedValue(generator = "system-uuid") @GenericGenerator(name = "system-uuid", strategy = "enhanced-sequence", parameters={ @Parameter(name="sequence_name", value="hibernate_unique_key"), @Parameter(name="force_table_use", value="true"), @Parameter(name="optimizer", value="legacy-hilo"), @Parameter(name="value_column", value="next_hi"), @Parameter(name="increment_size", value="32767"), @Parameter(name="initial_value", value="32767") }) @Column(name="user_id", nullable=false, unique=true, insertable=true, updatable=false) private Long key; @Version private int version = 0; @Temporal(TemporalType.TIMESTAMP) @Column(name="creationdate", nullable=false, insertable=true, updatable=false) private Date creationDate; @OneToOne(targetEntity=IdentityImpl.class, optional=true, fetch=FetchType.LAZY) @JoinColumn (name="fk_identity") private Identity identity; @Transient private boolean webdav; @Column(name="u_firstname", nullable=true, insertable=true, updatable=true) private String firstName; @Column(name="u_lastname", nullable=true, insertable=true, updatable=true) private String lastName; @Column(name="u_email", nullable=true, insertable=true, updatable=true) private String email; @Column(name="u_privateemail", nullable=true, insertable=true, updatable=true) private String privateEmail; @Column(name="u_gender", nullable=true, insertable=true, updatable=true) private String gender; @Column(name="u_birthday", nullable=true, insertable=true, updatable=true) private String birthDay; @Column(name="u_socialsecuritynumber", nullable=true, insertable=true, updatable=true) private String socialSecurityNumber; @Column(name="u_userinterests", nullable=true, insertable=true, updatable=true) private String userInterests; @Column(name="u_usersearchedinterests", nullable=true, insertable=true, updatable=true) private String userSearchedInterests; @Column(name="u_telprivate", nullable=true, insertable=true, updatable=true) private String telPrivate; @Column(name="u_telmobile", nullable=true, insertable=true, updatable=true) private String telMobile; @Column(name="u_smstelmobile", nullable=true, insertable=true, updatable=true) private String smsTelMobile; @Column(name="u_skype", nullable=true, insertable=true, updatable=true) private String skype; @Column(name="u_msn", nullable=true, insertable=true, updatable=true) private String msn; @Column(name="u_xing", nullable=true, insertable=true, updatable=true) private String xing; @Column(name="u_icq", nullable=true, insertable=true, updatable=true) private String icq; @Column(name="u_homepage", nullable=true, insertable=true, updatable=true) private String homepage; @Column(name="u_street", nullable=true, insertable=true, updatable=true) private String street; @Column(name="u_extendedaddress", nullable=true, insertable=true, updatable=true) private String extendedAddress; @Column(name="u_pobox", nullable=true, insertable=true, updatable=true) private String poBox; @Column(name="u_zipcode", nullable=true, insertable=true, updatable=true) private String zipCode; @Column(name="u_region", nullable=true, insertable=true, updatable=true) private String region; @Column(name="u_city", nullable=true, insertable=true, updatable=true) private String city; @Column(name="u_country", nullable=true, insertable=true, updatable=true) private String country; @Column(name="u_countrycode", nullable=true, insertable=true, updatable=true) private String countryCode; @Column(name="u_degree", nullable=true, insertable=true, updatable=true) private String degree; @Column(name="u_graduation", nullable=true, insertable=true, updatable=true) private String graduation; @Column(name="u_studysubject", nullable=true, insertable=true, updatable=true) private String studySubject; @Column(name="u_institutionalname", nullable=true, insertable=true, updatable=true) private String institutionalName; @Column(name="u_institutionaluseridentifier", nullable=true, insertable=true, updatable=true) private String institutionalUserIdentifier; @Column(name="u_institutionalemail", nullable=true, insertable=true, updatable=true) private String institutionalEmail; @Column(name="u_emchangekey", nullable=true, insertable=true, updatable=true) private String emchangeKey; @Column(name="u_emaildisabled", nullable=true, insertable=true, updatable=true) private String emailDisabled; @Column(name="u_teloffice", nullable=true, insertable=true, updatable=true) private String telOffice; @Column(name="u_officestreet", nullable=true, insertable=true, updatable=true) private String officeStreet; @Column(name="u_extendedofficeaddress", nullable=true, insertable=true, updatable=true) private String extendedOfficeAddress; @Column(name="u_officepobox", nullable=true, insertable=true, updatable=true) private String officePoBox; @Column(name="u_officezipcode", nullable=true, insertable=true, updatable=true) private String officeZipCode; @Column(name="u_officecity", nullable=true, insertable=true, updatable=true) private String officeCity; @Column(name="u_officecountry", nullable=true, insertable=true, updatable=true) private String officeCountry; @Column(name="u_officemobilephone", nullable=true, insertable=true, updatable=true) private String officeMobilePhone; @Column(name="u_rank", nullable=true, insertable=true, updatable=true) private String rank; @Column(name="u_position", nullable=true, insertable=true, updatable=true) private String position; @Column(name="u_typeofuser", nullable=true, insertable=true, updatable=true) private String typeOfUser; @Column(name="u_orgunit", nullable=true, insertable=true, updatable=true) private String orgUnit; @Column(name="u_department", nullable=true, insertable=true, updatable=true) private String department; @Column(name="u_employeenumber", nullable=true, insertable=true, updatable=true) private String employeeNumber; @Column(name="u_organizationalunit", nullable=true, insertable=true, updatable=true) private String organizationalUnit; @Column(name="u_genericselectionproperty", nullable=true, insertable=true, updatable=true) private String genericSelectionProperty; @Column(name="u_genericselectionproperty2", nullable=true, insertable=true, updatable=true) private String genericSelectionProperty2; @Column(name="u_genericselectionproperty3", nullable=true, insertable=true, updatable=true) private String genericSelectionProperty3; // delete @Column(name="u_generictextproperty", nullable=true, insertable=true, updatable=true) private String genericTextProperty; @Column(name="u_generictextproperty2", nullable=true, insertable=true, updatable=true) private String genericTextProperty2; @Column(name="u_generictextproperty3", nullable=true, insertable=true, updatable=true) private String genericTextProperty3; @Column(name="u_generictextproperty4", nullable=true, insertable=true, updatable=true) private String genericTextProperty4; @Column(name="u_generictextproperty5", nullable=true, insertable=true, updatable=true) private String genericTextProperty5; @Column(name="u_genericuniquetextproperty", nullable=true, insertable=true, updatable=true) private String genericUniqueTextProperty; @Column(name="u_genericuniquetextproperty2", nullable=true, insertable=true, updatable=true) private String genericUniqueTextProperty2; // delete @Column(name="u_genericuniquetextproperty3", nullable=true, insertable=true, updatable=true) private String genericUniqueTextProperty3; // delete @Column(name="u_genericemailproperty1", nullable=true, insertable=true, updatable=true) private String genericEmailProperty1; @Column(name="u_genericcheckboxproperty", nullable=true, insertable=true, updatable=true) private String genericCheckboxProperty; @Column(name="u_genericcheckboxproperty2", nullable=true, insertable=true, updatable=true) private String genericCheckboxProperty2; // delete @Column(name="u_genericcheckboxproperty3", nullable=true, insertable=true, updatable=true) private String genericCheckboxProperty3; // delete @Column(name="u_edupersonaffiliation", nullable=true, insertable=true, updatable=true) private String eduPersonAffiliation; @Column(name="u_swissedupersonhomeorg", nullable=true, insertable=true, updatable=true) private String swissEduPersonHomeOrganization; @Column(name="u_swissedupersonstudylevel", nullable=true, insertable=true, updatable=true) private String swissEduPersonStudyLevel; @Column(name="u_swissedupersonhomeorgtype", nullable=true, insertable=true, updatable=true) private String swissEduPersonHomeOrganizationType; @Column(name="u_swissedupersonstaffcategory", nullable=true, insertable=true, updatable=true) private String swissEduPersonStaffCategory; @Column(name="u_swissedupersonstudybranch1", nullable=true, insertable=true, updatable=true) private String swissEduPersonStudyBranch1; @Column(name="u_swissedupersonstudybranch2", nullable=true, insertable=true, updatable=true) private String swissEduPersonStudyBranch2; @Column(name="u_swissedupersonstudybranch3", nullable=true, insertable=true, updatable=true) private String swissEduPersonStudyBranch3; @Embedded private PreferencesImpl preferences; // the volatile attributes which are set during log in // but must be made available to the usertracking LoggingObject @Transient private Map<String, String> identEnvAttribs; public UserImpl() { // } @Override public Long getKey() { return key; } public void setKey(Long key) { this.key = key; } public int getVersion() { return version; } public void setVersion(int version) { this.version = version; } @Override public Date getCreationDate() { return creationDate; } public void setCreationDate(Date creationDate) { this.creationDate = creationDate; } public Identity getIdentity() { return identity; } public void setIdentity(Identity identity) { this.identity = identity; } 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 String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public boolean isWebdav() { return webdav; } public void setWebdav(boolean isWebdav) { this.webdav = isWebdav; } /** * @see User#getPreferences() */ @Override public Preferences getPreferences() { if(preferences == null) { preferences = new PreferencesImpl(); } return preferences; } /** * @see User#setPreferences(Preferences) */ @Override public void setPreferences(Preferences prefs){ this.preferences = (PreferencesImpl)prefs; } public String getUserProperty(String name) { switch(name) { case UserConstants.FIRSTNAME: return firstName; case UserConstants.LASTNAME: return lastName; case UserConstants.EMAIL: return email; case "birthDay": return birthDay; case "graduation": return graduation; case "gender": return gender; case "telPrivate": return telPrivate; case "telMobile": return telMobile; case "smsTelMobile": return smsTelMobile; case "telOffice": return telOffice; case "skype": return skype; case "msn": return msn; case "xing": return xing; case "icq": return icq; case "homepage": return homepage; case "street": return street; case "extendedAddress": return extendedAddress; case "poBox": return poBox; case "zipCode": return zipCode; case "region": return region; case "city": return city; case "country": return country; case "countryCode": return countryCode; case "institutionalName": return institutionalName; case "institutionalUserIdentifier": return institutionalUserIdentifier; case "institutionalEmail": return institutionalEmail; case "orgUnit": return orgUnit; case "studySubject": return studySubject; case "emchangeKey": return emchangeKey; case "emailDisabled": return emailDisabled; case "typeOfUser": return typeOfUser; case "socialSecurityNumber": return socialSecurityNumber; case "genericSelectionProperty": return genericSelectionProperty; case "genericSelectionProperty2": return genericSelectionProperty2; case "genericSelectionProperty3": return genericSelectionProperty3; case "genericTextProperty": return genericTextProperty; case "genericTextProperty2": return genericTextProperty2; case "genericTextProperty3": return genericTextProperty3; case "genericTextProperty4": return genericTextProperty4; case "genericTextProperty5": return genericTextProperty5; case "genericUniqueTextProperty": return genericUniqueTextProperty; case "genericUniqueTextProperty2": return genericUniqueTextProperty2; case "genericUniqueTextProperty3": return genericUniqueTextProperty3; case "genericEmailProperty1": return genericEmailProperty1; case "genericCheckboxProperty": return genericCheckboxProperty; case "genericCheckboxProperty2": return genericCheckboxProperty2; case "genericCheckboxProperty3": return genericCheckboxProperty3; case "rank": return rank; case "degree": return degree; case "position": return position; case "userInterests": return userInterests; case "officeStreet": return officeStreet; case "extendedOfficeAddress": return extendedOfficeAddress; case "officePoBox": return officePoBox; case "officeZipCode": return officeZipCode; case "officeCity": return officeCity; case "officeCountry": return officeCountry; case "officeMobilePhone": return officeMobilePhone; case "department": return department; case "privateEmail": return privateEmail; case "eduPersonAffiliation": return eduPersonAffiliation; case "swissEduPersonHomeOrganization": return swissEduPersonHomeOrganization; case "swissEduPersonStudyLevel": return swissEduPersonStudyLevel; case "swissEduPersonHomeOrganizationType": return swissEduPersonHomeOrganizationType; case "employeeNumber": return employeeNumber; case "swissEduPersonStaffCategory": return swissEduPersonStaffCategory; case "organizationalUnit": return organizationalUnit; case "swissEduPersonStudyBranch1": return swissEduPersonStudyBranch1; case "swissEduPersonStudyBranch2": return swissEduPersonStudyBranch2; case "swissEduPersonStudyBranch3": return swissEduPersonStudyBranch3; default: return null; } } public void setUserProperty(String name, String value) { switch(name) { case UserConstants.FIRSTNAME: firstName = value; break; case UserConstants.LASTNAME: lastName = value; break; case UserConstants.EMAIL: email = value; break; case "birthDay": birthDay = value; break; case "graduation": graduation = value; break; case "gender": gender = value; break; case "telPrivate": telPrivate = value; break; case "telMobile": telMobile = value; break; case "smsTelMobile": smsTelMobile = value; break; case "telOffice": telOffice = value; break; case "skype": skype = value; break; case "msn": msn = value; break; case "xing": xing = value; break; case "icq": icq = value; break; case "homepage": homepage = value; break; case "street": street = value; break; case "extendedAddress": extendedAddress = value; break; case "poBox": poBox = value; break; case "zipCode": zipCode = value; break; case "region": region = value; break; case "city": city = value; break; case "country": country = value; break; case "countryCode": countryCode = value; break; case "institutionalName": institutionalName = value; break; case "institutionalUserIdentifier": institutionalUserIdentifier = value; break; case "institutionalEmail": institutionalEmail = value; break; case "orgUnit": orgUnit = value; break; case "studySubject": studySubject = value; break; case "emchangeKey": emchangeKey = value; break; case "emailDisabled": emailDisabled = value; break; case "typeOfUser": typeOfUser = value; break; case "socialSecurityNumber": socialSecurityNumber = value; break; case "genericSelectionProperty": genericSelectionProperty = value; break; case "genericSelectionProperty2": genericSelectionProperty2 = value; break; case "genericSelectionProperty3": genericSelectionProperty3 = value; break; case "genericTextProperty": genericTextProperty = value; break; case "genericTextProperty2": genericTextProperty2 = value; break; case "genericTextProperty3": genericTextProperty3 = value; break; case "genericTextProperty4": genericTextProperty4 = value; break; case "genericTextProperty5": genericTextProperty5 = value; break; case "genericUniqueTextProperty": genericUniqueTextProperty = value; break; case "genericUniqueTextProperty2": genericUniqueTextProperty2 = value; break; case "genericUniqueTextProperty3": genericUniqueTextProperty3 = value; break; case "genericEmailProperty1": genericEmailProperty1 = value; break; case "genericCheckboxProperty": genericCheckboxProperty = value; break; case "genericCheckboxProperty2": genericCheckboxProperty2 = value; break; case "genericCheckboxProperty3": genericCheckboxProperty3 = value; break; case "rank": rank = value; break; case "degree": degree = value; break; case "position": position = value; break; case "userInterests": userInterests = value; break; case "officeStreet": officeStreet = value; break; case "extendedOfficeAddress": extendedOfficeAddress = value; break; case "officePoBox": officePoBox = value; break; case "officeZipCode": officeZipCode = value; break; case "officeCity": officeCity = value; break; case "officeCountry": officeCountry = value; break; case "officeMobilePhone": officeMobilePhone = value; break; case "department": department = value; break; case "privateEmail": privateEmail = value; break; case "eduPersonAffiliation": eduPersonAffiliation = value; break; case "swissEduPersonHomeOrganization": swissEduPersonHomeOrganization = value; break; case "swissEduPersonStudyLevel": swissEduPersonStudyLevel = value; break; case "swissEduPersonHomeOrganizationType": swissEduPersonHomeOrganizationType = value; break; case "employeeNumber": employeeNumber = value; break; case "swissEduPersonStaffCategory": swissEduPersonStaffCategory = value; break; case "organizationalUnit": organizationalUnit = value; break; case "swissEduPersonStudyBranch1": swissEduPersonStudyBranch1 = value; break; case "swissEduPersonStudyBranch2": swissEduPersonStudyBranch2 = value; break; case "swissEduPersonStudyBranch3": swissEduPersonStudyBranch3 = value; break; } } /** * Two users are equal if their key is equal. * @param obj * @return true if users are the same */ @Override public boolean equals(Object obj) { if(this == obj) return true; if((obj == null) || (obj.getClass() != this.getClass())) return false; // object must be UserImpl at this point UserImpl user = (UserImpl)obj; return getKey() != null && getKey().equals(user.getKey()); } @Override public int hashCode() { int hash = 7; hash = 31 * hash; hash = 31 * hash + (null == this.getKey() ? 0 : this.getKey().hashCode()); return hash; } @Override public boolean equalsByPersistableKey(Persistable persistable) { return equals(persistable); } /** * Returns the users username, lastname, firstname and database key. * @return String user info */ public String toString() { UserManager um = UserManager.getInstance(); if (um != null) { //can be null during startup, may inject via spring String quickinfo = "UserImpl(" + getKey() + ")[" + um.getUserPropertiesConfig().getPropertyHandler(UserConstants.LASTNAME).getUserProperty(this, null) + " " + um.getUserPropertiesConfig().getPropertyHandler(UserConstants.FIRSTNAME).getUserProperty(this, null) + "," + um.getUserPropertiesConfig().getPropertyHandler(UserConstants.EMAIL).getUserProperty(this, null) + "]"; return quickinfo + "," + super.toString(); } return super.toString(); } /** * @see org.olat.core.id.User#getProperty(java.lang.String, java.util.Locale) */ @Override public String getProperty(String propertyName, Locale locale) { UserManager um = UserManager.getInstance(); UserPropertyHandler propertyHandler = um.getUserPropertiesConfig().getPropertyHandler(propertyName); if (propertyHandler == null) return null; return propertyHandler.getUserProperty(this, locale); } /** * @see org.olat.core.id.User#setProperty(java.lang.String, java.lang.String) */ @Override public void setProperty(String propertyName, String propertyValue) { UserManager um = UserManager.getInstance(); UserPropertyHandler propertyHandler = um.getUserPropertiesConfig().getPropertyHandler(propertyName); if(propertyHandler == null) { log.error("Try to set unkown property: " + propertyName + " for user: " + getKey()); } else { propertyHandler.setUserProperty(this, propertyValue); } } /** * * @see org.olat.core.id.User#setIdentityEnvironmentAttributes(java.util.Map) */ public void setIdentityEnvironmentAttributes(Map<String, String> identEnvAttribs) { this.identEnvAttribs = identEnvAttribs; } /** * * @see org.olat.core.id.User#getPropertyOrIdentityEnvAttribute(java.lang.String, java.util.Locale) */ public String getPropertyOrIdentityEnvAttribute(String propertyName, Locale locale){ String retVal = getProperty(propertyName, locale); if(retVal == null && identEnvAttribs != null){ retVal = identEnvAttribs.get(propertyName); } return retVal; } }