added application support for permissions

This commit is contained in:
2018-11-11 15:08:37 +01:00
parent c5a70b9d11
commit ea3ebdddf5
13 changed files with 370 additions and 198 deletions

View File

@ -6,9 +6,9 @@ import de.muehlencord.shared.jeeutil.FacesUtil;
import java.io.Serializable; import java.io.Serializable;
import java.util.List; import java.util.List;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import javax.enterprise.context.SessionScoped; import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -16,7 +16,7 @@ import org.slf4j.LoggerFactory;
* *
* @author Joern Muehlencord <joern at muehlencord.de> * @author Joern Muehlencord <joern at muehlencord.de>
*/ */
@Named(value = "applicationView") @ManagedBean (name="applicationView")
@SessionScoped @SessionScoped
public class ApplicationView implements Serializable { public class ApplicationView implements Serializable {
@ -80,6 +80,21 @@ public class ApplicationView implements Serializable {
} }
} }
public void deleteApplication() {
if (currentApplication == null) {
FacesUtil.addGlobalErrorMessage("Error", "Need to provide data");
} else if (currentApplication.getId() == null) {
FacesUtil.addGlobalErrorMessage("Error", "Cannot delete non persistent data");
} else {
String applicationName = currentApplication.getApplicationName();
applicationService.delete (currentApplication);
applicationList = null; // force reload to update view
currentApplication = null;
selectDefaultCurrentApplication();
FacesUtil.addGlobalInfoMessage("Info", "Application "+applicationName+" deleted");
}
}
/* *** getter / setter *** */ /* *** getter / setter *** */
public ApplicationEntity getCurrentApplication() { public ApplicationEntity getCurrentApplication() {
return currentApplication; return currentApplication;

View File

@ -18,12 +18,14 @@ package de.muehlencord.shared.account.web.presentation;
import de.muehlencord.shared.account.business.account.boundary.ApplicationPermissionControl; import de.muehlencord.shared.account.business.account.boundary.ApplicationPermissionControl;
import de.muehlencord.shared.account.business.account.entity.AccountException; 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.ApplicationPermissionEntity;
import de.muehlencord.shared.account.business.application.entity.ApplicationEntity;
import de.muehlencord.shared.jeeutil.FacesUtil; import de.muehlencord.shared.jeeutil.FacesUtil;
import java.io.Serializable; import java.io.Serializable;
import java.util.List; import java.util.List;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped; import javax.faces.bean.ManagedBean;
import javax.inject.Named; import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -31,23 +33,28 @@ import org.slf4j.LoggerFactory;
* *
* @author Joern Muehlencord <joern at muehlencord.de> * @author Joern Muehlencord <joern at muehlencord.de>
*/ */
@ManagedBean(name = "permissionView")
@SessionScoped @SessionScoped
@Named
public class PermissionView implements Serializable { public class PermissionView implements Serializable {
private static final long serialVersionUID = -1469453490360990772L; private static final long serialVersionUID = -1469453490360990772L;
private static final Logger LOGGER = LoggerFactory.getLogger(PermissionView.class); private static final Logger LOGGER = LoggerFactory.getLogger(PermissionView.class);
@ManagedProperty(value = "#{applicationView}")
private ApplicationView applicationView;
@EJB @EJB
ApplicationPermissionControl applicationPermissionService; ApplicationPermissionControl applicationPermissionService;
private ApplicationPermissionEntity currentPermission; private ApplicationPermissionEntity currentPermission;
public List<ApplicationPermissionEntity> getAppPermissions() { public List<ApplicationPermissionEntity> getAppPermissions() {
return applicationPermissionService.getApplicationPermissions(); return applicationPermissionService.getApplicationPermissions(applicationView.getCurrentApplication());
} }
public void saveEditPermission() throws AccountException { public void saveEditPermission() throws AccountException {
if (currentPermission != null) { if (currentPermission != null) {
ApplicationEntity currentApplication = applicationView.getCurrentApplication();
String currentApplicationName = currentApplication.getApplicationName();
String newPermissionName = currentPermission.getPermissionName(); String newPermissionName = currentPermission.getPermissionName();
String newPermissionDescription = currentPermission.getPermissionDescription(); String newPermissionDescription = currentPermission.getPermissionDescription();
if ((newPermissionName == null) || (newPermissionName.trim().length() == 0)) { if ((newPermissionName == null) || (newPermissionName.trim().length() == 0)) {
@ -56,7 +63,7 @@ public class PermissionView implements Serializable {
FacesUtil.addErrorMessage("editDialogMessages", "Error", "Permission name must not be null"); FacesUtil.addErrorMessage("editDialogMessages", "Error", "Permission name must not be null");
} else { } else {
if (currentPermission.getId() == null) { if (currentPermission.getId() == null) {
applicationPermissionService.create(newPermissionName, newPermissionName); applicationPermissionService.create(currentApplicationName, newPermissionName, newPermissionName);
FacesUtil.addGlobalInfoMessage("Info", "Permission " + newPermissionName + " created"); FacesUtil.addGlobalInfoMessage("Info", "Permission " + newPermissionName + " created");
// deselectPermission(); // deselectPermission();
} else { } else {
@ -68,6 +75,14 @@ public class PermissionView implements Serializable {
} }
} }
public ApplicationEntity getCurrentApplication() {
if (applicationView.getCurrentApplication() == null) {
return null;
} else {
return applicationView.getCurrentApplication();
}
}
public void cancelEditPermission() { public void cancelEditPermission() {
this.currentPermission = null; this.currentPermission = null;
} }
@ -100,19 +115,8 @@ public class PermissionView implements Serializable {
} }
} }
// public void selectPermission() {
// this.permissionSelected = true;
// }
//
// public void deselectPermission() {
// this.permissionSelected = false;
// }
public boolean getCanEdit() { public boolean getCanEdit() {
if (!isPermissionSelected()) { return isPermissionSelected();
return false;
}
return true;
} }
public boolean getCanDelete() { public boolean getCanDelete() {
@ -120,6 +124,16 @@ public class PermissionView implements Serializable {
} }
/* *** getter / setter *** */ /* *** getter / setter *** */
/**
* required setter for managedProperty
*
*
* @param applicationView the injected applicationView
*/
public void setApplicationView(ApplicationView applicationView) {
this.applicationView = applicationView;
}
public ApplicationPermissionEntity getCurrentPermission() { public ApplicationPermissionEntity getCurrentPermission() {
return currentPermission; return currentPermission;
} }
@ -132,9 +146,4 @@ public class PermissionView implements Serializable {
public boolean isPermissionSelected() { public boolean isPermissionSelected() {
return currentPermission != null; return currentPermission != null;
} }
// public void setPermissionSelected(boolean permissionSelected) {
// this.permissionSelected = permissionSelected;
// }
} }

View File

@ -1,13 +1,15 @@
package de.muehlencord.shared.account.web.presentation; 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 java.io.Serializable;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent; import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext; import javax.faces.context.FacesContext;
import javax.faces.validator.FacesValidator; import javax.faces.validator.FacesValidator;
import javax.faces.validator.Validator; import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException; import javax.faces.validator.ValidatorException;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -21,16 +23,26 @@ public class UniqueApplicationValidator implements Validator, Serializable {
private static final long serialVersionUID = 2526409681909574670L; private static final long serialVersionUID = 2526409681909574670L;
private static final Logger LOGGER = LoggerFactory.getLogger(UniqueApplicationValidator.class); private static final Logger LOGGER = LoggerFactory.getLogger(UniqueApplicationValidator.class);
@Inject @EJB
EntityManager em; ApplicationService applicationService;
@Override @Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
String name = (String) value; if (value == null) {
LOGGER.info("Name = {}", name) ; throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Application name invalid", "Application name must not be empty"));
}
if (value instanceof String) {
String applicationname = (String) value;
ApplicationEntity existingApplication = applicationService.findByApplicationName(applicationname);
if (existingApplication != null) {
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Application name invalid", "Application already exists"));
}
LOGGER.info("Name = {}", applicationname);
} else {
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Application name invalid", "Application name must be a string value"));
// TODO add IPRS logger - someone is trying to cheat
} }
}
} }

View File

@ -0,0 +1,59 @@
package de.muehlencord.shared.account.web.presentation;
import de.muehlencord.shared.account.business.account.boundary.ApplicationPermissionControl;
import de.muehlencord.shared.account.business.account.entity.ApplicationPermissionEntity;
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 javax.persistence.EntityManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author Joern Muehlencord <joern at muehlencord.de>
*/
@FacesValidator("uniquePermissionNameValidator")
public class UniquePermissionNameValidator implements Validator, Serializable {
private static final long serialVersionUID = 2526409681909574670L;
private static final Logger LOGGER = LoggerFactory.getLogger(UniquePermissionNameValidator.class);
@Inject
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"));
}
}
}

View File

@ -83,7 +83,7 @@
</div> </div>
<div class="col-sm-12 col-md-3"> <div class="col-sm-12 col-md-3">
<p:spacer height="10px" /> <p:spacer height="10px" />
<p:commandButton value="Delete" id="deleteButton" icon="fa fa-fw fa-trash-o" <p:commandButton value="Delete" id="deleteButton" icon="fa fa-trash-o"
update=":accountForm:accountTable" action="#{accountView.deleteAccount}" disabled="#{!accountView.accountSelected}" styleClass="btn-danger btn-block"> update=":accountForm:accountTable" action="#{accountView.deleteAccount}" disabled="#{!accountView.accountSelected}" styleClass="btn-danger btn-block">
<p:confirm header="Confirmation" message="Are you sure?" icon="fa fa-exclamation-triangle" /> <p:confirm header="Confirmation" message="Are you sure?" icon="fa fa-exclamation-triangle" />
</p:commandButton> </p:commandButton>

View File

@ -23,16 +23,25 @@
<f:selectItems value="#{applicationView.allApplications}" var="app" itemLabel="#{app.applicationName}" itemValue="#{app}" /> <f:selectItems value="#{applicationView.allApplications}" var="app" itemLabel="#{app.applicationName}" itemValue="#{app}" />
</p:selectOneMenu> </p:selectOneMenu>
</div> </div>
<div class="col-sm-12 col-md-3"> <div class="col-sm-12 col-md-2">
<p:commandButton value="Select" styleClass="btn-primary btn-solid}" actionListener="#{applicationView.selectApplication}" /> <p:commandButton value="Select" styleClass="btn-primary btn-solid}" actionListener="#{applicationView.selectApplication}" />
</div> </div>
<div class="col-sm-12 col-md-3"> <div class="col-sm-12 col-md-2">
<p:commandButton value="New" id="newButton" icon="fa fa-plus" <p:commandButton value="New" id="newButton" icon="fa fa-plus"
update="editDialog" oncomplete="PF('editDialogVar').show();" update="editDialog" oncomplete="PF('editDialogVar').show();"
actionListener="#{applicationView.newApplication}" styleClass="btn-teal btn-block" /> actionListener="#{applicationView.newApplication}" styleClass="btn-teal btn-block" />
</div> </div>
<div class="col-sm-12 col-md-2">
<p:commandButton id="deletePermissionButton" icon="fa fa-trash-o" value="#{msgs.button_delete}" actionListener="#{applicationView.deleteApplication}"
update="applicationSelect" styleClass="btn-danger btn-block" >
<p:confirm header="Confirmation" message="Are you sure?" icon="fa fa-exclamation-triangle" />
</p:commandButton>
</div>
</div> </div>
</p:panel> </p:panel>
<composite:confirmationDialog />
</h:form> </h:form>
<p:dialog id="editDialog" widgetVar="editDialogVar" header="Edit account" width="600" <p:dialog id="editDialog" widgetVar="editDialogVar" header="Edit account" width="600"
@ -49,19 +58,18 @@
<div class="col-sm-12 col-md-6"> <div class="col-sm-12 col-md-6">
<p:inputText id="applicationName" value="#{applicationView.editApplication.applicationName}"> <p:inputText id="applicationName" value="#{applicationView.editApplication.applicationName}">
<f:validator validatorId="uniqueApplicationValidator"/> <f:validator validatorId="uniqueApplicationValidator"/>
<f:attribute name="applicationName" value="#{applicationView.editApplication.applicationName}" />
</p:inputText> </p:inputText>
</div> </div>
<div class="col-sm-12 col-md-3"> <div class="col-sm-12 col-md-3">
<p:message for="applicationName"><p:autoUpdate /></p:message> <p:message for="applicationName"><p:autoUpdate /></p:message>
</div> </div>
<div class="col-sm-12 col-md-6"> <div class="col-sm-12 col-md-3">
<p:spacer height="10px" /> <p:spacer height="10px" />
<p:commandButton value="Save" action="#{applicationView.saveEditApplication}" styleClass="btn-primary btn-block" <p:commandButton value="Save" action="#{applicationView.saveEditApplication}" styleClass="btn-primary btn-block"
oncomplete="if (args &amp;&amp; !args.validationFailed) PF('editDialogVar').hide();" update=":applicationForm" /> oncomplete="if (args &amp;&amp; !args.validationFailed) PF('editDialogVar').hide();" update=":applicationForm" />
</div> </div>
<div class="col-sm-12 col-md-6"> <div class="col-sm-12 col-md-3">
<p:spacer height="10px" /> <p:spacer height="10px" />
<p:commandButton value="Cancel" action="#{applicationView.cancelEditApplication}" immediate="true" styleClass="btn-teal btn-block" <p:commandButton value="Cancel" action="#{applicationView.cancelEditApplication}" immediate="true" styleClass="btn-teal btn-block"
oncomplete="PF('editDialogVar').hide();" /> oncomplete="PF('editDialogVar').hide();" />

View File

@ -44,7 +44,7 @@
<div class="ui-g-12 ui-md-2"> <div class="ui-g-12 ui-md-2">
<p:commandButton id="deletePermissionButton" icon="fa fa-trash-o" value="#{msgs.button_delete}" actionListener="#{permissionView.deletePermission}" <p:commandButton id="deletePermissionButton" icon="fa fa-trash-o" value="#{msgs.button_delete}" actionListener="#{permissionView.deletePermission}"
update="permissionForm" styleClass="btn-danger btn-block" disabled="#{!permissionView.canDelete}"> update="permissionForm" styleClass="btn-danger btn-block" disabled="#{!permissionView.canDelete}">
<p:confirm header="Confirmation" message="Are you sure?" icon="fa fa-fw fa-exclamation-triangle" /> <p:confirm header="Confirmation" message="Are you sure?" icon="fa fa-exclamation-triangle" />
</p:commandButton> </p:commandButton>
</div> </div>
</f:facet> </f:facet>
@ -66,7 +66,11 @@
<div class="ui-g-12 ui-md-3"> <div class="ui-g-12 ui-md-3">
<div class="ui-inputgroup"> <div class="ui-inputgroup">
<span class="ui-inputgroup-addon"><i style="font-size: 20px" class="fa fa-edit"></i></span> <span class="ui-inputgroup-addon"><i style="font-size: 20px" class="fa fa-edit"></i></span>
<p:inputText id="newName" value="#{permissionView.currentPermission.permissionName}" maxlength="80" size="30" placeholder="#{msgs.label_name}" /> <p:inputText id="newName" value="#{permissionView.currentPermission.permissionName}" maxlength="80" size="30" placeholder="#{msgs.label_name}" >
<f:validator validatorId="uniquePermissionNameValidator"/>
<!--<f:attribute name="permissionName" value="#{permissionView.currentPermission.permissionName}" />-->
<f:attribute name="application" value="#{permissionView.currentApplication}" />
</p:inputText>
</div> </div>
</div> </div>
<div class="col-sm-12 col-md-9"> <div class="col-sm-12 col-md-9">

View File

@ -33,14 +33,14 @@
</div> </div>
</div> </div>
<div class="ui-g-12 ui-md-2"> <div class="ui-g-12 ui-md-2">
<p:commandButton icon="fa fa-fw fa-plus" value="#{msgs.button_save}" action="#{groupView.newRole}" update="groupForm" styleClass="btn-primary btn-block"/> <p:commandButton icon="fa fa-plus" value="#{msgs.button_save}" action="#{groupView.newRole}" update="groupForm" styleClass="btn-primary btn-block"/>
</div> </div>
<div class="ui-g-12 ui-md-2"> <div class="ui-g-12 ui-md-2">
<p:commandButton icon="fa fa-fw fa-pencil" value="#{msgs.button_edit}" action="#{groupView.editRole}" update="groupForm" styleClass="btn-teal btn-block"/> <p:commandButton icon="fa fa-pencil" value="#{msgs.button_edit}" action="#{groupView.editRole}" update="groupForm" styleClass="btn-teal btn-block"/>
</div> </div>
<div class="ui-g-12 ui-md-2"> <div class="ui-g-12 ui-md-2">
<p:commandButton icon="fa fa-fw fa-trash-o" value="#{msgs.button_delete}" action="#{groupView.deleteRole}" update="groupForm" styleClass="btn-danger btn-block"> <p:commandButton icon="fa fa-trash-o" value="#{msgs.button_delete}" action="#{groupView.deleteRole}" update="groupForm" styleClass="btn-danger btn-block">
<p:confirm header="Confirmation" message="Are you sure?" icon="fa fa-fw fa-exclamation-triangle" /> <p:confirm header="Confirmation" message="Are you sure?" icon="fa fa-exclamation-triangle" />
</p:commandButton> </p:commandButton>
</div> </div>
</div> </div>
@ -82,7 +82,7 @@
<p:commandButton id="deletePermissionButton" icon="fa fa-trash-o" value="Delete" update=":groupForm:groupTable,:groupForm:permissionTable" <p:commandButton id="deletePermissionButton" icon="fa fa-trash-o" value="Delete" update=":groupForm:groupTable,:groupForm:permissionTable"
action="#{groupView.removeRolePermission}" styleClass="btn-danger btn-block" action="#{groupView.removeRolePermission}" styleClass="btn-danger btn-block"
disabled="#{!groupView.isPermissionSelected}" > disabled="#{!groupView.isPermissionSelected}" >
<p:confirm header="Confirmation" message="Are you sure?" icon="fa fa-fw fa-exclamation-triangle" /> <p:confirm header="Confirmation" message="Are you sure?" icon="fa fa-exclamation-triangle" />
</p:commandButton> </p:commandButton>
</div> </div>
</f:facet> </f:facet>

View File

@ -2,12 +2,15 @@ package de.muehlencord.shared.account.business.account.boundary;
import de.muehlencord.shared.account.business.account.entity.AccountException; 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.ApplicationPermissionEntity;
import de.muehlencord.shared.account.business.application.boundary.ApplicationService;
import de.muehlencord.shared.account.business.application.entity.ApplicationEntity;
import java.io.Serializable; import java.io.Serializable;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import javax.persistence.EntityManager; import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext; import javax.persistence.PersistenceContext;
import java.util.List; import java.util.List;
import java.util.ArrayList; import java.util.ArrayList;
import javax.ejb.EJB;
import javax.persistence.OptimisticLockException; import javax.persistence.OptimisticLockException;
import javax.persistence.Query; import javax.persistence.Query;
import javax.transaction.Transactional; import javax.transaction.Transactional;
@ -21,11 +24,16 @@ public class ApplicationPermissionControl implements Serializable {
private static final long serialVersionUID = -3761100587901739481L; private static final long serialVersionUID = -3761100587901739481L;
@EJB
ApplicationService applicationService;
@PersistenceContext @PersistenceContext
EntityManager em; EntityManager em;
public List getApplicationPermissions() { public List<ApplicationPermissionEntity> getApplicationPermissions(ApplicationEntity application) {
List<ApplicationPermissionEntity> permissionList = em.createNamedQuery("ApplicationPermissionEntity.findAll").getResultList(); Query query = em.createNamedQuery("ApplicationPermissionEntity.findAll");
query.setParameter("application", application);
List<ApplicationPermissionEntity> permissionList = query.getResultList();
if (permissionList == null) { if (permissionList == null) {
return new ArrayList<>(); return new ArrayList<>();
} else { } else {
@ -33,14 +41,28 @@ public class ApplicationPermissionControl implements Serializable {
} }
} }
public ApplicationPermissionEntity findPermissionByName(ApplicationEntity application, String permissionName) {
Query query = em.createNamedQuery("ApplicationPermissionEntity.findByPermissionName");
query.setParameter("application", application);
query.setParameter("permissionName", permissionName);
List<ApplicationPermissionEntity> resultList = query.getResultList();
if ((resultList == null) || (resultList.isEmpty())) {
return null;
} else {
return resultList.get(0);
}
}
@Transactional @Transactional
public void create(String name, String description) { public void create(String applicationName, String name, String description) {
ApplicationPermissionEntity permission = new ApplicationPermissionEntity(name, description); ApplicationEntity application = applicationService.findByApplicationName(applicationName);
// TODO add error handling if not found
ApplicationPermissionEntity permission = new ApplicationPermissionEntity(application, name, description);
em.persist(permission); em.persist(permission);
} }
@Transactional @Transactional
public void update (ApplicationPermissionEntity permission) throws AccountException { public void update(ApplicationPermissionEntity permission) throws AccountException {
ApplicationPermissionEntity existing = attach(permission); ApplicationPermissionEntity existing = attach(permission);
em.merge(existing); em.merge(existing);
} }

View File

@ -94,7 +94,7 @@ public class ApplicationRoleControl implements Serializable {
public List<ApplicationPermissionEntity> getNotAssignedApplicationPermissions(ApplicationRoleEntity role) { public List<ApplicationPermissionEntity> getNotAssignedApplicationPermissions(ApplicationRoleEntity role) {
try { try {
List<ApplicationPermissionEntity> rolePermissions = getRolePermissions(role); List<ApplicationPermissionEntity> rolePermissions = getRolePermissions(role);
List<ApplicationPermissionEntity> allPermssions = applicationPermissionControl.getApplicationPermissions(); List<ApplicationPermissionEntity> allPermssions = applicationPermissionControl.getApplicationPermissions(role.getApplication());
List<ApplicationPermissionEntity> missingPermissions = new ArrayList<>(); List<ApplicationPermissionEntity> missingPermissions = new ArrayList<>();
allPermssions.stream().filter((perm) -> (!rolePermissions.contains(perm))).forEachOrdered((perm) -> { allPermssions.stream().filter((perm) -> (!rolePermissions.contains(perm))).forEachOrdered((perm) -> {

View File

@ -1,5 +1,6 @@
package de.muehlencord.shared.account.business.account.entity; package de.muehlencord.shared.account.business.account.entity;
import de.muehlencord.shared.account.business.application.entity.ApplicationEntity;
import java.io.Serializable; import java.io.Serializable;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
@ -8,7 +9,9 @@ import javax.persistence.Column;
import javax.persistence.Entity; import javax.persistence.Entity;
import javax.persistence.GeneratedValue; import javax.persistence.GeneratedValue;
import javax.persistence.Id; import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany; import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries; import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery; import javax.persistence.NamedQuery;
import javax.persistence.Table; import javax.persistence.Table;
@ -27,10 +30,10 @@ import org.hibernate.annotations.Type;
@Table(name = "application_permission") @Table(name = "application_permission")
@XmlRootElement @XmlRootElement
@NamedQueries({ @NamedQueries({
@NamedQuery(name = "ApplicationPermissionEntity.findAll", query = "SELECT a FROM ApplicationPermissionEntity a order by a.permissionName"), @NamedQuery(name = "ApplicationPermissionEntity.findAll", query = "SELECT a FROM ApplicationPermissionEntity a WHERE a.application=:application 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.findNotAssigned", query = "SELECT a FROM ApplicationPermissionEntity a LEFT OUTER JOIN a.applicationRoles r WHERE a.application=:application AND r NOT IN :permissions"),
@NamedQuery(name = "ApplicationPermissionEntity.findByPermissionName", query = "SELECT a FROM ApplicationPermissionEntity a WHERE a.permissionName = :permissionName"), @NamedQuery(name = "ApplicationPermissionEntity.findByPermissionName", query = "SELECT a FROM ApplicationPermissionEntity a WHERE a.application=:application AND a.permissionName = :permissionName"),
@NamedQuery(name = "ApplicationPermissionEntity.findByPermissionDescription", query = "SELECT a FROM ApplicationPermissionEntity a WHERE a.permissionDescription = :permissionDescription")}) @NamedQuery(name = "ApplicationPermissionEntity.findByPermissionDescription", query = "SELECT a FROM ApplicationPermissionEntity a WHERE a.application=:application AND a.permissionDescription = :permissionDescription")})
public class ApplicationPermissionEntity implements Serializable { public class ApplicationPermissionEntity implements Serializable {
private static final long serialVersionUID = -8985982754544829534L; private static final long serialVersionUID = -8985982754544829534L;
@ -53,8 +56,11 @@ public class ApplicationPermissionEntity implements Serializable {
@Size(min = 1, max = 200) @Size(min = 1, max = 200)
@Column(name = "permission_description") @Column(name = "permission_description")
private String permissionDescription; private String permissionDescription;
@JoinColumn(name = "application", referencedColumnName = "id")
@ManyToOne(optional = false)
private ApplicationEntity application;
@ManyToMany(mappedBy = "applicationPermissionList") @ManyToMany(mappedBy = "applicationPermissionList")
private List<ApplicationRoleEntity> applicationRoleList; private List<ApplicationRoleEntity> applicationRoles;
public ApplicationPermissionEntity() { public ApplicationPermissionEntity() {
} }
@ -69,8 +75,16 @@ public class ApplicationPermissionEntity implements Serializable {
this.permissionDescription = permissionDescription; this.permissionDescription = permissionDescription;
} }
public ApplicationPermissionEntity(UUID id, String permissionName, String permissionDescription) { public ApplicationPermissionEntity(ApplicationEntity application, String permissionName, String permissionDescription) {
this.id = null;
this.application = application;
this.permissionName = permissionName;
this.permissionDescription = permissionDescription;
}
public ApplicationPermissionEntity(UUID id, ApplicationEntity application, String permissionName, String permissionDescription) {
this.id = id; this.id = id;
this.application = application;
this.permissionName = permissionName; this.permissionName = permissionName;
this.permissionDescription = permissionDescription; this.permissionDescription = permissionDescription;
} }
@ -100,12 +114,12 @@ public class ApplicationPermissionEntity implements Serializable {
} }
@XmlTransient @XmlTransient
public List<ApplicationRoleEntity> getApplicationRoleList() { public List<ApplicationRoleEntity> getApplicationRoles() {
return applicationRoleList; return applicationRoles;
} }
public void setApplicationRoleList(List<ApplicationRoleEntity> applicationRoleList) { public void setApplicationRoles(List<ApplicationRoleEntity> applicationRoles) {
this.applicationRoleList = applicationRoleList; this.applicationRoles = applicationRoles;
} }
@Override @Override
@ -133,4 +147,12 @@ public class ApplicationPermissionEntity implements Serializable {
return "de.muehlencord.shared.account.entity.ApplicationPermission[ id=" + id + " ]"; return "de.muehlencord.shared.account.entity.ApplicationPermission[ id=" + id + " ]";
} }
public ApplicationEntity getApplication() {
return application;
}
public void setApplication(ApplicationEntity application) {
this.application = application;
}
} }

View File

@ -70,4 +70,13 @@ public class ApplicationService implements Serializable {
} }
} }
@Transactional
public void delete(ApplicationEntity app) {
ApplicationEntity attachedApp = em.find(ApplicationEntity.class, app.getId());
em.remove(attachedApp);
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Application {} deleted", app.getApplicationName());
}
}
} }

View File

@ -1,5 +1,6 @@
package de.muehlencord.shared.account.business.application.entity; package de.muehlencord.shared.account.business.application.entity;
import de.muehlencord.shared.account.business.account.entity.ApplicationPermissionEntity;
import de.muehlencord.shared.account.business.account.entity.ApplicationRoleEntity; import de.muehlencord.shared.account.business.account.entity.ApplicationRoleEntity;
import java.io.Serializable; import java.io.Serializable;
import java.util.List; import java.util.List;
@ -50,6 +51,8 @@ public class ApplicationEntity implements Serializable {
private String applicationName; private String applicationName;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "application") @OneToMany(cascade = CascadeType.ALL, mappedBy = "application")
private List<ApplicationRoleEntity> applicationRoleEntityList; private List<ApplicationRoleEntity> applicationRoleEntityList;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "application")
private List<ApplicationPermissionEntity> applicationPermissions;
public ApplicationEntity() { public ApplicationEntity() {
} }
@ -104,4 +107,13 @@ public class ApplicationEntity implements Serializable {
return "de.muehlencord.shared.account.business.application.entity.ApplicationEntity[ id=" + id + " ]"; return "de.muehlencord.shared.account.business.application.entity.ApplicationEntity[ id=" + id + " ]";
} }
@XmlTransient
public List<ApplicationPermissionEntity> getApplicationPermissions() {
return applicationPermissions;
}
public void setApplicationPermissions(List<ApplicationPermissionEntity> applicationPermissions) {
this.applicationPermissions = applicationPermissions;
}
} }