package org.simbasecurity.dwclient.domain.user;
import java.io.Serializable;
import java.util.Calendar;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Version;
import org.apache.commons.lang.time.DateUtils;
import org.apache.commons.pool.ObjectPool;
import org.apache.commons.pool.impl.StackObjectPool;
import org.jasypt.util.password.PasswordEncryptor;
import org.simbasecurity.core.domain.Language;
import org.simbasecurity.core.domain.Status;
import org.simbasecurity.core.util.PasswordEncryptorFactory;
import com.google.common.base.Objects;
@Entity
@Table(name = "SIMBA_USER")
public class SimbaUser implements Serializable {
private static final long serialVersionUID = -5502374573813758067L;
@Version
private int version;
public int getVersion() {
return version;
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected long id = 0;
@Column(unique = true)
private String userName;
@Column(name = "NAME")
private String name;
@Column(name = "FIRSTNAME")
private String firstName;
@Enumerated(EnumType.STRING)
private Status status;
@Column(name = "INACTIVEDATE")
private Date inactiveDate;
@Column(name = "SUCCESSURL")
private String successURL;
@Column(name = "PASSWORD", nullable = false)
private String password;
@Column(name = "CHANGEPASSWORDONNEXTLOGON")
private boolean changePasswordOnNextLogon;
@Column(name = "PASSWORDCHANGEREQUIRED")
private boolean passwordChangeRequired;
@Column(name = "DATABASELOGINBLOCKED")
private boolean databaseLoginBlocked;
@Column(name = "DATEOFLASTPASSWORDCHANGE")
private Date dateOfLastPasswordChange;
@Column(name = "INVALIDLOGINCOUNT")
private int invalidLoginCount;
@Enumerated(EnumType.STRING)
private Language language;
@SuppressWarnings("unchecked")
private static final ObjectPool<PasswordEncryptor> ENCRYPTOR_POOL = new StackObjectPool<PasswordEncryptor>(new PasswordEncryptorFactory(), 2, 2);
private static PasswordEncryptor retrievePasswordEncryptor() {
try {
return ENCRYPTOR_POOL.borrowObject();
} catch (Exception e) {
throw new RuntimeException("Unable to borrow buffer from pool" + e.toString());
}
}
private static void returnPasswordEncryptor(PasswordEncryptor encryptor) {
try {
ENCRYPTOR_POOL.returnObject(encryptor);
} catch (Exception ignore) {
}
}
@SuppressWarnings("unused")
private SimbaUser() {
}
public SimbaUser(String emailAddress, String password) {
this.userName = emailAddress;
this.changePasswordOnNextLogon = false;
this.databaseLoginBlocked = false;
this.language = Language.en_US;
this.status = Status.ACTIVE;
setPassword(password);
}
public void setPassword(String password) {
PasswordEncryptor encryptor = retrievePasswordEncryptor();
try {
this.password = encryptor.encryptPassword(password);
} finally {
returnPasswordEncryptor(encryptor);
}
this.dateOfLastPasswordChange = DateUtils.truncate(new Date(), Calendar.DAY_OF_MONTH);
}
public String getUserName() {
return userName;
}
public String getPassword() {
return password;
}
public Language getLanguage() {
return language;
}
public Status getStatus() {
return status;
}
@Override
public int hashCode() {
return Objects.hashCode(userName, password);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
SimbaUser other = (SimbaUser) obj;
return Objects.equal(userName, other.userName)
&& Objects.equal(password, other.password);
}
}