package pl.net.bluesoft.rnd.processtool.model;
//import org.hibernate.annotations.OnDelete;
//import org.hibernate.annotations.OnDeleteAction;
import static pl.net.bluesoft.util.lang.FormatUtil.join;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import javax.persistence.*;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.Parameter;
import javax.persistence.Table;
import org.hibernate.annotations.*;
import pl.net.bluesoft.util.lang.Collections;
import pl.net.bluesoft.util.lang.Predicate;
import pl.net.bluesoft.util.lang.Transformer;
/**
* @author tlipski@bluesoft.net.pl
*/
@Entity
@Table(name="pt_user_data")
public class UserData extends UserAttributesSupport {
@Id
@GeneratedValue(generator = "idGenerator")
@GenericGenerator(
name = "idGenerator",
strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
parameters = {
@org.hibernate.annotations.Parameter(name = "initial_value", value = "" + 1),
@org.hibernate.annotations.Parameter(name = "value_column", value = "_DB_ID"),
@org.hibernate.annotations.Parameter(name = "sequence_name", value = "DB_SEQ_ID_USER_DATA")
}
)
@Column(name = "id")
protected Long id;
@Column(unique = true)
private String login;
private String firstName;
private String lastName;
private String email;
private String jobTitle;
private String company;
private String department;
private String superior;
private Long companyId;
private Long liferayUserId;
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
private Set<UserAttribute> attributes;
@Transient
private Set<UserAttribute> orphans;
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
private Set<UserRole> roles;
public UserData() {
}
public UserData(String login, String realName, String email) {
this.login = login;
this.email = email;
String[] names = realName.split("\\s", 2);
if (names.length == 2) {
this.firstName = names[0];
this.lastName = names[1];
}
else if (names.length == 1) {
this.firstName = "";
this.lastName = names[0];
}
}
public UserData(String login, String firstName, String lastName, String email) {
this.login = login;
this.email = email;
this.firstName = firstName;
this.lastName = lastName;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Set<String> getMainAttributeKeys() {
return getMainAttributesMap().keySet();
}
public Set<UserAttribute> getMainAttributes() {
return Collections.filter(getAttributes(), new Predicate<UserAttribute>() {
@Override
public boolean apply(UserAttribute input) {
return input.getParent() == null;
}
}, new HashSet<UserAttribute>());
}
public Map<String, UserAttribute> getMainAttributesMap() {
return Collections.transform(getAttributes(), new Transformer<UserAttribute, String>() {
@Override
public String transform(UserAttribute obj) {
return obj.getParent() == null ? obj.getKey() : null;
}
});
}
@Override
public UserAttribute findAttribute(final String key) {
return findAttribute(getMainAttributes(), UserAttributePredicates.matchKey(key));
}
@Override
public UserAttribute findAttribute(final String key, final String value) {
return findAttribute(getMainAttributes(), UserAttributePredicates.matchKeyValue(key, value));
}
void addChild(UserAttribute a) {
if (!getAttributes().contains(a)) {
getAttributes().add(a);
}
if (!a.getAttributes().isEmpty()) {
for (UserAttribute b : a.getAttributes()) {
addChild(b);
}
}
getOrphans().remove(a);
}
@Override
public UserData getUser() {
return this;
}
void addOrphan(UserAttribute a) {
getAttributes().remove(a);
if (a.getId() != null) {
getOrphans().add(a);
}
}
public Set<UserAttribute> getOrphans() {
return orphans != null ? orphans : (orphans = new HashSet<UserAttribute>());
}
public void setOrphans(Set<UserAttribute> orphans) {
this.orphans = orphans;
}
public void removeAllOrphans() {
if (orphans != null) {
orphans.clear();
}
}
public Set<UserAttribute> getAttributes() {
return attributes != null ? attributes : (attributes = new HashSet<UserAttribute>());
}
public void setAttributes(Set<UserAttribute> attributes) {
this.attributes = attributes;
}
public Set<UserRole> getRoles() {
return roles != null ? roles : (roles = new HashSet<UserRole>());
}
public void setRoles(Set<UserRole> roles) {
this.roles = roles;
}
public Set<String> getRoleNames() {
return Collections.collect(getRoles(), new Transformer<UserRole, String>() {
@Override
public String transform(UserRole obj) {
return obj.getName();
}
}, new HashSet<String>());
}
public void setRoleNames(Set<String> roleNames) {
Set<String> existingRoles = new HashSet<String>();
for (Iterator<UserRole> it = getRoles().iterator(); it.hasNext(); ) {
UserRole role = it.next();
if (!roleNames.contains(role.getName())) {
it.remove();
}
else {
existingRoles.add(role.getName());
}
}
for (String name : roleNames) {
if (!existingRoles.contains(name)) {
addRoleName(name);
}
}
}
public void addRoleName(String name) {
addRoleName(name, null);
}
public void addRoleName(String name, String description) {
UserRole role = null;
for (UserRole r : getRoles()) {
if (r.getName().equals(name)) {
role = r;
break;
}
}
if (role == null) {
role = new UserRole(this, name, description);
getRoles().add(role);
}
else {
role.setName(name);
role.setDescription(description);
}
}
public boolean containsRole(String roleName) {
return getRoleNames().contains(roleName);
}
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getRealName() {
return join(" ", firstName, lastName);
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getLastName() {
return lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public void setCompany(String company) {
this.company = company;
}
public String getJobTitle() {
return jobTitle;
}
public void setJobTitle(String jobTitle) {
this.jobTitle = jobTitle;
}
public Long getCompanyId() {
return companyId;
}
public void setCompanyId(Long companyId) {
this.companyId = companyId;
}
public Long getLiferayUserId() {
return liferayUserId;
}
public void setLiferayUserId(Long liferayUserId) {
this.liferayUserId = liferayUserId;
}
/**
* Name used in comboboxes to find user
* @return
*/
public String getFilteredName() {
return firstName + " " + lastName + " (" + login + ")";
}
@Override
public String toString() {
return "UserData [login=" + login + ", getRealName()=" + getRealName() + "]";
}
}