/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.smartitengineering.user.service.impl;
import com.smartitengineering.domain.PersistentDTO;
import com.smartitengineering.user.domain.Organization;
import com.smartitengineering.user.domain.Person;
import com.smartitengineering.user.domain.Privilege;
import com.smartitengineering.user.domain.Role;
import com.smartitengineering.user.domain.SecuredObject;
import com.smartitengineering.user.domain.User;
import com.smartitengineering.user.domain.UserGroup;
import com.smartitengineering.user.domain.UserPerson;
import com.smartitengineering.user.observer.CRUDObserver;
import com.smartitengineering.user.observer.ObserverNotification;
import com.smartitengineering.user.parser.SmartUserStrings;
import com.smartitengineering.user.service.OrganizationService;
import com.smartitengineering.user.service.PersonService;
import com.smartitengineering.user.service.PrivilegeService;
import com.smartitengineering.user.service.SecuredObjectService;
import com.smartitengineering.user.service.Services;
import com.smartitengineering.user.service.UserGroupService;
import com.smartitengineering.user.service.UserPersonService;
import com.smartitengineering.user.service.UserService;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author modhu7
*/
public class ObserverImpl implements CRUDObserver {
public static final Logger logger = LoggerFactory.getLogger(ObserverImpl.class);
public final String ORGS_OID = SmartUserStrings.ORGANIZATIONS_URL;
public final String USERS_OID = SmartUserStrings.USERS_URL;
public final String USERS_OID_NAME = "Users";
public final String SECURED_OBJECTS_OID = SmartUserStrings.SECURED_OBJECTS_URL;
public final String SECURED_OBJECTS_NAME = "Secured Objects";
public final String PRIVILEGES_OID = SmartUserStrings.PRIVILEGES_URL;
public final String PRIVILEGES_OID_NAME = "Privileges";
public final String ORG_UNIQUE_FRAG = SmartUserStrings.ORGANIZATION_UNIQUE_URL_FRAGMENT;
public final String ADAM_ORG_SHORT_NAME = SmartUserStrings.FIRST_ORGANIZATION_SHORT_NAME;
public final String ADMIN_USERNAME = SmartUserStrings.ADMIN_USERNAME;
public final String ADMIN_PASSWORD = SmartUserStrings.ADMIN_PASSWORD;
public final String URI_FRAG_CONTENT = SmartUserStrings.CONTENT_URI_FRAGMENT;
public final String URI_FRAG_UPDATE = SmartUserStrings.UPDATE_URI_FRAGMENT;
public final String URIFRAG_DELETE = SmartUserStrings.DELETE_URI_FRAGMENT;
public final Integer PRIVILEGE_PERMISSION_MASK = 31;
public final String EMAIL_DOMAIN = SmartUserStrings.EMAIL_DOMAIN;
public final String USER_UNIQUE_FRAG = SmartUserStrings.USER_UNIQUE_URL_FRAGMENT;
public UserGroupService getUserGroupService() {
return Services.getInstance().getUserGroupService();
}
public OrganizationService getOrganizationService() {
return Services.getInstance().getOrganizationService();
}
public PrivilegeService getPrivilegeService() {
return Services.getInstance().getPrivilegeService();
}
public SecuredObjectService getSecuredObjectService() {
return Services.getInstance().getSecuredObjectService();
}
public UserPersonService getUserPersonService() {
return Services.getInstance().getUserPersonService();
}
public PersonService getPersonService() {
return Services.getInstance().getPersonService();
}
public UserService getUserService() {
return Services.getInstance().getUserService();
}
@Override
public void update(ObserverNotification notification, PersistentDTO object) {
if (notification.equals(ObserverNotification.CREATE_ORGANIZATION) && object instanceof Organization) {
Organization organization = (Organization) object;
initializeOrganization(organization);
}
else if (notification.equals(ObserverNotification.DELETE_ORGNIZATION) && object instanceof Organization) {
Organization organization = (Organization) object;
removeOrganization(organization);
}
else if (notification.equals(ObserverNotification.CREATE_USER_PERSON) && object instanceof UserPerson) {
UserPerson userPerson = (UserPerson) object;
initializeUserPerson(userPerson);
}
else if (notification.equals(ObserverNotification.DELETE_USER_PERSON) && object instanceof UserPerson) {
UserPerson userPerson = (UserPerson) object;
removeUserPerson(userPerson);
}
else if (notification.equals(ObserverNotification.DELETE_PRIVILEGE) && object instanceof Privilege) {
Privilege privilege = (Privilege) object;
removePrivilege(privilege);
}
else if (notification.equals(ObserverNotification.DELETE_ROLE) && object instanceof Role) {
Role role = (Role) object;
removeRole(role);
}
}
private void initializeOrganization(Organization organization) {
String uniqueShortName = organization.getUniqueShortName();
organization = getOrganizationService().getOrganizationByUniqueShortName(uniqueShortName);
User user = new User();
user.setUsername(ADMIN_USERNAME);
user.setPassword(ADMIN_PASSWORD);
user.setOrganization(organization);
Person person = new Person();
person.setAddress(organization.getAddress());
person.setPrimaryEmail(ADMIN_USERNAME + "_" + organization.getUniqueShortName() + "@" + EMAIL_DOMAIN);
UserPerson userPerson = new UserPerson();
userPerson.setUser(user);
userPerson.setPerson(person);
getUserPersonService().create(userPerson);
String orgUri = ORGS_OID + ORG_UNIQUE_FRAG + "/" + organization.getUniqueShortName();
SecuredObject securedObjectOrganization = new SecuredObject();
securedObjectOrganization.setName(organization.getUniqueShortName());
securedObjectOrganization.setObjectID(orgUri);
securedObjectOrganization.setOrganization(organization);
securedObjectOrganization.setParentObjectID(ORGS_OID);
getSecuredObjectService().save(securedObjectOrganization);
securedObjectOrganization = getSecuredObjectService().getByOrganizationAndObjectID(organization.getUniqueShortName(), securedObjectOrganization.
getObjectID());
SecuredObject securedObjectUsers = new SecuredObject();
securedObjectUsers.setName(organization.getUniqueShortName() + "-" + USERS_OID_NAME);
securedObjectUsers.setObjectID(orgUri + USERS_OID);
securedObjectUsers.setOrganization(organization);
securedObjectUsers.setParentObjectID(securedObjectOrganization.getObjectID());
getSecuredObjectService().save(securedObjectUsers);
SecuredObject securedObjectSOs = new SecuredObject();
securedObjectSOs.setName(organization.getUniqueShortName() + "-" + SECURED_OBJECTS_NAME);
securedObjectSOs.setObjectID(orgUri + SECURED_OBJECTS_OID); //This objectId is actually the http url of secured objcets list of smart-user organizations
securedObjectSOs.setOrganization(organization);
securedObjectSOs.setParentObjectID(securedObjectOrganization.getObjectID());
getSecuredObjectService().save(securedObjectSOs);
SecuredObject securedObjectPrivileges = new SecuredObject();
securedObjectPrivileges.setName(organization.getName() + "-" + PRIVILEGES_OID_NAME);
securedObjectPrivileges.setObjectID(orgUri + PRIVILEGES_OID); //This objectId is actually the http url of secured objcets list of smart-user organizations
securedObjectPrivileges.setOrganization(organization);
securedObjectPrivileges.setParentObjectID(securedObjectOrganization.getObjectID());
getSecuredObjectService().save(securedObjectPrivileges);
Privilege privilege = new Privilege();
privilege.setDisplayName(organization.getName() + " " + "admin user profile privilege");
privilege.setName(organization.getUniqueShortName() + "-" + "admin");
privilege.setParentOrganization(organization);
privilege.setPermissionMask(PRIVILEGE_PERMISSION_MASK); //permission mask 31 means all privileges are there 11111
privilege.setSecuredObject(securedObjectOrganization);
privilege.setShortDescription("This admin privilege contains the authority to do any of the CRUD options");
getPrivilegeService().create(privilege);
privilege = getPrivilegeService().getPrivilegeByOrganizationAndPrivilegeName(organization.getUniqueShortName(), privilege.
getName());
user = getUserService().getUserByOrganizationAndUserName(organization.getUniqueShortName(), ADMIN_USERNAME);
user.getPrivileges().add(privilege);
getUserService().update(user);
}
private void removeOrganization(Organization organization) {
List<UserGroup> userGroups = new ArrayList<UserGroup>(getUserGroupService().getByOrganizationName(organization.
getUniqueShortName()));
for (UserGroup userGroup : userGroups) {
getUserGroupService().delete(userGroup);
}
List<UserPerson> userPersons = new ArrayList<UserPerson>(getUserPersonService().getAllByOrganization(organization.
getUniqueShortName()));
for (UserPerson userPerson : userPersons) {
getUserPersonService().delete(userPerson);
}
List<Privilege> privileges = new ArrayList<Privilege>(getPrivilegeService().getPrivilegesByOrganization(organization.
getUniqueShortName()));
for (Privilege privilege : privileges) {
if (privilege != null) {
logger.info("privilege name: " + privilege.getName());
logger.info("privilege permission mask : " + privilege.getPermissionMask());
getPrivilegeService().delete(privilege);
}
else {
logger.info("privilege null");
}
}
List<SecuredObject> securedObjects = new ArrayList<SecuredObject>(getSecuredObjectService().getByOrganization(organization.
getUniqueShortName()));
for (SecuredObject securedObject : securedObjects) {
if (securedObject != null) {
getSecuredObjectService().delete(securedObject);
}
}
}
private void initializeUserPerson(UserPerson userPerson) {
String username = userPerson.getUser().getUsername();
String organizationShortName = userPerson.getUser().getOrganization().getUniqueShortName();
UserPerson persistentUserPerson = getUserPersonService().getUserPersonByUsernameAndOrgName(username,
organizationShortName);
SecuredObject securedObjectUser = new SecuredObject();
securedObjectUser.setName(username + "-profile");
String orgUri = ORGS_OID + ORG_UNIQUE_FRAG + "/" + organizationShortName;
securedObjectUser.setObjectID(orgUri + USERS_OID + USER_UNIQUE_FRAG + "/" + username);
securedObjectUser.setOrganization(userPerson.getUser().getOrganization());
securedObjectUser.setParentObjectID(orgUri + USERS_OID);
getSecuredObjectService().save(securedObjectUser);
securedObjectUser = getSecuredObjectService().getByOrganizationAndObjectID(userPerson.getUser().getOrganization().
getUniqueShortName(), securedObjectUser.getObjectID());
Privilege privilegeUser = new Privilege();
privilegeUser.setDisplayName(username + "'s Profile Privilege");
privilegeUser.setName(username + "-" + organizationShortName + "-user-privilege");
privilegeUser.setParentOrganization(userPerson.getUser().getOrganization());
privilegeUser.setPermissionMask(PRIVILEGE_PERMISSION_MASK); //permission mask 31 means all privileges are there 11111
privilegeUser.setSecuredObject(securedObjectUser);
privilegeUser.setShortDescription(
"This privilege contains the authority to change the password and profile of the user with username " + userPerson.
getUser().getUsername());
getPrivilegeService().create(privilegeUser);
privilegeUser = getPrivilegeService().getPrivilegeByOrganizationAndPrivilegeName(userPerson.getUser().
getOrganization().
getUniqueShortName(), privilegeUser.getName());
Set<Privilege> privileges = userPerson.getUser().getPrivileges();
privileges.add(privilegeUser);
User user = persistentUserPerson.getUser();
user.setPrivileges(privileges);
getUserService().update(user);
}
private void removeUserPerson(UserPerson userPerson) {
User user = userPerson.getUser();
List<UserGroup> userGroups = new ArrayList<UserGroup>(getUserGroupService().getByOrganizationName(userPerson.getUser().
getOrganization().getUniqueShortName()));
logger.info("user group size : " + userGroups.size());
for (UserGroup userGroup : userGroups) {
if (userGroup != null) {
List<User> users = new ArrayList<User>(userGroup.getUsers());
if (users.contains(userPerson.getUser())) {
userGroup.getUsers().remove(userPerson.getUser());
getUserGroupService().update(userGroup);
}
}
}
String organizationShortName = userPerson.getUser().getOrganization().getUniqueShortName();
String username = userPerson.getUser().getUsername();
String orgUri = ORGS_OID + ORG_UNIQUE_FRAG + "/" + organizationShortName;
String privilegeName = username + "-" + organizationShortName + "-user-privilege";
SecuredObject securedObject = getSecuredObjectService().getByOrganizationAndObjectID(organizationShortName, orgUri +
USERS_OID + USER_UNIQUE_FRAG + "/" + username);
List<Privilege> privileges = new ArrayList<Privilege>(getPrivilegeService().
getPrivilegesByOrganizationNameAndObjectID(
organizationShortName, securedObject.getObjectID()));
for (Privilege privilege : privileges) {
// List<Privilege> privilegeUsers = new ArrayList<Privilege>(user.getPrivileges());
// for (Privilege privilegeUser : privilegeUsers) {
// if (privilegeUser.getName().equals(privilege.getName())) {
// user.getPrivileges().remove(privilegeUser);
// }
// }
user.getPrivileges().remove(privilege);
getUserService().update(user);
getPrivilegeService().delete(privilege);
}
getSecuredObjectService().delete(securedObject);
}
private void removePrivilege(Privilege privilege) {
List<User> users = new ArrayList<User>(getUserService().getUserByOrganization(privilege.getParentOrganization().
getUniqueShortName()));
for (User user : users) {
List<Privilege> privileges = new ArrayList<Privilege>(user.getPrivileges());
if (privileges.contains(privilege)) {
user.getPrivileges().remove(privilege);
getUserService().update(user);
}
}
List<UserGroup> userGroups = new ArrayList<UserGroup>(getUserGroupService().getByOrganizationName(privilege.
getParentOrganization().getUniqueShortName()));
for (UserGroup userGroup : userGroups) {
if (userGroup != null) {
List<Privilege> privileges = new ArrayList<Privilege>(userGroup.getPrivileges());
if (privileges.contains(privilege)) {
userGroup.getPrivileges().remove(privilege);
getUserGroupService().update(userGroup);
}
}
}
}
private void removeRole(Role role) {
List<User> users = new ArrayList<User>(getUserService().getAllUser());
for (User user : users) {
List<Role> roles = new ArrayList<Role>(user.getRoles());
if (roles.contains(role)) {
user.getRoles().remove(role);
getUserService().update(user);
}
}
List<UserGroup> userGroups = new ArrayList<UserGroup>(getUserGroupService().getAllUserGroup());
for (UserGroup userGroup : userGroups) {
if (userGroup != null) {
List<Role> roles = new ArrayList<Role>(userGroup.getRoles());
if (roles.contains(role)) {
userGroup.getRoles().remove(role);
getUserGroupService().update(userGroup);
}
}
}
}
}