package uk.ac.cam.echo.server.models;
import org.codehaus.jackson.annotate.JsonCreator;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.annotate.JsonProperty;
import org.codehaus.jackson.map.annotate.JsonSerialize;
import org.hibernate.annotations.*;
import org.hibernate.annotations.CascadeType;
import uk.ac.cam.echo.data.Conversation;
import uk.ac.cam.echo.data.Interest;
import uk.ac.cam.echo.data.User;
import uk.ac.cam.echo.server.GravatarUtil;
import uk.ac.cam.echo.server.HibernateUtil;
import javax.persistence.*;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Map;
import java.util.Set;
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
@Entity
@Table(name="UserTable")
public class UserModel extends BaseModel implements User {
public UserModel() {
}
public static String hashPassword(String password) {
try {
byte[] hash = MessageDigest.getInstance("SHA-512").digest(password.getBytes());
StringBuffer sb = new StringBuffer();
for(byte b : hash) {
sb.append(String.format("%02x", b));
}
return sb.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
}
private static String[] allowed = {
"username",
"password",
"currentConversationId",
"firstName",
"lastName",
"phoneNumber",
//"avatarLink",
"email",
"jobTitle",
"company",
"gender"
};
@JsonCreator
public UserModel(Map<String, Object> props) {
super(props, allowed);
}
@Id
@GeneratedValue(strategy= GenerationType.SEQUENCE, generator="UserIdSeq")
@SequenceGenerator(name="UserIdSeq", sequenceName="USER_SEQ", allocationSize=1)
private long id;
private String username;
private String hashedPassword;
@ManyToOne(targetEntity = ConversationModel.class)
@Cascade({org.hibernate.annotations.CascadeType.ALL})
private Conversation currentConversation;
private String firstName;
private String lastName;
private String phoneNumber;
//private String avatarLink;
private String email;
private String jobTitle;
private String company;
private String gender;
@OneToMany(targetEntity = InterestModel.class, mappedBy = "user")
private Set<Interest> interests;
@Transient
public String getDisplayName() {
if (getFirstName() == null && getLastName() == null)
return null;
if (getFirstName() == null)
return getLastName();
if (getLastName() == null)
return getFirstName();
return getFirstName() + " " + getLastName();
}
/* Getters and Setters */
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@JsonIgnore
public Conversation getCurrentConversation() {
return currentConversation;
}
public Long getCurrentConversationId() {
return getCurrentConversation() == null ? null : getCurrentConversation().getId();
}
public void setCurrentConversation(Conversation currentConversation) {
this.currentConversation = currentConversation;
}
public void setCurrentConversationId(Long id) {
if (id == null)
setCurrentConversation(null);
else
setCurrentConversation((Conversation) HibernateUtil.getSession().load(ConversationModel.class, id));
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
@Transient
public String getAvatarLink() {
return GravatarUtil.getUrl(this);
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getJobTitle() {
return jobTitle;
}
public void setJobTitle(String jobTitle) {
this.jobTitle = jobTitle;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@JsonIgnore
public String getHashedPassword() {
return hashedPassword;
}
public void setHashedPassword(String hashedPassword) {
this.hashedPassword = hashedPassword;
}
@Transient
@JsonProperty
public void setPassword(String password) {
setHashedPassword(hashPassword(password));
}
public Set<Interest> getInterests() {
return interests;
}
public void setInterests(Set<Interest> interests) {
this.interests = interests;
}
}