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; } }