package de.skuzzle.polly.core.internal.users;
import java.io.Serializable;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Transient;
import de.skuzzle.polly.core.internal.roles.Role;
import de.skuzzle.polly.core.util.Hashes;
import de.skuzzle.polly.sdk.Types;
import de.skuzzle.polly.sdk.exceptions.UnknownAttributeException;
import de.skuzzle.polly.sdk.time.Time;
@Entity(name = "User")
@NamedQueries({
@NamedQuery(
name = "USER_BY_NAME",
query = "SELECT u FROM User u WHERE u.name=?1"),
@NamedQuery(
name = "ALL_USERS",
query = "SELECT u FROM User u")
})
public class UserImpl implements de.skuzzle.polly.sdk.User, Serializable {
private static final long serialVersionUID = 1L;
public final static String ALL_USERS = "ALL_USERS"; //$NON-NLS-1$
@Id@GeneratedValue(strategy = GenerationType.TABLE)
private int id;
// XXX: this field is outdated and exists only for database compatabilty
@SuppressWarnings("unused")
private int userLevel;
@Column(unique = true, columnDefinition = "VARCHAR(255)")
private String name;
@Column(columnDefinition = "VARCHAR(32)")
private String password;
@OneToMany
private Set<Role> roles;
@ElementCollection(targetClass=String.class)
@ManyToMany(cascade = CascadeType.ALL)
private Map<String, String> attributes;
@Transient
private String currentNickName;
@Transient
private long lastActionTimeStamp;
@Transient
private long loginTime;
@Transient
private long lastIdleTimeStamp;
@Transient
private boolean isPollyAdmin;
@Transient
private UserManagerImpl userManager;
UserImpl() {
this("", ""); //$NON-NLS-1$ //$NON-NLS-2$
}
UserImpl(String name, String password) {
this.name = name;
this.password = Hashes.md5(password);
this.attributes = new HashMap<String, String>();
this.lastActionTimeStamp = Time.currentTimeMillis();
this.roles = new HashSet<Role>();
this.lastIdleTimeStamp = Time.currentTimeMillis();
}
public UserImpl setUserManager(UserManagerImpl userManager) {
this.userManager = userManager;
return this;
}
public int getId() {
return this.id;
}
public Set<Role> getRoles() {
return this.roles;
}
@Override
public String getCurrentNickName() {
return this.currentNickName;
}
@Override
public boolean checkPassword(String password) {
return this.password.equals(Hashes.md5(password));
}
@Override
public void setPassword(String password) {
this.password = Hashes.md5(password);
}
@Override
public String getName() {
return this.name;
}
@Override
public void setName(String name) {
this.name = name;
}
@Override
public void setCurrentNickName(String nickName) {
this.currentNickName = nickName;
}
@Override
public String getHashedPassword() {
return this.password;
}
@Override
public void setHashedPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return this.name;
}
public Map<String, String> getAttributes() {
return this.attributes;
}
@Override
public Set<String> getAttributeNames() {
return Collections.unmodifiableSet(this.attributes.keySet());
}
@Override
public Types getAttribute(String name) {
synchronized (this.attributes) {
if (!this.attributes.containsKey(name)) {
throw new UnknownAttributeException(name);
}
return this.userManager.parseValue(null, this.attributes.get(name));
}
}
void setAttribute(String name, Types value) {
synchronized (this.attributes) {
if (!this.attributes.containsKey(name)) {
throw new UnknownAttributeException(name);
}
this.attributes.put(name, value.valueString(
this.userManager.getPersistenceFormatter()));
}
}
@Override
public void setLastMessageTime(long timeStamp) {
this.lastIdleTimeStamp = this.lastActionTimeStamp;
this.lastActionTimeStamp = timeStamp;
}
@Override
public long getLastMessageTime() {
return this.lastActionTimeStamp;
}
@Override
public long getLastIdleTime() {
return this.lastIdleTimeStamp;
}
@Override
public boolean isPollyAdmin() {
return this.isPollyAdmin;
}
public void setIsPollyAdmin(boolean isAdmin) {
this.isPollyAdmin = isAdmin;
}
@Override
public boolean isIdle() {
return Time.currentTimeMillis() - this.lastActionTimeStamp > IDLE_AFTER;
}
@Override
public long getLoginTime() {
return this.loginTime;
}
public void setLoginTime(long timeStamp) {
this.loginTime = timeStamp;
}
@Override
public int compareTo(de.skuzzle.polly.sdk.User o) {
return o.getName().compareTo(this.getName());
}
}