package com.syzton.sunread.model.user; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.persistence.Column; import javax.persistence.DiscriminatorColumn; import javax.persistence.DiscriminatorType; import javax.persistence.DiscriminatorValue; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.FetchType; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.PrePersist; import javax.persistence.Table; import javax.persistence.Transient; import org.hibernate.annotations.Type; import org.hibernate.validator.constraints.NotEmpty; import org.hibernate.validator.constraints.Range; import org.joda.time.DateTime; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.syzton.sunread.model.common.AbstractEntity; import com.syzton.sunread.model.security.Role; import com.syzton.sunread.util.DateSerializer; /** * Created by jerry on 3/16/15. */ @Entity @Table(name="users") @Inheritance(strategy=InheritanceType.JOINED) @DiscriminatorColumn(name="TYPE", discriminatorType=DiscriminatorType.STRING,length=10) @DiscriminatorValue("U") public class User extends AbstractEntity implements UserDetails{ public static final int MAX_LENGTH_USERNAME = 15; public static final int MAX_LENGTH_PASSWORD = 128; public static final int MAX_LENGTH_NICKNAME = 15; public static final int MAX_LENGTH_PHONENUMBER = 11; public static final int MAX_LENGTH_ADDRESS = 100; public static final String DEFAULT_USER_PICTURE_URL =""; @NotEmpty @Column(nullable = false,length = MAX_LENGTH_USERNAME ) private String username; private String userId; private String picture = DEFAULT_USER_PICTURE_URL; @NotEmpty @Column(nullable = false,length = MAX_LENGTH_PASSWORD ) private String password; @Column(length = MAX_LENGTH_NICKNAME ) private String nickname; @Range(max = 130) private int age; @NotEmpty @Column(nullable = false,length = MAX_LENGTH_PHONENUMBER) private String phoneNumber; private String contactPhone; @JsonIgnore @Column(name = "birthday") @JsonSerialize(using = DateSerializer.class) @Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime") private DateTime birthdayDB; @Transient private long birthday; @JsonIgnore @Column(name="expireTime") @JsonSerialize(using = DateSerializer.class) @Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime") private DateTime expireTimeDB; @Transient private long expireTime; @Enumerated(EnumType.STRING) private Status status = Status.valid; @Enumerated(EnumType.STRING) private GenderType gender = GenderType.male; @ManyToMany(fetch=FetchType.EAGER) @JoinTable(name="e_user_role", joinColumns={ @JoinColumn(name="u_id",referencedColumnName="id") }, inverseJoinColumns={ @JoinColumn(name="r_id",referencedColumnName="id") }) private List<Role> roles = new ArrayList<Role>(); private String email; @Column(length = MAX_LENGTH_ADDRESS) private String address; private String qqId; private String wechatId; private boolean enabled; private boolean accountNonExpired; private boolean accountNonLocked; private boolean credentialsNonExpired; @PrePersist public void prePersist(){ super.prePersist(); //this.userId = String.valueOf(NumberUtil.generateRandom16()); this.enabled = true; this.accountNonExpired = true; this.accountNonLocked = true; this.credentialsNonExpired = true; this.expireTimeDB = new DateTime(this.expireTime); this.birthdayDB = new DateTime(this.birthday); //TODO need to define user expireTime default value } public enum GenderType { male,famale } public enum Status { valid,invalid,locked } public String getContactPhone() { return contactPhone; } public void setContactPhone(String contactPhone) { this.contactPhone = contactPhone; } public String getPicture() { return picture; } public void setPicture(String picture) { this.picture = picture; } public Status getStatus() { return status; } public void setStatus(Status status) { this.status = status; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getPhoneNumber() { return phoneNumber; } public void setPhoneNumber(String phoneNumber) { this.phoneNumber = phoneNumber; } public GenderType getGender() { return gender; } public void setGender(GenderType gender) { this.gender = gender; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public void setRoles(List<Role> roles) { this.roles = roles; } public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; } public long getExpireTime() { return expireTime; } public void setExpireTime(long expireTime) { this.expireTime = expireTime; } @Override public Collection<? extends GrantedAuthority> getAuthorities() { Set<GrantedAuthority> authorities = new HashSet<GrantedAuthority>(); for( Role role : this.getRoles() ){ GrantedAuthority authority = new SimpleGrantedAuthority(role.getName()); authorities.add(authority); } return authorities; } @Transient @Override public boolean isAccountNonExpired() { return this.accountNonExpired; } @Transient @Override public boolean isAccountNonLocked() { return this.accountNonLocked; } @Transient @Override public boolean isCredentialsNonExpired() { return this.credentialsNonExpired; } @Transient @Override public boolean isEnabled() { return this.enabled; } public void setEnabled(boolean enabled) { this.enabled = enabled; } public void setAccountNonExpired(boolean accountNonExpired) { this.accountNonExpired = accountNonExpired; } public void setAccountNonLocked(boolean accountNonLocked) { this.accountNonLocked = accountNonLocked; } public void setCredentialsNonExpired(boolean credentialsNonExpired) { this.credentialsNonExpired = credentialsNonExpired; } public String getQqId() { return qqId; } public void setQqId(String qqId) { this.qqId = qqId; } public String getWechatId() { return wechatId; } public void setWechatId(String wechatId) { this.wechatId = wechatId; } public List<Role> getRoles() { return Collections.unmodifiableList(this.roles); } public void addRole(Role role) { this.roles.add(role); } public boolean hasRole(Role role) { return (this.roles.contains(role)); } }