package fr.openwide.core.jpa.security.business.person.model;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.MappedSuperclass;
import javax.persistence.Transient;
import org.bindgen.Bindable;
import org.hibernate.search.annotations.Analyzer;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.Fields;
import org.hibernate.search.annotations.SortableField;
import com.fasterxml.jackson.annotation.JsonIgnore;
import fr.openwide.core.jpa.search.util.HibernateSearchAnalyzer;
import fr.openwide.core.spring.notification.model.INotificationRecipient;
@MappedSuperclass
@Bindable
public abstract class GenericSimpleUser<U extends GenericSimpleUser<U, G>, G extends GenericUserGroup<G, U>>
extends GenericUser<U, G>
implements ISimpleUser, INotificationRecipient {
private static final long serialVersionUID = 4869548461178261021L;
public static final String FIRST_NAME_SORT_FIELD_NAME = "firstNameSort";
public static final String LAST_NAME_SORT_FIELD_NAME = "lastNameSort";
@Column(nullable = false)
@Fields({
@Field(analyzer = @Analyzer(definition = HibernateSearchAnalyzer.TEXT)),
@Field(name = FIRST_NAME_SORT_FIELD_NAME, analyzer = @Analyzer(definition = HibernateSearchAnalyzer.TEXT_SORT))
})
@SortableField(forField = FIRST_NAME_SORT_FIELD_NAME)
private String firstName;
@Column(nullable = false)
@Fields({
@Field(analyzer = @Analyzer(definition = HibernateSearchAnalyzer.TEXT)),
@Field(name = LAST_NAME_SORT_FIELD_NAME, analyzer = @Analyzer(definition = HibernateSearchAnalyzer.TEXT_SORT))
})
@SortableField(forField = LAST_NAME_SORT_FIELD_NAME)
private String lastName;
@Field(analyzer = @Analyzer(definition = HibernateSearchAnalyzer.TEXT))
private String email;
private String phoneNumber;
private String gsmNumber;
private String faxNumber;
public GenericSimpleUser() {
super();
}
public GenericSimpleUser(String userName, String firstName, String lastName, String passwordHash) {
super(userName, passwordHash);
setFirstName(firstName);
setLastName(lastName);
}
/*
* Works around a bindgen bug, where bindgen seems unable to substitute a concrete type to the "G" type parameter if we don't override this method here.
*/
@Override
public Set<G> getGroups() {
return super.getGroups(); //NOSONAR
}
@Override
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
@Override
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
@Transient
@Override
public String getFullName() {
StringBuilder builder = new StringBuilder();
if(firstName != null) {
builder.append(firstName);
builder.append(" ");
}
if(lastName != null && !lastName.equalsIgnoreCase(firstName)) {
builder.append(lastName);
}
return builder.toString().trim();
}
@Override
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public void setGsmNumber(String gsmNumber) {
this.gsmNumber = gsmNumber;
}
public String getGsmNumber() {
return gsmNumber;
}
public String getFaxNumber() {
return faxNumber;
}
public void setFaxNumber(String faxNumber) {
this.faxNumber = faxNumber;
}
@Override
public int compareTo(U user) {
if(this.equals(user)) {
return 0;
}
if(DEFAULT_STRING_COLLATOR.compare(this.getLastName(), user.getLastName()) == 0) {
return DEFAULT_STRING_COLLATOR.compare(this.getFirstName(), user.getFirstName());
}
return DEFAULT_STRING_COLLATOR.compare(this.getLastName(), user.getLastName());
}
@Override
@Transient
@JsonIgnore
public boolean isNotificationEnabled() {
// implémentation par défaut ; dépend de l'état de l'utilisateur
return isActive();
}
}