/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.ngrinder.model;
import com.google.gson.annotations.Expose;
import org.apache.commons.lang.StringUtils;
import org.hibernate.annotations.Type;
import javax.persistence.*;
import java.util.List;
import static org.ngrinder.common.util.AccessUtils.getSafe;
/**
* User managed by nGrinder.
*
* @author Mavlarn
* @since 3.0
*/
@Entity
@Table(name = "NUSER")
public class User extends BaseModel<User> {
private static final long serialVersionUID = 7398072895183814285L;
@Expose
@Column(name = "user_id", unique = true, nullable = false)
/** User Id */
private String userId;
@Expose
@Column(name = "user_name")
/** User Name e.g) Jone Dogh. */
private String userName;
private String password;
@Expose
@Type(type = "true_false")
@Column(columnDefinition = "char(1)")
private Boolean enabled;
@Expose
private String email;
@Expose
@Enumerated(EnumType.STRING)
@Column(name = "role_name", nullable = false)
private Role role;
@Expose
private String description;
@Expose
private String timeZone;
@Expose
@Column(name = "user_language")
private String userLanguage;
@Expose
@Column(name = "mobile_phone")
private String mobilePhone;
@Column(name = "is_external", columnDefinition = "char(1)")
@Type(type = "true_false")
private Boolean external;
@Column(name = "authentication_provider_class")
/** Who provide the authentication */
private String authProviderClass;
@Transient
private User follower;
@Expose
@Transient
private String followersStr;
@Transient
private User ownerUser;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "SHARED_USER", joinColumns = @JoinColumn(name = "owner_id"), // LF
inverseJoinColumns = @JoinColumn(name = "follow_id"))
private List<User> followers;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "SHARED_USER", joinColumns = @JoinColumn(name = "follow_id"), // LF
inverseJoinColumns = @JoinColumn(name = "owner_id"))
private List<User> owners;
/**
* Default constructor.
*/
public User() {
}
/**
* Constructor.
*
* @param userId user id
* @param name user name
* @param password password
* @param role role
* @deprecated
*/
public User(String userId, String name, String password, Role role) {
this.userId = userId;
this.password = password;
this.userName = name;
this.role = role;
isEnabled();
}
@PrePersist
@PreUpdate
public void init() {
this.userId = StringUtils.trim(this.userId);
this.userName = StringUtils.trim(this.userName);
this.email = StringUtils.trim(this.email);
this.mobilePhone = StringUtils.trim(this.mobilePhone);
this.enabled = getSafe(this.enabled, true);
this.external = getSafe(this.enabled);
this.role = getSafe(this.role, Role.USER);
}
public static User createNew() {
User user = new User();
user.init();
return user;
}
/**
* Constructor.
*
* @param userId user id
* @param name user name
* @param password password
* @param email email
* @param role role
*/
public User(String userId, String name, String password, String email, Role role) {
this.userId = userId;
this.password = password;
this.userName = name;
this.email = email;
this.role = role;
isEnabled();
}
/**
* Check this user is valid.
*
* @return true if valid
*/
public boolean validate() {
return !(userName == null || email == null);
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((userId == null) ? 0 : userId.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
User other = (User) obj;
if (userId == null) {
if (other.userId != null) {
return false;
}
} else if (!userId.equals(other.userId)) {
return false;
}
return true;
}
public String getMobilePhone() {
return mobilePhone;
}
public void setMobilePhone(String mobilePhone) {
this.mobilePhone = mobilePhone;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Boolean isEnabled() {
return enabled;
}
public void setEnabled(Boolean enabled) {
this.enabled = enabled;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email.toLowerCase();
}
public String getTimeZone() {
return timeZone;
}
public void setTimeZone(String timeZone) {
this.timeZone = timeZone;
}
public String getUserLanguage() {
return userLanguage;
}
public void setUserLanguage(String userLanguage) {
this.userLanguage = userLanguage;
}
public boolean isExternal() {
return external;
}
public void setExternal(boolean external) {
this.external = external;
}
public String getAuthProviderClass() {
return authProviderClass;
}
public void setAuthProviderClass(String authProviderClass) {
this.authProviderClass = authProviderClass;
}
public List<User> getFollowers() {
return followers;
}
public void setFollowers(List<User> followers) {
this.followers = followers;
}
public List<User> getOwners() {
return owners;
}
public void setOwners(List<User> owners) {
this.owners = owners;
}
public User getOwnerUser() {
return ownerUser;
}
public void setOwnerUser(User ownerUser) {
this.ownerUser = ownerUser;
}
public User getFollower() {
return follower;
}
public void setFollower(User follower) {
this.follower = follower;
}
public User getFactualUser() {
return ownerUser == null ? this : ownerUser;
}
/**
* Get the user simple information.
*
* @return user
*/
// It will throw StackOverflowException if return User that contains owners and followers value
// in getCurrentPerfTestStatistics() method.so just return base User info
public User getUserBaseInfo() {
User userInfo = new User();
userInfo.setId(this.getId());
userInfo.setUserId(this.getUserId());
userInfo.setUserName(this.getUserName());
userInfo.setEmail(this.getEmail());
return userInfo;
}
/**
* string representation of User object.
*
* @return User object information String.
*/
// avoid lazy initialization issues ,method toString not contain followers and owners
@Override
public String toString() {
return "User[ID=" + this.getId() + ",name=" + this.getUserId() + ",Role=" + this.getRole() + "]";
}
public String getFollowersStr() {
return followersStr;
}
public void setFollowersStr(String followersStr) {
this.followersStr = followersStr;
}
}