added findByName for default application

This commit is contained in:
2018-11-24 17:49:02 +01:00
parent 0b044bac78
commit ac39be3848

View File

@ -1,191 +1,196 @@
/* /*
* To change this license header, choose License Headers in Project Properties. * To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates * To change this template file, choose Tools | Templates
* and open the template in the editor. * and open the template in the editor.
*/ */
package de.muehlencord.shared.account.business.application.control; package de.muehlencord.shared.account.business.application.control;
import de.muehlencord.shared.account.business.account.entity.AccountException; import de.muehlencord.shared.account.business.account.entity.AccountException;
import de.muehlencord.shared.account.business.application.entity.ApplicationEntity; import de.muehlencord.shared.account.business.application.entity.ApplicationEntity;
import de.muehlencord.shared.account.business.application.entity.ApplicationPermissionEntity; import de.muehlencord.shared.account.business.application.entity.ApplicationPermissionEntity;
import de.muehlencord.shared.account.business.application.entity.ApplicationRoleEntity; import de.muehlencord.shared.account.business.application.entity.ApplicationRoleEntity;
import de.muehlencord.shared.account.util.AccountPU; import de.muehlencord.shared.account.util.AccountPU;
import de.muehlencord.shared.account.util.Permission; import de.muehlencord.shared.account.util.Permission;
import java.io.Serializable; import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import javax.inject.Inject; import javax.inject.Inject;
import javax.persistence.EntityManager; import javax.persistence.EntityManager;
import javax.persistence.OptimisticLockException; import javax.persistence.OptimisticLockException;
import javax.persistence.Query; import javax.persistence.Query;
import javax.transaction.Transactional; import javax.transaction.Transactional;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
/** /**
* *
* @author Joern Muehlencord <joern at muehlencord.de> * @author Joern Muehlencord <joern at muehlencord.de>
*/ */
@Stateless @Stateless
public class ApplicationRoleControl implements Serializable { public class ApplicationRoleControl implements Serializable {
private static final long serialVersionUID = 5962478269550134748L; private static final long serialVersionUID = 5962478269550134748L;
private static final Logger LOGGER = LoggerFactory.getLogger(ApplicationRoleControl.class); private static final Logger LOGGER = LoggerFactory.getLogger(ApplicationRoleControl.class);
@EJB @EJB
ApplicationPermissionControl applicationPermissionControl; ApplicationPermissionControl applicationPermissionControl;
@Inject @Inject
@AccountPU @AccountPU
EntityManager em; EntityManager em;
@Inject @Inject
ApplicationEntity application; ApplicationEntity application;
// TODO requires special role to maintain role for other allication // TODO requires special role to maintain role for other allication
public List<ApplicationRoleEntity> getAllRoles(ApplicationEntity app) { public List<ApplicationRoleEntity> getAllRoles(ApplicationEntity app) {
Query query = em.createNamedQuery("ApplicationRoleEntity.findAll"); Query query = em.createNamedQuery("ApplicationRoleEntity.findAll");
query.setParameter("application", app); query.setParameter("application", app);
List<ApplicationRoleEntity> roles = query.getResultList(); List<ApplicationRoleEntity> roles = query.getResultList();
if (roles == null) { if (roles == null) {
return new ArrayList<>(); return new ArrayList<>();
} else { } else {
return roles; return roles;
} }
} }
@Transactional @Transactional
// TODO requires special role to maintain role for other allication // TODO requires special role to maintain role for other allication
public void createOrUpdate(ApplicationEntity app, String name, String description) { public void createOrUpdate(ApplicationEntity app, String name, String description) {
ApplicationRoleEntity role = findByName(app, name); ApplicationRoleEntity role = findByName(app, name);
if (role == null) { if (role == null) {
role = new ApplicationRoleEntity(app, name, description); role = new ApplicationRoleEntity(app, name, description);
em.persist(role); em.persist(role);
} else { } else {
role.setRoleDescription(description); role.setRoleDescription(description);
em.merge(role); em.merge(role);
} }
} }
@Transactional @Transactional
// TODO requires special role to maintain role for other allication // TODO requires special role to maintain role for other allication
public void create(ApplicationRoleEntity role) { public void create(ApplicationRoleEntity role) {
em.persist(role); em.persist(role);
} }
@Transactional @Transactional
// TODO requires special role to maintain role for other allication // TODO requires special role to maintain role for other allication
public void update(ApplicationRoleEntity role) { public void update(ApplicationRoleEntity role) {
em.merge(role); em.merge(role);
} }
@Transactional @Transactional
// TODO requires special role to maintain role for other allication // TODO requires special role to maintain role for other allication
public void delete(ApplicationRoleEntity role) throws AccountException { public void delete(ApplicationRoleEntity role) throws AccountException {
ApplicationRoleEntity existingRole = attach(role); ApplicationRoleEntity existingRole = attach(role);
em.remove(existingRole); em.remove(existingRole);
} }
public ApplicationRoleEntity attach(ApplicationRoleEntity role) throws AccountException { public ApplicationRoleEntity attach(ApplicationRoleEntity role) throws AccountException {
try { try {
return em.merge(role); return em.merge(role);
} catch (OptimisticLockException ex) { } catch (OptimisticLockException ex) {
throw new AccountException("Entity updated / deleted, please reload", true); throw new AccountException("Entity updated / deleted, please reload", true);
} }
} }
public ApplicationRoleEntity findByName(ApplicationEntity application, String name) { public ApplicationRoleEntity findByName(String name) {
Query query = em.createNamedQuery("ApplicationRoleEntity.findByRoleName"); return findByName(application, name);
query.setParameter("application", application); }
query.setParameter("roleName", name);
List<ApplicationRoleEntity> permissions = query.getResultList(); // TODO requires special role to maintain role for other allication
if ((permissions == null) || (permissions.isEmpty())) { public ApplicationRoleEntity findByName(ApplicationEntity app, String name) {
return null; Query query = em.createNamedQuery("ApplicationRoleEntity.findByRoleName");
} else { query.setParameter("application", app);
return permissions.get(0); query.setParameter("roleName", name);
} List<ApplicationRoleEntity> permissions = query.getResultList();
} if ((permissions == null) || (permissions.isEmpty())) {
return null;
public List<ApplicationPermissionEntity> getRolePermissions(ApplicationRoleEntity role) throws AccountException { } else {
ApplicationRoleEntity existingRole = em.find(ApplicationRoleEntity.class, role.getId()); return permissions.get(0);
List<ApplicationPermissionEntity> permissions = existingRole.getApplicationPermissionList(); }
permissions.size(); // force list to load }
return permissions;
} public List<ApplicationPermissionEntity> getRolePermissions(ApplicationRoleEntity role) throws AccountException {
ApplicationRoleEntity existingRole = em.find(ApplicationRoleEntity.class, role.getId());
public List<ApplicationPermissionEntity> getNotAssignedApplicationPermissions(ApplicationRoleEntity role) { List<ApplicationPermissionEntity> permissions = existingRole.getApplicationPermissionList();
try { permissions.size(); // force list to load
List<ApplicationPermissionEntity> rolePermissions = getRolePermissions(role); return permissions;
List<ApplicationPermissionEntity> allPermssions = applicationPermissionControl.getApplicationPermissions(role.getApplication()); }
List<ApplicationPermissionEntity> missingPermissions = new ArrayList<>(); public List<ApplicationPermissionEntity> getNotAssignedApplicationPermissions(ApplicationRoleEntity role) {
allPermssions.stream().filter((perm) -> (!rolePermissions.contains(perm))).forEachOrdered((perm) -> { try {
missingPermissions.add(perm); List<ApplicationPermissionEntity> rolePermissions = getRolePermissions(role);
}); List<ApplicationPermissionEntity> allPermssions = applicationPermissionControl.getApplicationPermissions(role.getApplication());
return missingPermissions;
} catch (AccountException ex) { List<ApplicationPermissionEntity> missingPermissions = new ArrayList<>();
if (LOGGER.isDebugEnabled()) { allPermssions.stream().filter((perm) -> (!rolePermissions.contains(perm))).forEachOrdered((perm) -> {
LOGGER.debug(ex.toString(), ex); missingPermissions.add(perm);
} else { });
LOGGER.debug(ex.toString()); return missingPermissions;
} } catch (AccountException ex) {
return null; if (LOGGER.isDebugEnabled()) {
} LOGGER.debug(ex.toString(), ex);
} else {
} LOGGER.debug(ex.toString());
}
@Transactional return null;
// TODO requires special role to maintain role for other allication }
public void addPermission(ApplicationRoleEntity role, ApplicationPermissionEntity permission) throws AccountException {
ApplicationRoleEntity existingRole = attach(role); }
if (existingRole.getApplicationPermissionList() == null) {
existingRole.setApplicationPermissionList(new ArrayList<>()); @Transactional
} // TODO requires special role to maintain role for other allication
existingRole.getApplicationPermissionList().add(permission); public void addPermission(ApplicationRoleEntity role, ApplicationPermissionEntity permission) throws AccountException {
em.merge(role); ApplicationRoleEntity existingRole = attach(role);
} if (existingRole.getApplicationPermissionList() == null) {
existingRole.setApplicationPermissionList(new ArrayList<>());
@Transactional }
// TODO requires special role to maintain role for other allication existingRole.getApplicationPermissionList().add(permission);
public void removePermission(ApplicationRoleEntity role, ApplicationPermissionEntity permission) throws AccountException { em.merge(role);
ApplicationRoleEntity existingRole = attach(role); }
if ((existingRole.getApplicationPermissionList() != null) && (existingRole.getApplicationPermissionList().contains(permission))) {
existingRole.getApplicationPermissionList().remove(permission); @Transactional
} // TODO requires special role to maintain role for other allication
em.merge(role); public void removePermission(ApplicationRoleEntity role, ApplicationPermissionEntity permission) throws AccountException {
} ApplicationRoleEntity existingRole = attach(role);
if ((existingRole.getApplicationPermissionList() != null) && (existingRole.getApplicationPermissionList().contains(permission))) {
@Transactional existingRole.getApplicationPermissionList().remove(permission);
public void setupRolePermission(List<Permission> permissions, String roleName) throws AccountException { }
ApplicationRoleEntity role = findByName(application, roleName); em.merge(role);
if (role == null) { }
LOGGER.error("A role with name " + roleName + " is not defined for application " + application.getApplicationName());
} else { @Transactional
for (Permission permission : permissions) { public void setupRolePermission(List<Permission> permissions, String roleName) throws AccountException {
ApplicationPermissionEntity existingPermission = applicationPermissionControl.findPermissionByName(application, permission.getName()); ApplicationRoleEntity role = findByName(application, roleName);
if (existingPermission == null) { if (role == null) {
LOGGER.error("Required permission " + permission.getName() + " of application " + application.getApplicationName() + " does not exist. Ensure to call setupPermissions first"); LOGGER.error("A role with name " + roleName + " is not defined for application " + application.getApplicationName());
} else { } else {
if (role.getApplicationPermissionList().contains(existingPermission)) { for (Permission permission : permissions) {
if (LOGGER.isDebugEnabled()) { ApplicationPermissionEntity existingPermission = applicationPermissionControl.findPermissionByName(application, permission.getName());
LOGGER.debug("Permission {} already assigned to role {} of {}, skipping", permission.getName(), roleName, application.getApplicationName()); if (existingPermission == null) {
} LOGGER.error("Required permission " + permission.getName() + " of application " + application.getApplicationName() + " does not exist. Ensure to call setupPermissions first");
} else { } else {
if (LOGGER.isDebugEnabled()) { if (role.getApplicationPermissionList().contains(existingPermission)) {
LOGGER.debug("Permission {} not assigned to role {} of {}", permission.getName(), roleName, application.getApplicationName()); if (LOGGER.isDebugEnabled()) {
} LOGGER.debug("Permission {} already assigned to role {} of {}, skipping", permission.getName(), roleName, application.getApplicationName());
addPermission(role, existingPermission); }
if (LOGGER.isDebugEnabled()) { } else {
LOGGER.debug("Added permission {} to role {} of {}", permission.getName(), roleName, application.getApplicationName()); if (LOGGER.isDebugEnabled()) {
} LOGGER.debug("Permission {} not assigned to role {} of {}", permission.getName(), roleName, application.getApplicationName());
} }
} addPermission(role, existingPermission);
} if (LOGGER.isDebugEnabled()) {
} LOGGER.debug("Added permission {} to role {} of {}", permission.getName(), roleName, application.getApplicationName());
}
} }
}
} }
}
}
}