package co.id.security.model;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.compass.annotations.Searchable;
import org.compass.annotations.SearchableComponent;
import org.compass.annotations.SearchableProperty;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import javax.persistence.*;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
/**
* This class represents the basic "user" object in AppFuse that allows for authentication
* and user management. It implements Acegi Security's UserDetails interface.
*
* @author Matt Raible
* Updated by Dan Kibler (dan@getrolling.com)
* Extended to implement Acegi UserDetails interface
* by David Carter david@carter.net
*/
@Entity
@Table(name = "t_user")
@Searchable
@XmlRootElement
public class User extends BaseObject implements Serializable, UserDetails {
private static final long serialVersionUID = 3832626162173359411L;
@EmbeddedId
private UserPK userPK;
//private Long id;
private String username; // required
private String password; // required
private String confirmPassword;
private String passwordHint;
private String firstName; // required
private String lastName; // required
private String email; // required; unique
private String phoneNumber;
private String website;
private Address address = new Address();
private Integer version;
private Set roles = new LinkedHashSet();
private boolean enabled;
private boolean accountExpired;
private boolean accountLocked;
private boolean credentialsExpired;
/**
* 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;
}
@Column(nullable = false, length = 50, unique = true)
@SearchableProperty
public String getUsername() {
return username;
}
@Column(nullable = false)
@XmlTransient
public String getPassword() {
return password;
}
@Transient
@XmlTransient
public String getConfirmPassword() {
return confirmPassword;
}
@Column(name = "password_hint")
@XmlTransient
public String getPasswordHint() {
return passwordHint;
}
@Column(name = "first_name", nullable = false, length = 50)
@SearchableProperty
public String getFirstName() {
return firstName;
}
@Column(name = "last_name", nullable = false, length = 50)
@SearchableProperty
public String getLastName() {
return lastName;
}
@Column(nullable = false, unique = true)
@SearchableProperty
public String getEmail() {
return email;
}
@Column(name = "phone_number")
@SearchableProperty
public String getPhoneNumber() {
return phoneNumber;
}
@SearchableProperty
public String getWebsite() {
return website;
}
/**
* Returns the full name.
*
* @return firstName + ' ' + lastName
*/
@Transient
public String getFullName() {
return firstName + ' ' + lastName;
}
@Embedded
@SearchableComponent
public Address getAddress() {
return address;
}
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
@JoinTable(
name = "t_user_role",
joinColumns = {@JoinColumn(name = "user_id"), @JoinColumn(name = "broker_code")},
inverseJoinColumns = {@JoinColumn(name = "user_id"), @JoinColumn(name = "broker_code")}
)
public Set getRoles() {
return roles;
}
/**
* Convert user roles to LabelValue objects for convenience.
*
* @return a list of LabelValue objects with role information
*/
@Transient
public List getRoleList() {
List userRoles = new ArrayList();
if (this.roles != null) {
for (Role role : roles) {
// convert the user's roles to LabelValue Objects
userRoles.add(new LabelValue(role.getName(), role.getName()));
}
}
return userRoles;
}
/**
* Adds a role for the user
*
* @param role the fully instantiated role
*/
public void addRole(Role role) {
getRoles().add(role);
}
/**
* @return GrantedAuthority[] an array of roles.
* @see org.springframework.security.core.userdetails.UserDetails#getAuthorities()
*/
@Transient
public Set getAuthorities() {
Set authorities = new LinkedHashSet();
authorities.addAll(roles);
return authorities;
}
@Version
public Integer getVersion() {
return version;
}
@Column(name = "account_enabled")
public boolean isEnabled() {
return enabled;
}
@Column(name = "account_expired", nullable = false)
public boolean isAccountExpired() {
return accountExpired;
}
/**
* @return true if account is still active
* @see org.springframework.security.core.userdetails.UserDetails#isAccountNonExpired()
*/
@Transient
public boolean isAccountNonExpired() {
return !isAccountExpired();
}
@Column(name = "account_locked", nullable = false)
public boolean isAccountLocked() {
return accountLocked;
}
/**
* @return false if account is locked
* @see org.springframework.security.core.userdetails.UserDetails#isAccountNonLocked()
*/
@Transient
public boolean isAccountNonLocked() {
return !isAccountLocked();
}
@Column(name = "credentials_expired", nullable = false)
public boolean isCredentialsExpired() {
return credentialsExpired;
}
/**
* @return true if credentials haven't expired
* @see org.springframework.security.core.userdetails.UserDetails#isCredentialsNonExpired()
*/
@Transient
public boolean isCredentialsNonExpired() {
return !credentialsExpired;
}
//public void setId(Long id) {
// this.id = id;
//}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public void setConfirmPassword(String confirmPassword) {
this.confirmPassword = confirmPassword;
}
public void setPasswordHint(String passwordHint) {
this.passwordHint = passwordHint;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public void setEmail(String email) {
this.email = email;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public void setWebsite(String website) {
this.website = website;
}
public void setAddress(Address address) {
this.address = address;
}
public void setRoles(Set roles) {
this.roles = roles;
}
public void setVersion(Integer version) {
this.version = version;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
public void setAccountExpired(boolean accountExpired) {
this.accountExpired = accountExpired;
}
public void setAccountLocked(boolean accountLocked) {
this.accountLocked = accountLocked;
}
public void setCredentialsExpired(boolean credentialsExpired) {
this.credentialsExpired = credentialsExpired;
}
//public String getBrokerCode() {
// return brokerCode;
//}
//public void setBrokerCode(String brokerCode) {
// this.brokerCode = brokerCode;
//}
/**
* {@inheritDoc}
*/
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}
*/
public int hashCode() {
return (username != null ? username.hashCode() : 0);
}
@Override
public String toString() {
return new ToStringBuilder(this).
append("userPK", userPK.toString()).
append("username", username).
append("password", password).
append("confirmPassword", confirmPassword).
append("passwordHint", passwordHint).
append("firstName", firstName).
append("lastName", lastName).
append("email", email).
append("phoneNumber", phoneNumber).
append("website", website).
append("address", address).
append("version", version).
append("roles", roles.toString()).
append("enabled", enabled).
append("accountExpired", accountExpired).
append("accountLocked", accountLocked).
append("credentialsExpired", credentialsExpired).
toString();
}
public UserPK getUserPK() {
return userPK;
}
public void setUserPK(UserPK userPK) {
this.userPK = userPK;
}
}