From 1e3d2986c59a4811bf22f5747ab09eb1b51082a3 Mon Sep 17 00:00:00 2001 From: jomu Date: Mon, 19 Nov 2018 13:45:22 +0100 Subject: [PATCH] fixed injection issue when using WF14 --- account-ui/pom.xml | 302 +++++++++--------- .../UniqueApplicationRoleNameValidator.java | 114 +++---- .../UniqueApplicationValidator.java | 4 +- .../UniquePermissionNameValidator.java | 121 ++++--- .../control/ApplicationRoleControl.java | 299 ++++++++--------- 5 files changed, 420 insertions(+), 420 deletions(-) diff --git a/account-ui/pom.xml b/account-ui/pom.xml index e9f209d..4cfcdb2 100644 --- a/account-ui/pom.xml +++ b/account-ui/pom.xml @@ -1,151 +1,151 @@ - - - 4.0.0 - - shared - de.muehlencord - 1.1-SNAPSHOT - - - de.muehlencord.shared - shared-account-ui - 1.1-SNAPSHOT - war - - shared-account-ui - - - UTF-8 - ${maven.build.timestamp} - 143a2bd3-7e0b-4162-a76e-3031331c7dfe - 10 - 10 - - - development - - - - - org.primefaces - primefaces - - - - com.github.adminfaces - admin-template - 1.0.0-RC19 - - - - org.omnifaces - omnifaces - 2.7 - - - - org.apache.shiro - shiro-core - - - org.apache.shiro - shiro-web - - - de.muehlencord.shared - shared-shiro-faces - 1.1-SNAPSHOT - - - de.muehlencord.shared - shared-account - 1.1-SNAPSHOT - - - de.muehlencord.shared - shared-util - 1.1-SNAPSHOT - - - de.muehlencord.shared - shared-jeeutil - 1.1-SNAPSHOT - - - de.muehlencord.sf - filter - 1.0 - - - javax - javaee-web-api - 7.0 - provided - - - - - - ${basedir}/src/main/filters/${filter.name}.properties - - - - - - src/main/resources - true - - **/*.properties - **/*.xml - - - - - account - - - org.apache.maven.plugins - maven-compiler-plugin - 3.8.0 - - 10 - 10 - - - - org.apache.maven.plugins - maven-war-plugin - 3.2.2 - - false - - - ${basedir}/src/main/webapp - true - - WEB-INF/web.xml - WEB-INF/shiro.ini - - - - - - - - - - - development - - development - - - - - production - - production - - - - + + + 4.0.0 + + shared + de.muehlencord + 1.1-SNAPSHOT + + + de.muehlencord.shared + shared-account-ui + 1.1-SNAPSHOT + war + + shared-account-ui + + + UTF-8 + ${maven.build.timestamp} + 143a2bd3-7e0b-4162-a76e-3031331c7dfe + 10 + 10 + + + development + + + + + org.primefaces + primefaces + + + + com.github.adminfaces + admin-template + 1.0.0-RC19 + + + + org.omnifaces + omnifaces + 3.2 + + + + org.apache.shiro + shiro-core + + + org.apache.shiro + shiro-web + + + de.muehlencord.shared + shared-shiro-faces + 1.1-SNAPSHOT + + + de.muehlencord.shared + shared-account + 1.1-SNAPSHOT + + + de.muehlencord.shared + shared-util + 1.1-SNAPSHOT + + + de.muehlencord.shared + shared-jeeutil + 1.1-SNAPSHOT + + + de.muehlencord.sf + filter + 1.0 + + + javax + javaee-web-api + 7.0 + provided + + + + + + ${basedir}/src/main/filters/${filter.name}.properties + + + + + + src/main/resources + true + + **/*.properties + **/*.xml + + + + + account + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + 10 + 10 + + + + org.apache.maven.plugins + maven-war-plugin + 3.2.2 + + false + + + ${basedir}/src/main/webapp + true + + WEB-INF/web.xml + WEB-INF/shiro.ini + + + + + + + + + + + development + + development + + + + + production + + production + + + + diff --git a/account-ui/src/main/java/de/muehlencord/shared/account/web/presentation/UniqueApplicationRoleNameValidator.java b/account-ui/src/main/java/de/muehlencord/shared/account/web/presentation/UniqueApplicationRoleNameValidator.java index 6111584..5f21451 100644 --- a/account-ui/src/main/java/de/muehlencord/shared/account/web/presentation/UniqueApplicationRoleNameValidator.java +++ b/account-ui/src/main/java/de/muehlencord/shared/account/web/presentation/UniqueApplicationRoleNameValidator.java @@ -1,57 +1,57 @@ -package de.muehlencord.shared.account.web.presentation; - -import de.muehlencord.shared.account.business.account.entity.ApplicationRoleEntity; -import de.muehlencord.shared.account.business.application.control.ApplicationRoleControl; -import de.muehlencord.shared.account.business.application.entity.ApplicationEntity; -import de.muehlencord.shared.account.util.AccountPU; -import java.io.Serializable; -import javax.ejb.EJB; -import javax.faces.application.FacesMessage; -import javax.faces.component.UIComponent; -import javax.faces.context.FacesContext; -import javax.faces.validator.FacesValidator; -import javax.faces.validator.Validator; -import javax.faces.validator.ValidatorException; -import javax.inject.Inject; -import javax.persistence.EntityManager; - -/** - * - * @author Joern Muehlencord - */ -@FacesValidator("uniqueApplicationRoleNameValidator") -public class UniqueApplicationRoleNameValidator implements Validator, Serializable { - - private static final long serialVersionUID = 8165013107453616719L; - - @Inject - @AccountPU - EntityManager em; - - @EJB - ApplicationRoleControl applicationRoleControl; - - @Override - public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { - Object applicationObj = component.getAttributes().get("application"); - if ((applicationObj != null) && (applicationObj instanceof ApplicationEntity)) { - ApplicationEntity application = (ApplicationEntity) applicationObj; - if (value == null) { - throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Role name invalid", "Role name must not be empty")); - } - if (value instanceof String) { - String roleName = (String) value; - ApplicationRoleEntity existingRole = applicationRoleControl.findByName(application, roleName); - if (existingRole != null) { - throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Role name invalid", "Role already exists")); - } - } else { - throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Role name invalid", "Role name must be a string value")); - // TODO add IPRS logger - someone is trying to cheat - } - } else { - throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Application not set", "Permission name cannot be set if application is unknown")); - } - } - -} +package de.muehlencord.shared.account.web.presentation; + +import de.muehlencord.shared.account.business.account.entity.ApplicationRoleEntity; +import de.muehlencord.shared.account.business.application.control.ApplicationRoleControl; +import de.muehlencord.shared.account.business.application.entity.ApplicationEntity; +import de.muehlencord.shared.account.util.AccountPU; +import java.io.Serializable; +import javax.ejb.EJB; +import javax.faces.application.FacesMessage; +import javax.faces.component.UIComponent; +import javax.faces.context.FacesContext; +import javax.faces.validator.FacesValidator; +import javax.faces.validator.Validator; +import javax.faces.validator.ValidatorException; +import javax.inject.Inject; +import javax.persistence.EntityManager; + +/** + * + * @author Joern Muehlencord + */ +@FacesValidator("uniqueApplicationRoleNameValidator") +public class UniqueApplicationRoleNameValidator implements Validator, Serializable { + + private static final long serialVersionUID = 8165013107453616719L; + + @Inject + @AccountPU + EntityManager em; + + @Inject + ApplicationRoleControl applicationRoleControl; + + @Override + public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { + Object applicationObj = component.getAttributes().get("application"); + if ((applicationObj != null) && (applicationObj instanceof ApplicationEntity)) { + ApplicationEntity application = (ApplicationEntity) applicationObj; + if (value == null) { + throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Role name invalid", "Role name must not be empty")); + } + if (value instanceof String) { + String roleName = (String) value; + ApplicationRoleEntity existingRole = applicationRoleControl.findByName(application, roleName); + if (existingRole != null) { + throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Role name invalid", "Role already exists")); + } + } else { + throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Role name invalid", "Role name must be a string value")); + // TODO add IPRS logger - someone is trying to cheat + } + } else { + throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Application not set", "Permission name cannot be set if application is unknown")); + } + } + +} diff --git a/account-ui/src/main/java/de/muehlencord/shared/account/web/presentation/UniqueApplicationValidator.java b/account-ui/src/main/java/de/muehlencord/shared/account/web/presentation/UniqueApplicationValidator.java index 7668e94..4010e71 100644 --- a/account-ui/src/main/java/de/muehlencord/shared/account/web/presentation/UniqueApplicationValidator.java +++ b/account-ui/src/main/java/de/muehlencord/shared/account/web/presentation/UniqueApplicationValidator.java @@ -3,13 +3,13 @@ package de.muehlencord.shared.account.web.presentation; import de.muehlencord.shared.account.business.application.boundary.ApplicationService; import de.muehlencord.shared.account.business.application.entity.ApplicationEntity; import java.io.Serializable; -import javax.ejb.EJB; import javax.faces.application.FacesMessage; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.validator.FacesValidator; import javax.faces.validator.Validator; import javax.faces.validator.ValidatorException; +import javax.inject.Inject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -23,7 +23,7 @@ public class UniqueApplicationValidator implements Validator, Serializable { private static final long serialVersionUID = 2526409681909574670L; private static final Logger LOGGER = LoggerFactory.getLogger(UniqueApplicationValidator.class); - @EJB + @Inject ApplicationService applicationService; @Override diff --git a/account-ui/src/main/java/de/muehlencord/shared/account/web/presentation/UniquePermissionNameValidator.java b/account-ui/src/main/java/de/muehlencord/shared/account/web/presentation/UniquePermissionNameValidator.java index 5269134..8acc600 100644 --- a/account-ui/src/main/java/de/muehlencord/shared/account/web/presentation/UniquePermissionNameValidator.java +++ b/account-ui/src/main/java/de/muehlencord/shared/account/web/presentation/UniquePermissionNameValidator.java @@ -1,61 +1,60 @@ -package de.muehlencord.shared.account.web.presentation; - -import de.muehlencord.shared.account.business.account.entity.ApplicationPermissionEntity; -import de.muehlencord.shared.account.business.application.control.ApplicationPermissionControl; -import de.muehlencord.shared.account.business.application.entity.ApplicationEntity; -import de.muehlencord.shared.account.util.AccountPU; -import java.io.Serializable; -import javax.ejb.EJB; -import javax.faces.application.FacesMessage; -import javax.faces.component.UIComponent; -import javax.faces.context.FacesContext; -import javax.faces.validator.FacesValidator; -import javax.faces.validator.Validator; -import javax.faces.validator.ValidatorException; -import javax.inject.Inject; -import javax.persistence.EntityManager; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * - * @author Joern Muehlencord - */ -@FacesValidator("uniquePermissionNameValidator") -public class UniquePermissionNameValidator implements Validator, Serializable { - - private static final long serialVersionUID = 2526409681909574670L; - private static final Logger LOGGER = LoggerFactory.getLogger(UniquePermissionNameValidator.class); - - @Inject - @AccountPU - EntityManager em; - - @EJB - ApplicationPermissionControl applicationPermissionControl; - - @Override - public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { - Object applicationObj = component.getAttributes().get("application"); - if ((applicationObj != null) && (applicationObj instanceof ApplicationEntity)) { - ApplicationEntity application = (ApplicationEntity) applicationObj; - if (value == null) { - throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Permission name invalid", "Permission name must not be empty")); - } - if (value instanceof String) { - String permissionName = (String) value; - ApplicationPermissionEntity existingPermission = applicationPermissionControl.findPermissionByName(application, permissionName); - if (existingPermission != null) { - throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Permission name invalid", "Permission already exists")); - } - } else { - throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Permission name invalid", "Permission name must be a string value")); - // TODO add IPRS logger - someone is trying to cheat - } - } else { - throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Application not set", "Permission name cannot be set if application is unknown")); - } - - } - -} +package de.muehlencord.shared.account.web.presentation; + +import de.muehlencord.shared.account.business.account.entity.ApplicationPermissionEntity; +import de.muehlencord.shared.account.business.application.control.ApplicationPermissionControl; +import de.muehlencord.shared.account.business.application.entity.ApplicationEntity; +import de.muehlencord.shared.account.util.AccountPU; +import java.io.Serializable; +import javax.faces.application.FacesMessage; +import javax.faces.component.UIComponent; +import javax.faces.context.FacesContext; +import javax.faces.validator.FacesValidator; +import javax.faces.validator.Validator; +import javax.faces.validator.ValidatorException; +import javax.inject.Inject; +import javax.persistence.EntityManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * + * @author Joern Muehlencord + */ +@FacesValidator("uniquePermissionNameValidator") +public class UniquePermissionNameValidator implements Validator, Serializable { + + private static final long serialVersionUID = 2526409681909574670L; + private static final Logger LOGGER = LoggerFactory.getLogger(UniquePermissionNameValidator.class); + + @Inject + @AccountPU + EntityManager em; + + @Inject + ApplicationPermissionControl applicationPermissionControl; + + @Override + public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { + Object applicationObj = component.getAttributes().get("application"); + if ((applicationObj != null) && (applicationObj instanceof ApplicationEntity)) { + ApplicationEntity application = (ApplicationEntity) applicationObj; + if (value == null) { + throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Permission name invalid", "Permission name must not be empty")); + } + if (value instanceof String) { + String permissionName = (String) value; + ApplicationPermissionEntity existingPermission = applicationPermissionControl.findPermissionByName(application, permissionName); + if (existingPermission != null) { + throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Permission name invalid", "Permission already exists")); + } + } else { + throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Permission name invalid", "Permission name must be a string value")); + // TODO add IPRS logger - someone is trying to cheat + } + } else { + throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Application not set", "Permission name cannot be set if application is unknown")); + } + + } + +} diff --git a/account/src/main/java/de/muehlencord/shared/account/business/application/control/ApplicationRoleControl.java b/account/src/main/java/de/muehlencord/shared/account/business/application/control/ApplicationRoleControl.java index 6068b6f..9902cab 100644 --- a/account/src/main/java/de/muehlencord/shared/account/business/application/control/ApplicationRoleControl.java +++ b/account/src/main/java/de/muehlencord/shared/account/business/application/control/ApplicationRoleControl.java @@ -1,149 +1,150 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -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.ApplicationPermissionEntity; -import de.muehlencord.shared.account.business.account.entity.ApplicationRoleEntity; -import de.muehlencord.shared.account.business.application.entity.ApplicationEntity; -import de.muehlencord.shared.account.util.AccountPU; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.inject.Inject; -import javax.persistence.EntityManager; -import javax.persistence.OptimisticLockException; -import javax.persistence.Query; -import javax.transaction.Transactional; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * - * @author Joern Muehlencord - */ -@Stateless -public class ApplicationRoleControl implements Serializable { - - private static final long serialVersionUID = 5962478269550134748L; - private static final Logger LOGGER = LoggerFactory.getLogger(ApplicationRoleControl.class); - - @EJB - ApplicationPermissionControl applicationPermissionControl; - - @Inject - @AccountPU - EntityManager em; - - public List getAllRoles(ApplicationEntity app) { - Query query = em.createNamedQuery("ApplicationRoleEntity.findAll"); - query.setParameter("application", app); - - List roles = query.getResultList(); - if (roles == null) { - return new ArrayList<>(); - } else { - return roles; - } - } - - @Transactional - public void createOrUpdate(ApplicationEntity application, String name, String description) { - ApplicationRoleEntity role = findByName(application, name); - if (role == null) { - role = new ApplicationRoleEntity(application, name, description); - em.persist(role); - } else { - role.setRoleDescription(description); - em.merge(role); - } - } - - @Transactional - public void create(ApplicationRoleEntity role) { - em.persist(role); - } - - @Transactional - public void update(ApplicationRoleEntity role) { - em.merge(role); - } - - public void delete(ApplicationRoleEntity role) throws AccountException { - ApplicationRoleEntity existingRole = attach(role); - em.remove(existingRole); - } - - public ApplicationRoleEntity attach(ApplicationRoleEntity role) throws AccountException { - try { - return em.merge(role); - } catch (OptimisticLockException ex) { - throw new AccountException("Entity updated / deleted, please reload", true); - } - } - - public ApplicationRoleEntity findByName(ApplicationEntity application, String name) { - Query query = em.createNamedQuery("ApplicationRoleEntity.findByRoleName"); - query.setParameter("application", application); - query.setParameter("roleName", name); - List permissions = query.getResultList(); - if ((permissions == null) || (permissions.isEmpty())) { - return null; - } else { - return permissions.get(0); - } - } - - public List getRolePermissions(ApplicationRoleEntity role) throws AccountException { - ApplicationRoleEntity existingRole = em.find(ApplicationRoleEntity.class, role.getId()); - List permissions = existingRole.getApplicationPermissionList(); - permissions.size(); // force list to load - return permissions; - } - - public List getNotAssignedApplicationPermissions(ApplicationRoleEntity role) { - try { - List rolePermissions = getRolePermissions(role); - List allPermssions = applicationPermissionControl.getApplicationPermissions(role.getApplication()); - - List missingPermissions = new ArrayList<>(); - allPermssions.stream().filter((perm) -> (!rolePermissions.contains(perm))).forEachOrdered((perm) -> { - missingPermissions.add(perm); - }); - return missingPermissions; - } catch (AccountException ex) { - if (LOGGER.isDebugEnabled()) { - LOGGER.debug(ex.toString(), ex); - } else { - LOGGER.debug(ex.toString()); - } - return null; - } - - } - - @Transactional - public void addPermission(ApplicationRoleEntity role, ApplicationPermissionEntity permission) throws AccountException { - ApplicationRoleEntity existingRole = attach(role); - if (existingRole.getApplicationPermissionList() == null) { - existingRole.setApplicationPermissionList(new ArrayList<>()); - } - existingRole.getApplicationPermissionList().add(permission); - em.merge(role); - } - - @Transactional - public void removePermission(ApplicationRoleEntity role, ApplicationPermissionEntity permission) throws AccountException { - ApplicationRoleEntity existingRole = attach(role); - if ((existingRole.getApplicationPermissionList() != null) && (existingRole.getApplicationPermissionList().contains(permission))) { - existingRole.getApplicationPermissionList().remove(permission); - } - em.merge(role); - } - -} +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +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.ApplicationPermissionEntity; +import de.muehlencord.shared.account.business.account.entity.ApplicationRoleEntity; +import de.muehlencord.shared.account.business.application.entity.ApplicationEntity; +import de.muehlencord.shared.account.util.AccountPU; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import javax.ejb.EJB; +import javax.ejb.Stateless; +import javax.inject.Inject; +import javax.persistence.EntityManager; +import javax.persistence.OptimisticLockException; +import javax.persistence.Query; +import javax.transaction.Transactional; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * + * @author Joern Muehlencord + */ +@Stateless +public class ApplicationRoleControl implements Serializable { + + private static final long serialVersionUID = 5962478269550134748L; + private static final Logger LOGGER = LoggerFactory.getLogger(ApplicationRoleControl.class); + + @EJB + ApplicationPermissionControl applicationPermissionControl; + + @Inject + @AccountPU + EntityManager em; + + public List getAllRoles(ApplicationEntity app) { + Query query = em.createNamedQuery("ApplicationRoleEntity.findAll"); + query.setParameter("application", app); + + List roles = query.getResultList(); + if (roles == null) { + return new ArrayList<>(); + } else { + return roles; + } + } + + @Transactional + public void createOrUpdate(ApplicationEntity application, String name, String description) { + ApplicationRoleEntity role = findByName(application, name); + if (role == null) { + role = new ApplicationRoleEntity(application, name, description); + em.persist(role); + } else { + role.setRoleDescription(description); + em.merge(role); + } + } + + @Transactional + public void create(ApplicationRoleEntity role) { + em.persist(role); + } + + @Transactional + public void update(ApplicationRoleEntity role) { + em.merge(role); + } + + @Transactional + public void delete(ApplicationRoleEntity role) throws AccountException { + ApplicationRoleEntity existingRole = attach(role); + em.remove(existingRole); + } + + public ApplicationRoleEntity attach(ApplicationRoleEntity role) throws AccountException { + try { + return em.merge(role); + } catch (OptimisticLockException ex) { + throw new AccountException("Entity updated / deleted, please reload", true); + } + } + + public ApplicationRoleEntity findByName(ApplicationEntity application, String name) { + Query query = em.createNamedQuery("ApplicationRoleEntity.findByRoleName"); + query.setParameter("application", application); + query.setParameter("roleName", name); + List permissions = query.getResultList(); + if ((permissions == null) || (permissions.isEmpty())) { + return null; + } else { + return permissions.get(0); + } + } + + public List getRolePermissions(ApplicationRoleEntity role) throws AccountException { + ApplicationRoleEntity existingRole = em.find(ApplicationRoleEntity.class, role.getId()); + List permissions = existingRole.getApplicationPermissionList(); + permissions.size(); // force list to load + return permissions; + } + + public List getNotAssignedApplicationPermissions(ApplicationRoleEntity role) { + try { + List rolePermissions = getRolePermissions(role); + List allPermssions = applicationPermissionControl.getApplicationPermissions(role.getApplication()); + + List missingPermissions = new ArrayList<>(); + allPermssions.stream().filter((perm) -> (!rolePermissions.contains(perm))).forEachOrdered((perm) -> { + missingPermissions.add(perm); + }); + return missingPermissions; + } catch (AccountException ex) { + if (LOGGER.isDebugEnabled()) { + LOGGER.debug(ex.toString(), ex); + } else { + LOGGER.debug(ex.toString()); + } + return null; + } + + } + + @Transactional + public void addPermission(ApplicationRoleEntity role, ApplicationPermissionEntity permission) throws AccountException { + ApplicationRoleEntity existingRole = attach(role); + if (existingRole.getApplicationPermissionList() == null) { + existingRole.setApplicationPermissionList(new ArrayList<>()); + } + existingRole.getApplicationPermissionList().add(permission); + em.merge(role); + } + + @Transactional + public void removePermission(ApplicationRoleEntity role, ApplicationPermissionEntity permission) throws AccountException { + ApplicationRoleEntity existingRole = attach(role); + if ((existingRole.getApplicationPermissionList() != null) && (existingRole.getApplicationPermissionList().contains(permission))) { + existingRole.getApplicationPermissionList().remove(permission); + } + em.merge(role); + } + +}