/*******************************************************************************
* ===========================================================
* Ankush : Big Data Cluster Management Solution
* ===========================================================
*
* (C) Copyright 2014, by Impetus Technologies
*
* This is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License (LGPL v3) as
* published by the Free Software Foundation;
*
* This software 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this software; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
******************************************************************************/
package com.impetus.ankush.common.domain;
import java.util.Date;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQuery;
import javax.persistence.PrePersist;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import javax.persistence.Version;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.annotate.JsonIgnoreProperties;
import org.codehaus.jackson.annotate.JsonProperty;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
/**
* This class represents the basic "user" object in AppFuse that allows for authentication and user management. It
* implements Acegi Security's UserDetails interface.
*
*/
@Entity
@Table(name = "ankush_user")
@NamedQuery(name="getUserByRole", query="select u FROM User u WHERE :role MEMBER OF u.roles")
@XmlRootElement
@JsonIgnoreProperties(value={"accountNonExpired", "accountNonLocked", "credentialsNonExpired", "forcePasswordChange"}, ignoreUnknown=true)
public class User extends BaseObject implements UserDetails {
/** The Constant serialVersionUID. */
private static final long serialVersionUID = 3832626162173359411L;
/** The id. */
private Long id;
/** The username. */
private String username; // required
/** The password. */
private String password; // required
/** The first name. */
private String firstName; // required
/** The last name. */
private String lastName; // required
/** The email. */
private String email; // required; unique
/** The mobile. */
private String mobile;
/** The version. */
private Integer version;
/** The roles. */
private Set<Role> roles = new HashSet<Role>();
/** The enabled. */
private boolean enabled;
/** The account expired. */
private boolean accountExpired;
/** The account locked. */
private boolean accountLocked;
/** The credentials expired. */
private boolean credentialsExpired;
/** The creation date. */
private Date creationDate;
/** The last login. */
private Date lastLogin;
/** The force password change. */
private Boolean forcePasswordChange;
/**
* Gets the force password change.
*
* @return the force password change
*/
public Boolean getForcePasswordChange() {
return forcePasswordChange;
}
/**
* Sets the force password change.
*
* @param forcePasswordChange the new force password change
*/
public void setForcePasswordChange(Boolean forcePasswordChange) {
this.forcePasswordChange = forcePasswordChange;
}
/** The user status. */
private String userStatus="None";
/**
* Default constructor - creates a new instance with no values set.
*/
public User() {
}
/**
* Create a new instance and set the username.
*
* @param username
* login name for user.
*/
public User(final String username) {
this.username = username;
}
/**
* Gets the id.
*
* @return the id
*/
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getId() {
return id;
}
/* (non-Javadoc)
* @see org.springframework.security.core.userdetails.UserDetails#getUsername()
*/
@Column(nullable = false, length = 50, unique = true)
public String getUsername() {
return username;
}
/* (non-Javadoc)
* @see org.springframework.security.core.userdetails.UserDetails#getPassword()
*/
@Column(nullable = false)
@XmlTransient
@JsonIgnore
public String getPassword() {
return password;
}
/**
* Gets the first name.
*
* @return the first name
*/
@Column(name = "first_name", nullable = false, length = 50)
public String getFirstName() {
return firstName;
}
/**
* Gets the last name.
*
* @return the last name
*/
@Column(name = "last_name", nullable = false, length = 50)
public String getLastName() {
return lastName;
}
/**
* Gets the email.
*
* @return the email
*/
@Column(nullable = false, unique = true)
public String getEmail() {
return email;
}
/**
* Returns the full name.
*
* @return firstName + ' ' + lastName
*/
@Transient
@JsonIgnore
public String getFullName() {
return firstName + ' ' + lastName;
}
/**
* Gets the roles.
*
* @return the roles
*/
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "user_role", joinColumns = { @JoinColumn(name = "user_id") }, inverseJoinColumns = @JoinColumn(name = "role_id"))
@JsonIgnore
public Set<Role> getRoles() {
return roles;
}
/**
* Adds a role for the user.
*
* @param role the fully instantiated role
*/
public void addRole(Role role) {
getRoles().add(role);
}
/**
* Gets the authorities.
*
* @return GrantedAuthority[] an array of roles.
* @see org.springframework.security.core.userdetails.UserDetails#getAuthorities()
*/
@JsonIgnore
@Transient
public Set<GrantedAuthority> getAuthorities() {
Set<GrantedAuthority> authorities = new LinkedHashSet<GrantedAuthority>();
authorities.addAll(roles);
return authorities;
}
/**
* Gets the version.
*
* @return the version
*/
@Version
@JsonIgnore
public Integer getVersion() {
return version;
}
/* (non-Javadoc)
* @see org.springframework.security.core.userdetails.UserDetails#isEnabled()
*/
@Column(name = "account_enabled")
public boolean isEnabled() {
return enabled;
}
/**
* Checks if is account expired.
*
* @return true, if is account expired
*/
@JsonIgnore
@Column(name = "account_expired", nullable = false)
public boolean isAccountExpired() {
return accountExpired;
}
/**
* Checks if is account non expired.
*
* @return true if account is still active
* @see org.springframework.security.core.userdetails.UserDetails#isAccountNonExpired()
*/
@JsonIgnore
@Transient
public boolean isAccountNonExpired() {
return !isAccountExpired();
}
/**
* Checks if is account locked.
*
* @return true, if is account locked
*/
@JsonIgnore
@Column(name = "account_locked", nullable = false)
public boolean isAccountLocked() {
return accountLocked;
}
/**
* Checks if is account non locked.
*
* @return false if account is locked
* @see org.springframework.security.core.userdetails.UserDetails#isAccountNonLocked()
*/
@JsonIgnore
@Transient
public boolean isAccountNonLocked() {
return !isAccountLocked();
}
/**
* Checks if is credentials expired.
*
* @return true, if is credentials expired
*/
@JsonIgnore
@Column(name = "credentials_expired", nullable = false)
public boolean isCredentialsExpired() {
return credentialsExpired;
}
/**
* Checks if is credentials non expired.
*
* @return true if credentials haven't expired
* @see org.springframework.security.core.userdetails.UserDetails#isCredentialsNonExpired()
*/
@JsonIgnore
@Transient
public boolean isCredentialsNonExpired() {
return !credentialsExpired;
}
/**
* Sets the id.
*
* @param id the new id
*/
public void setId(Long id) {
this.id = id;
}
/**
* Sets the username.
*
* @param username the new username
*/
public void setUsername(String username) {
this.username = username;
}
/**
* Sets the password.
*
* @param password the new password
*/
@JsonProperty
public void setPassword(String password) {
this.password = password;
}
/**
* Sets the first name.
*
* @param firstName the new first name
*/
public void setFirstName(String firstName) {
this.firstName = firstName;
}
/**
* Sets the last name.
*
* @param lastName the new last name
*/
public void setLastName(String lastName) {
this.lastName = lastName;
}
/**
* Sets the email.
*
* @param email the new email
*/
public void setEmail(String email) {
this.email = email;
}
/**
* Sets the roles.
*
* @param roles the new roles
*/
public void setRoles(Set<Role> roles) {
this.roles = roles;
}
/**
* Sets the version.
*
* @param version the new version
*/
public void setVersion(Integer version) {
this.version = version;
}
/**
* Sets the enabled.
*
* @param enabled the new enabled
*/
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
/**
* Sets the account expired.
*
* @param accountExpired the new account expired
*/
public void setAccountExpired(boolean accountExpired) {
this.accountExpired = accountExpired;
}
/**
* Sets the account locked.
*
* @param accountLocked the new account locked
*/
public void setAccountLocked(boolean accountLocked) {
this.accountLocked = accountLocked;
}
/**
* Sets the credentials expired.
*
* @param credentialsExpired the new credentials expired
*/
public void setCredentialsExpired(boolean credentialsExpired) {
this.credentialsExpired = credentialsExpired;
}
/**
* Gets the mobile.
*
* @return the mobile
*/
@JsonIgnore
@Column(length=20)
public String getMobile() {
return mobile;
}
/**
* Sets the mobile.
*
* @param mobile the new mobile
*/
public void setMobile(String mobile) {
this.mobile = mobile;
}
/**
* Gets the creation date.
*
* @return the creation date
*/
@JsonIgnore
@Column(updatable=false)
@Temporal(TemporalType.TIMESTAMP)
public Date getCreationDate() {
return creationDate;
}
/**
* Sets the creation date.
*
* @param creationDate the new creation date
*/
public void setCreationDate(Date creationDate) {
this.creationDate = creationDate;
}
/**
* Gets the last login.
*
* @return the last login
*/
@JsonIgnore
@Temporal(TemporalType.TIMESTAMP)
public Date getLastLogin() {
return lastLogin;
}
/**
* Sets the last login.
*
* @param lastLogin the new last login
*/
public void setLastLogin(Date lastLogin) {
this.lastLogin = lastLogin;
}
/**
* {@inheritDoc}
*/
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof User)) {
return false;
}
final User user = (User) o;
return !(username != null ? !username.equals(user.getUsername()) : user.getUsername() != null);
}
/**
* {@inheritDoc}
*/
@Override
public int hashCode() {
return (username != null ? username.hashCode() : 0);
}
/**
* {@inheritDoc}
*/
@Override
public String toString() {
ToStringBuilder sb = new ToStringBuilder(this.id, ToStringStyle.DEFAULT_STYLE).append("id", this.id)
.append("username", this.username).append("enabled", this.enabled).append("accountExpired", this.accountExpired)
.append("credentialsExpired", this.credentialsExpired).append("accountLocked", this.accountLocked);
if (roles != null) {
sb.append("Granted Authorities: ");
int i = 0;
for (Role role : roles) {
if (i > 0) {
sb.append(", ");
}
sb.append(role.toString());
i++;
}
} else {
sb.append("No Granted Authorities");
}
return sb.toString();
}
/**
* Sets the creation time.
*/
@PrePersist
public void setCreationTime() {
if (creationDate == null) {
creationDate = new Date();
}
}
/* (non-Javadoc)
* @see com.impetus.ankush.common.domain.BaseObject#merge(com.impetus.ankush.common.domain.BaseObject)
*/
@Override
public void merge(BaseObject baseObject) {
User user = (User) baseObject;
if(StringUtils.isNotBlank(user.getMobile())){
this.setMobile(user.getMobile());
}
if(StringUtils.isNotBlank(user.getEmail())){
this.setEmail(user.getEmail());
}
if(StringUtils.isNotBlank(user.getPassword())){
this.setPassword(user.getPassword());
}
if(StringUtils.isNotBlank(user.getFirstName())){
this.setFirstName(user.getFirstName());
}
if(StringUtils.isNotBlank(user.getLastName())){
this.setLastName(user.getLastName());
}
this.setEnabled(user.isEnabled());
super.merge(baseObject);
}
/**
* Gets the user status.
*
* @return the userStatus
*/
//@JsonIgnore
@Transient
public String getUserStatus() {
return userStatus;
}
/**
* Sets the user status.
*
* @param userStatus the userStatus to set
*/
public void setUserStatus(String userStatus) {
this.userStatus = userStatus;
}
}