/*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package net.rrm.ehour.domain;
import com.google.common.base.Optional;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.builder.CompareToBuilder;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.annotations.Type;
import org.joda.time.DateTimeZone;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.util.HashSet;
import java.util.Set;
/**
* @author Thies
*/
@Entity
@Table(name = "USERS")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class User extends DomainObject<Integer, User> {
private static final long serialVersionUID = 2546435367535412269L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "USER_ID")
private Integer userId;
@NotNull
@Column(name = "USERNAME", length = 64)
private String username;
@NotNull
@Column(name = "PASSWORD", nullable = false, length = 128)
private String password;
@Column(name = "FIRST_NAME", length = 64)
private String firstName;
@Column(name = "LAST_NAME", nullable = false, length = 64)
private String lastName;
@Column(name = "EMAIL", length = 128)
private String email;
@Column(name = "ACTIVE")
@Type(type = "yes_no")
private Boolean active = Boolean.TRUE;
@Column(name = "SALT")
private Integer salt;
@Transient
private String updatedPassword;
@ManyToMany(targetEntity = UserRole.class,
cascade = {CascadeType.MERGE, CascadeType.PERSIST}
)
@JoinTable(name = "USER_TO_USERROLE",
joinColumns = @JoinColumn(name = "USER_ID"),
inverseJoinColumns = @JoinColumn(name = "ROLE"))
private Set<UserRole> userRoles = new HashSet<>();
@ManyToMany(targetEntity = UserDepartment.class, cascade = {CascadeType.MERGE, CascadeType.PERSIST})
@JoinTable(name = "USER_TO_DEPARTMENT",
joinColumns = @JoinColumn(name = "USER_ID"),
inverseJoinColumns = @JoinColumn(name = "DEPARTMENT_ID"))
private Set<UserDepartment> userDepartments = new HashSet<>();
@OneToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE}, fetch = FetchType.LAZY, mappedBy = "user")
private Set<ProjectAssignment> projectAssignments;
@ManyToOne
@JoinColumn(name = "DEPARTMENT_ID")
private UserDepartment legacyDepartment;
@Transient
private Set<ProjectAssignment> inactiveProjectAssignments;
@Transient
private boolean deletable;
public User() {
}
public User(Integer userId) {
this.userId = userId;
}
public User(String username, String password) {
this.username = username;
this.password = password;
}
public User(Integer userId, String firstName, String lastName) {
this.userId = userId;
this.firstName = firstName;
this.lastName = lastName;
}
public User addUserRole(UserRole role) {
if (userRoles == null) {
userRoles = new HashSet<>();
}
userRoles.add(role);
return this;
}
public User deleteUserRole(UserRole role) {
if (userRoles != null) {
userRoles.remove(role);
}
return this;
}
public Optional<DateTimeZone> getTimezone() {
for (UserDepartment userDepartment : userDepartments) {
if (userDepartment.getTimeZone() != null) {
return Optional.of(userDepartment.getTimeZone());
}
}
return Optional.absent();
}
public String getFullName() {
StringBuilder fullName = new StringBuilder();
if (!StringUtils.isBlank(lastName)) {
fullName.append(lastName);
if (!StringUtils.isBlank(firstName)) {
fullName.append(", ");
}
}
if (!StringUtils.isBlank(firstName)) {
fullName.append(firstName);
}
return fullName.toString();
}
public void addUserDepartment(UserDepartment userDepartment) {
getUserDepartments().add(userDepartment);
}
public void setUserDepartment(UserDepartment userDepartment) {
getUserDepartments().clear();
getUserDepartments().add(userDepartment);
}
public void clearLegacyDepartment() {
this.legacyDepartment = null;
}
public Set<UserDepartment> getUserDepartments() {
return userDepartments;
}
public UserDepartment getUserDepartment() {
return (!userDepartments.isEmpty()) ? userDepartments.iterator().next() : null;
}
public void setUserDepartments(Set<UserDepartment> userDepartments) {
this.userDepartments = userDepartments;
}
public Integer getUserId() {
return this.userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUsername() {
return this.username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return this.password;
}
public void setPassword(String password) {
this.password = password;
}
public String getFirstName() {
return this.firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return this.lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return this.email;
}
public void setEmail(String email) {
this.email = email;
}
public Set<UserRole> getUserRoles() {
return this.userRoles;
}
public void setUserRoles(Set<UserRole> userRoles) {
this.userRoles = userRoles;
}
/**
* @return the active
*/
public boolean isActive() {
return active;
}
/**
* @param active the active to set
*/
public void setActive(boolean active) {
this.active = active;
}
/**
* @return the projectAssignments
*/
public Set<ProjectAssignment> getProjectAssignments() {
return projectAssignments;
}
/**
* @param projectAssignments the projectAssignments to set
*/
public void setProjectAssignments(Set<ProjectAssignment> projectAssignments) {
this.projectAssignments = projectAssignments;
}
/**
* @return the inactiveProjectAssignments
*/
public Set<ProjectAssignment> getInactiveProjectAssignments() {
return inactiveProjectAssignments;
}
public void addProjectAssignment(ProjectAssignment projectAssignment) {
if (projectAssignments == null) {
projectAssignments = new HashSet<>();
}
projectAssignments.add(projectAssignment);
}
/**
* @param inactiveProjectAssignments the inactiveProjectAssignments to set
*/
public void setInactiveProjectAssignments(Set<ProjectAssignment> inactiveProjectAssignments) {
this.inactiveProjectAssignments = inactiveProjectAssignments;
}
@Override
public Integer getPK() {
return userId;
}
@Override
public String toString() {
return new ToStringBuilder(this).append("userId", getUserId())
.append("username", getUsername())
.append("lastName", getLastName())
.append("firstName", getFirstName())
.toString();
}
/**
* @see java.lang.Comparable#compareTo(Object)
*/
public int compareTo(User object) {
return new CompareToBuilder()
.append(this.getLastName(), object.getLastName())
.append(this.getFirstName(), object.getFirstName())
.append(this.getUserId(), object.getUserId())
.toComparison();
}
/**
* @return the deletable
*/
public boolean isDeletable() {
return deletable;
}
/**
* @param deletable the deletable to set
*/
public void setDeletable(boolean deletable) {
this.deletable = deletable;
}
/**
* @return the salt
*/
public Integer getSalt() {
return salt;
}
/**
* @param salt the salt to set
*/
public void setSalt(Integer salt) {
this.salt = salt;
}
/**
* @return the updatedPassword
*/
public String getUpdatedPassword() {
return updatedPassword;
}
/**
* @param updatedPassword the updatedPassword to set
*/
public void setUpdatedPassword(String updatedPassword) {
this.updatedPassword = updatedPassword;
}
@Override
public boolean equals(final Object other) {
if (!(other instanceof User)) {
return false;
}
User castOther = (User) other;
return new EqualsBuilder()
.append(username, castOther.username)
.append(firstName, castOther.firstName)
.append(lastName, castOther.lastName)
.append(email, castOther.email)
.append(active, castOther.active)
.isEquals();
}
@Override
public int hashCode() {
return new HashCodeBuilder().append(username).append(firstName).append(lastName).append(email).append(active).toHashCode();
}
}