package models;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.Transient;
import annotations.Birthday;
import constraints.BeforeDate;
import constraints.validators.BeforeDateValidator;
import play.Logger;
import play.data.validation.Constraints.MaxLength;
import play.data.validation.Constraints.MinLength;
import play.data.validation.Constraints.Required;
import play.data.validation.Constraints.Pattern;
import play.data.validation.ValidationError;
import services.ServicesInstances;
import services.UserService;
import static javax.persistence.GenerationType.IDENTITY;
import static javax.persistence.TemporalType.*;
@Entity
@Table(name="users")
public class User {
private int id;
// TODO : move all hard-coded messages into .properties file as in Spring
@Required(message = "Login is mandatory field")
@MinLength(value = 5, message = "Login must be at least 5-characters text")
@MaxLength(value = 10, message = "Login can be 10-characters max length")
@Pattern(value = "[a-z0-9\\-]+", message = "Only alphanumerical lower case characters and - are allowed in this field.")
private String login;
@Required(message = "Password is mandatory field")
private String password;
@BeforeDate(dateToCompare = BeforeDateValidator.NOW, message = "Register date can't be in the future")
private Date birthday;
private Date createdTime;
private int major;
/**
* This is a ad-hoc validation method, invoked only when the "basic" validation (ie. annotation-based) hasn't errors.
*
* @return List of ValidationError. Returns null when they're no errors.
*/
public List<ValidationError> validate() {
Logger.debug("Validating user on validate() method");
UserService userService = (UserService) ServicesInstances.USER_SERVICE.getService();
boolean isUniqueLogin = userService.isUniqueLogin(this.login);
if (!isUniqueLogin) {
List<ValidationError> errors = new ArrayList<ValidationError>();
errors.add(new ValidationError("login", "This login already exists"));
return errors;
}
return null;
}
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name="id")
public int getId() {
return this.id;
}
@Column(name="login")
public String getLogin() {
return this.login;
}
@Column(name="passa")
public String getPassword() {
return this.password;
}
@Temporal(TIMESTAMP)
@Column(name="created")
public Date getCreatedTime() {
if (this.createdTime == null) {
setCreatedTime(new Date());
}
return this.createdTime;
}
@Temporal(DATE)
@Column(name="birthday")
@Birthday
public Date getBirthday() {
return this.birthday;
}
@Column(name="major")
public int getMajor() {
return this.major;
}
@Transient
public String getSalt() {
return String.valueOf(this.login.charAt(4))+this.birthday.getTime()+String.valueOf(this.login.charAt(0));
}
public void setId(int id) {
this.id = id;
}
public void setLogin(String login) {
this.login = login;
}
public void setPassword(String password) {
this.password = password;
}
public void setCreatedTime(Date createdTime) {
this.createdTime = createdTime;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public void setMajor(int major) {
this.major = major;
}
@Transient
public boolean isMajor() {
return this.major == 1;
}
@Override
public String toString() {
return "User {id: "+this.id+", login: "+this.login+", is major: "+this.isMajor()+"}";
}
}