package fr.openwide.maven.artifact.notifier.core.business.user.model;
import java.util.Locale;
import javax.persistence.Cacheable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Transient;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.bindgen.Bindable;
import org.hibernate.annotations.Index;
import org.hibernate.search.annotations.DocumentId;
import org.hibernate.search.annotations.Indexed;
import com.fasterxml.jackson.annotation.JsonIgnore;
import fr.openwide.core.jpa.business.generic.model.GenericEntity;
import fr.openwide.core.spring.notification.model.INotificationRecipient;
@Indexed
@Bindable
@Cacheable
@Entity
public class EmailAddress extends GenericEntity<Long, EmailAddress> implements INotificationRecipient {
private static final long serialVersionUID = 8672835888543112706L;
@Id
@GeneratedValue
@DocumentId
private Long id;
@Column(nullable = false)
private String email;
@ManyToOne(fetch = FetchType.LAZY)
@Index(name = "idx_email_User_id")
private User user;
@Column(nullable = false)
@Enumerated(EnumType.STRING)
private EmailStatus status = EmailStatus.PENDING_CONFIRM;
@JsonIgnore
@Column(unique = true)
private String emailHash;
public EmailAddress() {
}
public EmailAddress(String email) {
this.email = email;
}
public EmailAddress copyForUser(User user) {
EmailAddress target = new EmailAddress();
target.setEmail(email);
target.setStatus(status);
target.setUser(user);
StringBuilder sb = new StringBuilder();
sb.append(RandomStringUtils.randomAscii(8))
.append(user.getId())
.append(email)
.append(user.getCreationDate());
target.setEmailHash(DigestUtils.sha1Hex(sb.toString()));
return target;
}
@Override
public Long getId() {
return id;
}
@Override
public void setId(Long id) {
this.id = id;
}
@Override
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public EmailStatus getStatus() {
return status;
}
public void setStatus(EmailStatus status) {
this.status = status;
}
public String getEmailHash() {
return emailHash;
}
public void setEmailHash(String emailHash) {
this.emailHash = emailHash;
}
@Override
public Locale getLocale() {
if (user != null) {
return user.getLocale();
}
return null;
}
@JsonIgnore
@Transient
@Override
public String getFullName() {
return getDisplayName();
}
@Override
@JsonIgnore
public String getNameForToString() {
return getDisplayName();
}
@Override
@JsonIgnore
public String getDisplayName() {
return email;
}
@Override
public int compareTo(EmailAddress other) {
if (this.equals(other)) {
return 0;
}
return this.email.compareTo(other.getEmail());
}
@Override
public boolean isNotificationEnabled() {
return true;
}
}