/*
* #%L
* BroadleafCommerce Open Admin Platform
* %%
* Copyright (C) 2009 - 2013 Broadleaf Commerce
* %%
* 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.
* #L%
*/
package org.broadleafcommerce.openadmin.server.security.domain;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.broadleafcommerce.common.admin.domain.AdminMainEntity;
import org.broadleafcommerce.common.extensibility.jpa.copy.DirectCopyTransform;
import org.broadleafcommerce.common.extensibility.jpa.copy.DirectCopyTransformMember;
import org.broadleafcommerce.common.extensibility.jpa.copy.DirectCopyTransformTypes;
import org.broadleafcommerce.common.presentation.AdminPresentation;
import org.broadleafcommerce.common.presentation.AdminPresentationClass;
import org.broadleafcommerce.common.presentation.AdminPresentationCollection;
import org.broadleafcommerce.common.presentation.AdminPresentationMap;
import org.broadleafcommerce.common.presentation.AdminPresentationOperationTypes;
import org.broadleafcommerce.common.presentation.ConfigurationItem;
import org.broadleafcommerce.common.presentation.ValidationConfiguration;
import org.broadleafcommerce.common.presentation.client.AddMethodType;
import org.broadleafcommerce.common.presentation.client.OperationType;
import org.broadleafcommerce.common.presentation.client.SupportedFieldType;
import org.broadleafcommerce.common.presentation.client.VisibilityEnum;
import org.broadleafcommerce.common.sandbox.domain.SandBox;
import org.broadleafcommerce.common.sandbox.domain.SandBoxImpl;
import org.broadleafcommerce.openadmin.server.service.type.ContextType;
import org.hibernate.annotations.BatchSize;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Index;
import org.hibernate.annotations.Parameter;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.MapKey;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;
/**
*
* @author jfischer
*
*/
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "BLC_ADMIN_USER")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region="blStandardElements")
@AdminPresentationClass(friendlyName = "AdminUserImpl_baseAdminUser")
@DirectCopyTransform({
@DirectCopyTransformMember(templateTokens = DirectCopyTransformTypes.MULTITENANT_ADMINUSER)
})
public class AdminUserImpl implements AdminUser, AdminMainEntity {
private static final Log LOG = LogFactory.getLog(AdminUserImpl.class);
private static final long serialVersionUID = 1L;
protected static final String LAST_USED_SANDBOX = "LAST_USED_SANDBOX";
@Id
@GeneratedValue(generator = "AdminUserId")
@GenericGenerator(
name="AdminUserId",
strategy="org.broadleafcommerce.common.persistence.IdOverrideTableGenerator",
parameters = {
@Parameter(name="segment_value", value="AdminUserImpl"),
@Parameter(name="entity_name", value="org.broadleafcommerce.openadmin.server.security.domain.AdminUserImpl")
}
)
@Column(name = "ADMIN_USER_ID")
@AdminPresentation(friendlyName = "AdminUserImpl_Admin_User_ID", group = "AdminUserImpl_Primary_Key", visibility = VisibilityEnum.HIDDEN_ALL)
private Long id;
@Column(name = "NAME", nullable=false)
@Index(name="ADMINUSER_NAME_INDEX", columnNames={"NAME"})
@AdminPresentation(friendlyName = "AdminUserImpl_Admin_Name", gridOrder = 1000, order = 1000,
group = "AdminUserImpl_User", prominent = true)
protected String name;
@Column(name = "LOGIN", nullable=false)
@AdminPresentation(friendlyName = "AdminUserImpl_Admin_Login", gridOrder = 2000, order = 2000,
group = "AdminUserImpl_User", prominent = true)
protected String login;
@Column(name = "PASSWORD")
@AdminPresentation(
friendlyName = "AdminUserImpl_Admin_Password", order = 6000,
group = "AdminUserImpl_User",
fieldType = SupportedFieldType.PASSWORD,
validationConfigurations = { @ValidationConfiguration(
validationImplementation = "org.broadleafcommerce.openadmin.server.service.persistence.validation.MatchesFieldValidator",
configurationItems = {
@ConfigurationItem(itemName = ConfigurationItem.ERROR_MESSAGE, itemValue = "passwordNotMatchError"),
@ConfigurationItem(itemName = "otherField", itemValue = "passwordConfirm")
}
)
})
protected String password;
@Column(name = "EMAIL", nullable=false)
@Index(name="ADMINPERM_EMAIL_INDEX", columnNames={"EMAIL"})
@AdminPresentation(friendlyName = "AdminUserImpl_Admin_Email_Address", order = 3000, group = "AdminUserImpl_User")
protected String email;
@Column(name = "PHONE_NUMBER")
@AdminPresentation(friendlyName = "AdminUserImpl_Phone_Number", order = 5000, group = "AdminUserImpl_User")
protected String phoneNumber;
@Column(name = "ACTIVE_STATUS_FLAG")
@AdminPresentation(friendlyName = "AdminUserImpl_Active_Status",
order = 4000, group = "AdminUserImpl_User",
defaultValue = "true")
protected Boolean activeStatusFlag = Boolean.TRUE;
/** All roles that this user has */
@ManyToMany(fetch = FetchType.LAZY, targetEntity = AdminRoleImpl.class)
@JoinTable(name = "BLC_ADMIN_USER_ROLE_XREF", joinColumns = @JoinColumn(name = "ADMIN_USER_ID", referencedColumnName = "ADMIN_USER_ID"), inverseJoinColumns = @JoinColumn(name = "ADMIN_ROLE_ID", referencedColumnName = "ADMIN_ROLE_ID"))
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region="blStandardElements")
@BatchSize(size = 50)
@AdminPresentationCollection(addType = AddMethodType.LOOKUP, friendlyName = "roleListTitle", manyToField = "allUsers",
operationTypes = @AdminPresentationOperationTypes(removeType = OperationType.NONDESTRUCTIVEREMOVE))
protected Set<AdminRole> allRoles = new HashSet<AdminRole>();
@ManyToMany(fetch = FetchType.LAZY, targetEntity = AdminPermissionImpl.class)
@JoinTable(name = "BLC_ADMIN_USER_PERMISSION_XREF", joinColumns = @JoinColumn(name = "ADMIN_USER_ID", referencedColumnName = "ADMIN_USER_ID"), inverseJoinColumns = @JoinColumn(name = "ADMIN_PERMISSION_ID", referencedColumnName = "ADMIN_PERMISSION_ID"))
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region="blStandardElements")
@BatchSize(size = 50)
@AdminPresentationCollection(addType = AddMethodType.LOOKUP,
friendlyName = "permissionListTitle",
customCriteria = "includeFriendlyOnly",
manyToField = "allUsers",
operationTypes = @AdminPresentationOperationTypes(removeType = OperationType.NONDESTRUCTIVEREMOVE))
protected Set<AdminPermission> allPermissions = new HashSet<AdminPermission>();
@Transient
protected String unencodedPassword;
@Override
public String getUnencodedPassword() {
return unencodedPassword;
}
@ManyToOne(targetEntity = SandBoxImpl.class, cascade = {CascadeType.MERGE, CascadeType.PERSIST})
@JoinTable(name = "BLC_ADMIN_USER_SANDBOX", joinColumns = @JoinColumn(name = "ADMIN_USER_ID", referencedColumnName = "ADMIN_USER_ID"), inverseJoinColumns = @JoinColumn(name = "SANDBOX_ID", referencedColumnName = "SANDBOX_ID"))
@AdminPresentation(excluded = true)
protected SandBox overrideSandBox;
@OneToMany(mappedBy = "adminUser", targetEntity = AdminUserAttributeImpl.class, cascade = { CascadeType.ALL }, orphanRemoval = true)
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE, region="blStandardElements")
@MapKey(name = "name")
@BatchSize(size = 50)
@AdminPresentationMap(friendlyName = "AdminUserImpl_additional_fields",
deleteEntityUponRemove = true, forceFreeFormKeys = true, keyPropertyFriendlyName = "AdminUserAttributeImpl_Key")
protected Map<String, AdminUserAttribute> additionalFields = new HashMap<String, AdminUserAttribute>();
@Override
public void setUnencodedPassword(String unencodedPassword) {
this.unencodedPassword = unencodedPassword;
}
@Override
public Long getId() {
return id;
}
@Override
public void setId(Long id) {
this.id = id;
}
@Override
public String getName() {
return name;
}
@Override
public void setName(String name) {
this.name = name;
}
@Override
public String getLogin() {
return login;
}
@Override
public void setLogin(String login) {
this.login = login;
}
@Override
public String getPassword() {
return password;
}
@Override
public void setPassword(String password) {
this.password = password;
}
@Override
public String getEmail() {
return email;
}
@Override
public void setEmail(String email) {
this.email = email;
}
@Override
public String getPhoneNumber() {
return phoneNumber;
}
@Override
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
@Override
public Boolean getActiveStatusFlag() {
return activeStatusFlag;
}
@Override
public void setActiveStatusFlag(Boolean activeStatusFlag) {
this.activeStatusFlag = activeStatusFlag;
}
@Override
public Set<AdminRole> getAllRoles() {
return allRoles;
}
@Override
public void setAllRoles(Set<AdminRole> allRoles) {
this.allRoles = allRoles;
}
@Override
public SandBox getOverrideSandBox() {
return overrideSandBox;
}
@Override
public void setOverrideSandBox(SandBox overrideSandBox) {
this.overrideSandBox = overrideSandBox;
}
@Override
public Set<AdminPermission> getAllPermissions() {
return allPermissions;
}
@Override
public void setAllPermissions(Set<AdminPermission> allPermissions) {
this.allPermissions = allPermissions;
}
@Override
public ContextType getContextType() {
return ContextType.GLOBAL;
}
@Override
public void setContextType(ContextType contextType) {
//do nothing
}
@Override
public String getContextKey() {
return null;
}
@Override
public void setContextKey(String contextKey) {
//do nothing
}
@Override
public Map<String, String> getFlatAdditionalFields() {
Map<String, String> map = new HashMap<String, String>();
for (Entry<String, AdminUserAttribute> entry : getAdditionalFields().entrySet()) {
map.put(entry.getKey(), entry.getValue().getValue());
}
return map;
}
@Override
public Map<String, AdminUserAttribute> getAdditionalFields() {
return additionalFields;
}
@Override
public void setAdditionalFields(Map<String, AdminUserAttribute> additionalFields) {
this.additionalFields = additionalFields;
}
@Override
public Long getLastUsedSandBoxId() {
AdminUserAttribute attr = getAdditionalFields().get(LAST_USED_SANDBOX);
if (attr != null && StringUtils.isNotBlank(attr.getValue())) {
return Long.parseLong(attr.getValue());
}
return null;
}
@Override
public void setLastUsedSandBoxId(Long sandBoxId) {
AdminUserAttribute attr = getAdditionalFields().get(LAST_USED_SANDBOX);
if (attr == null) {
attr = new AdminUserAttributeImpl();
attr.setName(LAST_USED_SANDBOX);
attr.setAdminUser(this);
getAdditionalFields().put(LAST_USED_SANDBOX, attr);
}
attr.setValue(String.valueOf(sandBoxId));
}
@Override
public String getMainEntityName() {
return getName();
}
}