diff --git a/account/src/main/java/de/muehlencord/shared/account/business/account/AccountException.java b/account/src/main/java/de/muehlencord/shared/account/business/account/AccountException.java index 04cc492..5699b06 100644 --- a/account/src/main/java/de/muehlencord/shared/account/business/account/AccountException.java +++ b/account/src/main/java/de/muehlencord/shared/account/business/account/AccountException.java @@ -22,4 +22,8 @@ public class AccountException extends Exception { public AccountException(String msg) { super(msg); } + + AccountException(String entity_updated__deleted_please_reload, boolean b) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } } diff --git a/account/src/main/java/de/muehlencord/shared/account/business/account/ApplicationPermissionControl.java b/account/src/main/java/de/muehlencord/shared/account/business/account/ApplicationPermissionControl.java new file mode 100644 index 0000000..49cc4a9 --- /dev/null +++ b/account/src/main/java/de/muehlencord/shared/account/business/account/ApplicationPermissionControl.java @@ -0,0 +1,70 @@ +package de.muehlencord.shared.account.business.account; + +import de.muehlencord.shared.account.entity.ApplicationPermissionEntity; +import java.io.Serializable; +import javax.ejb.Stateless; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import java.util.List; +import java.util.ArrayList; +import javax.persistence.OptimisticLockException; +import javax.persistence.Query; +import javax.transaction.Transactional; + +/** + * + * @author Joern Muehlencord + */ +@Stateless +public class ApplicationPermissionControl implements Serializable { + + private static final long serialVersionUID = -3761100587901739481L; + + @PersistenceContext + EntityManager em; + + public List getApplicationPermissions() { + List permissionList = em.createNamedQuery("ApplicationPermissionEntity.findAll").getResultList(); + if (permissionList == null) { + return new ArrayList<>(); + } else { + return permissionList; + } + } + + @Transactional + public void createOrUpdate(String name, String description) { + ApplicationPermissionEntity permission = findByName(name); + if (permission == null) { + permission = new ApplicationPermissionEntity(name, description); + em.persist(permission); + } else { + permission.setPermissionDescription(description); + em.merge(permission); + } + } + + public void delete(ApplicationPermissionEntity permission) throws AccountException { + ApplicationPermissionEntity existingPermission = attach(permission); + em.remove(existingPermission); + } + + public ApplicationPermissionEntity attach(ApplicationPermissionEntity permission) throws AccountException { + try { + return em.merge(permission); + } catch (OptimisticLockException ex) { + throw new AccountException("Entity updated / deleted, please reload", true); + } + } + + private ApplicationPermissionEntity findByName(String name) { + Query query = em.createNamedQuery("ApplicationPermissionEntity.findByPermissionName"); + query.setParameter("permissionName", name); + List permissions = query.getResultList(); + if ((permissions == null) || (permissions.isEmpty())) { + return null; + } else { + return permissions.get(0); + } + } +} diff --git a/account/src/main/java/de/muehlencord/shared/account/business/account/ApplicationRoleControl.java b/account/src/main/java/de/muehlencord/shared/account/business/account/ApplicationRoleControl.java new file mode 100644 index 0000000..3a52921 --- /dev/null +++ b/account/src/main/java/de/muehlencord/shared/account/business/account/ApplicationRoleControl.java @@ -0,0 +1,135 @@ +/* + * 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.account; + +import de.muehlencord.shared.account.entity.ApplicationPermissionEntity; +import de.muehlencord.shared.account.entity.ApplicationRoleEntity; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import javax.ejb.EJB; +import javax.ejb.Stateless; +import javax.persistence.EntityManager; +import javax.persistence.OptimisticLockException; +import javax.persistence.PersistenceContext; +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; + + @PersistenceContext + EntityManager em; + + public List getAllRoles() { + Query query = em.createNamedQuery("ApplicationRoleEntity.findAll"); + + List roles = query.getResultList(); + if (roles == null) { + return new ArrayList<>(); + } else { + return roles; + } + } + + @Transactional + public void createOrUpdate(String name, String description) { + ApplicationRoleEntity role = findByName(name); + if (role == null) { + role = new ApplicationRoleEntity(name, description); + em.persist(role); + } else { + role.setRoleDescription(description); + em.merge(role); + } + } + + public void delete(ApplicationRoleEntity permission) throws AccountException { + ApplicationRoleEntity existingPermission = attach(permission); + em.remove(existingPermission); + } + + public ApplicationRoleEntity attach(ApplicationRoleEntity permission) throws AccountException { + try { + return em.merge(permission); + } catch (OptimisticLockException ex) { + throw new AccountException("Entity updated / deleted, please reload", true); + } + } + + private ApplicationRoleEntity findByName(String name) { + Query query = em.createNamedQuery("ApplicationRoleEntity.findByRoleName"); + 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(); + + 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); + } + + + +} diff --git a/account/src/main/java/de/muehlencord/shared/account/entity/ApplicationPermissionEntity.java b/account/src/main/java/de/muehlencord/shared/account/entity/ApplicationPermissionEntity.java index 5485c2d..ee7e489 100644 --- a/account/src/main/java/de/muehlencord/shared/account/entity/ApplicationPermissionEntity.java +++ b/account/src/main/java/de/muehlencord/shared/account/entity/ApplicationPermissionEntity.java @@ -8,7 +8,6 @@ import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; -import javax.persistence.Lob; import javax.persistence.ManyToMany; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; @@ -28,7 +27,8 @@ import org.hibernate.annotations.Type; @Table(name = "application_permission") @XmlRootElement @NamedQueries({ - @NamedQuery(name = "ApplicationPermissionEntity.findAll", query = "SELECT a FROM ApplicationPermissionEntity a"), + @NamedQuery(name = "ApplicationPermissionEntity.findAll", query = "SELECT a FROM ApplicationPermissionEntity a order by a.permissionName"), + @NamedQuery(name = "ApplicationPermissionEntity.findNotAssigned", query = "SELECT a FROM ApplicationPermissionEntity a LEFT OUTER JOIN a.applicationRoleList r WHERE r NOT IN :permissions"), @NamedQuery(name = "ApplicationPermissionEntity.findByPermissionName", query = "SELECT a FROM ApplicationPermissionEntity a WHERE a.permissionName = :permissionName"), @NamedQuery(name = "ApplicationPermissionEntity.findByPermissionDescription", query = "SELECT a FROM ApplicationPermissionEntity a WHERE a.permissionDescription = :permissionDescription")}) public class ApplicationPermissionEntity implements Serializable { @@ -62,6 +62,12 @@ public class ApplicationPermissionEntity implements Serializable { public ApplicationPermissionEntity(UUID id) { this.id = id; } + + public ApplicationPermissionEntity(String permissionName, String permissionDescription) { + this.id = null; + this.permissionName = permissionName; + this.permissionDescription = permissionDescription; + } public ApplicationPermissionEntity(UUID id, String permissionName, String permissionDescription) { this.id = id; diff --git a/account/src/main/java/de/muehlencord/shared/account/entity/ApplicationRoleEntity.java b/account/src/main/java/de/muehlencord/shared/account/entity/ApplicationRoleEntity.java index 328bc22..cfec8a5 100644 --- a/account/src/main/java/de/muehlencord/shared/account/entity/ApplicationRoleEntity.java +++ b/account/src/main/java/de/muehlencord/shared/account/entity/ApplicationRoleEntity.java @@ -10,7 +10,6 @@ import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; -import javax.persistence.Lob; import javax.persistence.ManyToMany; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; @@ -30,14 +29,14 @@ import org.hibernate.annotations.Type; @Table(name = "application_role") @XmlRootElement @NamedQueries({ - @NamedQuery(name = "ApplicationRoleEntity.findAll", query = "SELECT a FROM ApplicationRoleEntity a"), - @NamedQuery(name = "ApplicationRoleEntity.findByRoleName", query = "SELECT a FROM ApplicationRoleEntity a WHERE a.roleName = :roleName"), - @NamedQuery(name = "ApplicationRoleEntity.findByRoleDescription", query = "SELECT a FROM ApplicationRoleEntity a WHERE a.roleDescription = :roleDescription")}) + @NamedQuery(name = "ApplicationRoleEntity.findAll", query = "SELECT a FROM ApplicationRoleEntity a ORDER BY a.roleName") + , @NamedQuery(name = "ApplicationRoleEntity.findByRoleName", query = "SELECT a FROM ApplicationRoleEntity a WHERE a.roleName = :roleName") + , @NamedQuery(name = "ApplicationRoleEntity.findByRoleDescription", query = "SELECT a FROM ApplicationRoleEntity a WHERE a.roleDescription = :roleDescription")}) + public class ApplicationRoleEntity implements Serializable { private static final long serialVersionUID = -8324054525780893823L; - @Id @Basic(optional = false) @NotNull @@ -71,6 +70,12 @@ public class ApplicationRoleEntity implements Serializable { this.id = id; } + public ApplicationRoleEntity(String roleName, String roleDescription) { + this.id = null; + this.roleName = roleName; + this.roleDescription = roleDescription; + } + public ApplicationRoleEntity(UUID id, String roleName, String roleDescription) { this.id = id; this.roleName = roleName; @@ -143,5 +148,5 @@ public class ApplicationRoleEntity implements Serializable { public String toString() { return "de.muehlencord.shared.account.entity.ApplicationRole[ id=" + id + " ]"; } - + }