From d4d1370330d17c30b5083b5014d40909a72f1096 Mon Sep 17 00:00:00 2001 From: "Barbara B. Frosik" <bfrosik@aps.anl.gov> Date: Wed, 4 Feb 2015 19:21:49 +0000 Subject: [PATCH] --- .../controllers/ExperimentController.java | 7 +- .../controllers/UserInfoController.java | 163 +++++++++++++++++- .../dm/portal/model/beans/RoleTypeFacade.java | 10 -- .../dm/portal/model/beans/UserInfoFacade.java | 11 ++ .../dm/portal/model/entities/RoleType.java | 3 +- .../dm/portal/model/entities/UserInfo.java | 3 +- .../web/views/experiment/view.xhtml | 2 +- .../web/views/experimentType/view.xhtml | 4 +- .../DmWebPortal/web/views/roleType/view.xhtml | 10 +- .../userExperimentsListDataTable.xhtml | 49 ++++++ .../DmWebPortal/web/views/userInfo/view.xhtml | 31 ++-- 11 files changed, 251 insertions(+), 42 deletions(-) create mode 100644 src/java/DmWebPortal/web/views/userInfo/userExperimentsListDataTable.xhtml diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/ExperimentController.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/ExperimentController.java index d8861e22..881eb054 100644 --- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/ExperimentController.java +++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/ExperimentController.java @@ -18,6 +18,7 @@ import gov.anl.aps.dm.portal.model.entities.UserInfo; import gov.anl.aps.dm.portal.utilities.DoubleKeyMap; import gov.anl.aps.dm.portal.utilities.SessionUtility; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -59,7 +60,7 @@ public class ExperimentController extends CrudEntityController<Experiment, Exper private final boolean[] userRoles; public ExperimentUser(int experimentId, int userId) { - userRoles = new boolean[maxExperimentRoleTypeId]; + userRoles = new boolean[maxExperimentRoleTypeId + 1]; this.experimentId = experimentId; this.userId = userId; } @@ -155,7 +156,8 @@ public class ExperimentController extends CrudEntityController<Experiment, Exper initializeRoleTypes(); } logger.debug("converting ExperimentUser "); - List<RoleType> roleTypes = roleTypeFacade.findByRoleSystemType(false); + Collection<RoleType> roleTypes; + roleTypes = experimentRoles.values(); ExperimentUser experimentUser; for (UserInfo user : list) { if ((experimentUser = experimentUsers.getByFirstKey(user)) == null) { @@ -265,7 +267,6 @@ public class ExperimentController extends CrudEntityController<Experiment, Exper } } } - maxExperimentRoleTypeId++; initialized = true; } diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/UserInfoController.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/UserInfoController.java index 809ae1f4..c1a4c8f5 100644 --- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/UserInfoController.java +++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/UserInfoController.java @@ -1,13 +1,22 @@ package gov.anl.aps.dm.portal.controllers; +import gov.anl.aps.dm.portal.constants.RoleTypeName; import gov.anl.aps.dm.portal.exceptions.DmPortalException; import gov.anl.aps.dm.portal.exceptions.MissingProperty; import gov.anl.aps.dm.portal.exceptions.ObjectAlreadyExists; +import gov.anl.aps.dm.portal.model.beans.RoleTypeFacade; import gov.anl.aps.dm.portal.model.entities.UserInfo; import gov.anl.aps.dm.portal.model.beans.UserInfoFacade; +import gov.anl.aps.dm.portal.model.entities.CloneableEntity; +import gov.anl.aps.dm.portal.model.entities.Experiment; +import gov.anl.aps.dm.portal.model.entities.RoleType; import gov.anl.aps.dm.portal.utilities.SessionUtility; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; import java.util.List; +import java.util.Map; import javax.ejb.EJB; import javax.enterprise.context.SessionScoped; import javax.faces.component.UIComponent; @@ -19,19 +28,161 @@ import org.apache.log4j.Logger; @Named("userInfoController") @SessionScoped -public class UserInfoController extends CrudEntityController<UserInfo, UserInfoFacade> -{ +public class UserInfoController extends CrudEntityController<UserInfo, UserInfoFacade> { private static final Logger logger = Logger.getLogger(UserInfoController.class.getName()); @EJB private UserInfoFacade userInfoFacade; + @EJB + private RoleTypeFacade roleTypeFacade; + private String passwordEntry = null; - + + public class ExperimentUser extends CloneableEntity { + + String experimentName; + String description; + int userId; + int experimentId; + private final boolean[] userRoles; + + public ExperimentUser(int experimentId, int userId) { + userRoles = new boolean[maxExperimentRoleTypeId + 1]; + this.experimentId = experimentId; + this.userId = userId; + } + + void setExperimentName(String experimentName) { + this.experimentName = experimentName; + } + + void setDescription(String description) { + this.description = description; + } + + public String getExperimentName() { + return experimentName; + } + + public String getDescription() { + return description; + } + + public boolean isIsManager() { + return userRoles[experimentRoles.get(RoleTypeName.MANAGER).getId()]; + } + + public boolean isIsPI() { + return userRoles[experimentRoles.get(RoleTypeName.PI).getId()]; + } + + public boolean isIsUser() { + return userRoles[experimentRoles.get(RoleTypeName.USER).getId()]; + } + + public void setIsInRole(RoleType role, boolean isInRole) { + userRoles[role.getId()] = isInRole; + } + + public boolean[] getRoles() { + return userRoles; + } + + @Override + public int hashCode() { + return userId + experimentId * 100; + } + + @Override + public boolean equals(Object object) { + // TODO: Warning - this method won't work in the case the id fields are not set + if (!(object instanceof ExperimentUser)) { + return false; + } + return ((userId == ((ExperimentUser) object).userId) && (experimentId == ((ExperimentUser) object).experimentId)); + } + } + + class UserExperimentsTable extends DataTableController<ExperimentUser> { + + @Override + public String getClassName() { + return "UserExperiments"; + } + + @Override + public List<ExperimentUser> findAll() { + List<Experiment> list = userInfoFacade.findExperimentsInUser(getCurrent().getId()); + return convertUserExperiments(list); + } + + List<ExperimentUser> convertUserExperiments(List<Experiment> list) { + if (!initialized) { + initializeRoleTypes(); + } + logger.debug("converting UserExperiments "); + Collection<RoleType> roleTypes; + roleTypes = experimentRoles.values(); + ExperimentUser experimentUser; + for (Experiment experiment : list) { + if ((experimentUser = userExperiments.get(experiment.getId())) == null) { + experimentUser = new ExperimentUser(experiment.getId(), getCurrent().getId()); + experimentUser.setExperimentName(experiment.getName()); + experimentUser.setDescription(experiment.getDescription()); + userExperiments.put(experiment.getId(), experimentUser); + } + for (RoleType roleType : roleTypes) { + boolean inRole = getCurrent().inRole(roleType.getId(), experiment.getId()); + experimentUser.setIsInRole(roleType, inRole); + } + } + return new ArrayList<>(userExperiments.values()); + } + + @Override + public String getTableName() { + return "UserExperimentsTable"; + } + } + + private UserInfoController.UserExperimentsTable userExperimentsListTable = new UserInfoController.UserExperimentsTable(); + + private final Map<Integer, ExperimentUser> userExperiments = new HashMap<>(); + private final Map<String, RoleType> experimentRoles = new HashMap<>(); + int maxExperimentRoleTypeId; + boolean initialized = false; + public UserInfoController() { } + private void initializeRoleTypes() { + List<RoleType> roleTypesList = roleTypeFacade.findAll(); + for (RoleType roleType : roleTypesList) { + if (!roleType.isIsSystemRole()) { + experimentRoles.put(roleType.getName(), roleType); + if (roleType.getId() > maxExperimentRoleTypeId) { + maxExperimentRoleTypeId = roleType.getId(); + } + } + } + initialized = true; + } + + public void clear() { + userExperimentsListTable.resetList(); + userExperimentsListTable.resetFilterList(); + } + + public UserExperimentsTable getUserExperimentsListTable() { + return userExperimentsListTable; + } + + public void setUserExperimentsListTable(UserExperimentsTable userExperimentsListTable) { + this.userExperimentsListTable = userExperimentsListTable; + } + @Override protected UserInfoFacade getFacade() { return userInfoFacade; @@ -75,6 +226,12 @@ public class UserInfoController extends CrudEntityController<UserInfo, UserInfoF } logger.debug("Inserting new user " + user.getUsername()); } + + @Override + public String update() { + clear(); + return super.update(); + } private void verifyMandatoryParam(UserInfo user) throws MissingProperty { int missing = 0; diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/RoleTypeFacade.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/RoleTypeFacade.java index f51b1bf6..1ccb9885 100644 --- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/RoleTypeFacade.java +++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/RoleTypeFacade.java @@ -56,14 +56,4 @@ public class RoleTypeFacade extends AbstractFacade<RoleType> return findByName(name) != null; } - public List<RoleType> findByRoleSystemType(boolean systemType) { - try { - return (List<RoleType>) em.createNamedQuery("RoleType.findByRoleSystemType") - .setParameter("systemType", systemType) - .getResultList(); - } catch (NoResultException ex) { - } - return null; - } - } diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/UserInfoFacade.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/UserInfoFacade.java index 91f0a1f4..57ec1bcb 100644 --- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/UserInfoFacade.java +++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/UserInfoFacade.java @@ -5,6 +5,7 @@ */ package gov.anl.aps.dm.portal.model.beans; +import gov.anl.aps.dm.portal.model.entities.Experiment; import gov.anl.aps.dm.portal.model.entities.UserInfo; import java.util.List; import javax.ejb.Stateless; @@ -89,4 +90,14 @@ public class UserInfoFacade extends AbstractFacade<UserInfo> return null; } + public List<Experiment> findExperimentsInUser(int userId) { + try { + return (List<Experiment>) em.createNamedQuery("UserInfo.findExperimentsInUser") + .setParameter("userId", userId) + .getResultList(); + } catch (NoResultException ex) { + } + return null; + } + } diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/RoleType.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/RoleType.java index 37ff5fdd..c0fed6b2 100644 --- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/RoleType.java +++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/RoleType.java @@ -38,8 +38,7 @@ import javax.xml.bind.annotation.XmlTransient; @NamedQuery(name = "RoleType.findAll", query = "SELECT r FROM RoleType r"), @NamedQuery(name = "RoleType.findById", query = "SELECT r FROM RoleType r WHERE r.id = :id"), @NamedQuery(name = "RoleType.findByName", query = "SELECT r FROM RoleType r WHERE r.name = :name"), - @NamedQuery(name = "RoleType.findByDescription", query = "SELECT r FROM RoleType r WHERE r.description = :description"), - @NamedQuery(name = "RoleType.findByRoleSystemType", query = "SELECT r FROM RoleType r WHERE r.isSystemRole = :systemType")}) + @NamedQuery(name = "RoleType.findByDescription", query = "SELECT r FROM RoleType r WHERE r.description = :description")}) public class RoleType extends CloneableEntity { diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserInfo.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserInfo.java index 5f315316..8c7ea57e 100644 --- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserInfo.java +++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserInfo.java @@ -44,7 +44,8 @@ import javax.xml.bind.annotation.XmlTransient; @NamedQuery(name = "UserInfo.findNonAdmins", query = "SELECT u FROM UserInfo u WHERE u.id NOT IN (SELECT u2.id from UserInfo u2 JOIN u2.roleTypeList rt WHERE rt.id = :roleTypeId)"), @NamedQuery(name = "UserInfo.findUsersInRole", query = "SELECT u FROM UserInfo u WHERE u.id IN (SELECT u2.id from UserInfo u2 JOIN u2.roleTypeList rt WHERE rt.id = :roleTypeId)"), @NamedQuery(name = "UserInfo.findUsersInExperiment", query = "SELECT DISTINCT u FROM UserInfo u WHERE u.id IN (SELECT u2.id from UserInfo u2 JOIN u2.userExperimentRoleList r WHERE r.experiment.id = :experimentId)"), - @NamedQuery(name = "UserInfo.findNoUsersInExperiment", query = "SELECT u FROM UserInfo u WHERE u.id NOT IN (SELECT u2.id from UserInfo u2 JOIN u2.userExperimentRoleList r WHERE r.experiment.id = :experimentId)")}) + @NamedQuery(name = "UserInfo.findNoUsersInExperiment", query = "SELECT u FROM UserInfo u WHERE u.id NOT IN (SELECT u2.id from UserInfo u2 JOIN u2.userExperimentRoleList r WHERE r.experiment.id = :experimentId)"), + @NamedQuery(name = "UserInfo.findExperimentsInUser", query = "SELECT DISTINCT e FROM Experiment e WHERE e.id IN (SELECT e2.id from Experiment e2 JOIN e2.userExperimentRoleList r WHERE r.userInfo.id = :userId)")}) public class UserInfo extends CloneableEntity { diff --git a/src/java/DmWebPortal/web/views/experiment/view.xhtml b/src/java/DmWebPortal/web/views/experiment/view.xhtml index 43b5d3b6..e8582377 100644 --- a/src/java/DmWebPortal/web/views/experiment/view.xhtml +++ b/src/java/DmWebPortal/web/views/experiment/view.xhtml @@ -30,7 +30,7 @@ <p/> <div class="actionButton"> - <p:commandButton action="#{experimentController.prepareEdit(experimentObject)}" rendered="#{loginController.loggedIn}" value="Edit" alt="Edit" icon="ui-icon-pencil"/> + <p:commandButton action="#{experimentController.prepareEdit(experimentObject)}" rendered="#{loginController.admin or experimentController.canEditExperiment(loginController.userId, experimentObject.id)}" value="Edit" alt="Edit" icon="ui-icon-pencil"/> <p:commandButton action="#{experimentController.prepareList()}" value="Return" alt="Return" icon="ui-icon-arrowreturnthick-1-w"/> </div> diff --git a/src/java/DmWebPortal/web/views/experimentType/view.xhtml b/src/java/DmWebPortal/web/views/experimentType/view.xhtml index 97c2745f..afe75501 100644 --- a/src/java/DmWebPortal/web/views/experimentType/view.xhtml +++ b/src/java/DmWebPortal/web/views/experimentType/view.xhtml @@ -21,8 +21,8 @@ <p/> <ui:param name="experimentTypeObject" value="#{experimentTypeController.selected}"/> <div class="actionButton"> - <p:commandButton action="#{experimentTypeController.prepareEdit(experimentTypeObject)}" rendered="#{loginController.loggedIn}" value="Edit" alt="Edit" icon="ui-icon-pencil"/> - <p:commandButton onclick="PF('experimentTypeDestroyDialogWidget').show();" rendered="#{loginController.loggedIn}" value="Delete" alt="Delete" icon="ui-icon-trash"> + <p:commandButton action="#{experimentTypeController.prepareEdit(experimentTypeObject)}" rendered="#{loginController.admin}" value="Edit" alt="Edit" icon="ui-icon-pencil"/> + <p:commandButton onclick="PF('experimentTypeDestroyDialogWidget').show();" rendered="#{loginController.admin}" value="Delete" alt="Delete" icon="ui-icon-trash"> <f:setPropertyActionListener value="#{experimentTypeObject}" target="#{experimentTypeController.current}"/> </p:commandButton> <p:commandButton action="#{experimentTypeController.prepareList()}" value="Return" alt="Return" icon="ui-icon-arrowreturnthick-1-w"/> diff --git a/src/java/DmWebPortal/web/views/roleType/view.xhtml b/src/java/DmWebPortal/web/views/roleType/view.xhtml index 417c6ea1..e3b1491e 100644 --- a/src/java/DmWebPortal/web/views/roleType/view.xhtml +++ b/src/java/DmWebPortal/web/views/roleType/view.xhtml @@ -22,15 +22,9 @@ <ui:param name="roleTypeObject" value="#{roleTypeController.selected}"/> <ui:param name="isEntityWriteable" value="#{loginController.loggedIn}"/> <div class="actionButton"> - <p:commandButton action="#{roleTypeController.prepareEdit(roleTypeObject)}" rendered="#{isEntityWriteable}" value="Edit" alt="Edit" icon="ui-icon-pencil"/> - <p:commandButton onclick="PF('roleTypeDestroyDialogWidget').show();" rendered="#{loginController.loggedIn}" value="Delete" alt="Delete" icon="ui-icon-trash"> - <f:setPropertyActionListener value="#{roleTypeObject}" target="#{roleTypeController.current}"/> - </p:commandButton> + <p:commandButton action="#{roleTypeController.prepareEdit(roleTypeObject)}" rendered="#{loginController.admin}" value="Edit" alt="Edit" icon="ui-icon-pencil"/> <p:commandButton action="#{roleTypeController.prepareList()}" value="Return" alt="Return" icon="ui-icon-arrowreturnthick-1-w"/> - </div> - - <ui:include src="roleTypeDestroyDialog.xhtml"/> - + </div> </div> </h:form> diff --git a/src/java/DmWebPortal/web/views/userInfo/userExperimentsListDataTable.xhtml b/src/java/DmWebPortal/web/views/userInfo/userExperimentsListDataTable.xhtml new file mode 100644 index 00000000..2df53a70 --- /dev/null +++ b/src/java/DmWebPortal/web/views/userInfo/userExperimentsListDataTable.xhtml @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<ui:composition xmlns="http://www.w3.org/1999/xhtml" + xmlns:h="http://java.sun.com/jsf/html" + xmlns:p="http://primefaces.org/ui" + xmlns:ui="http://xmlns.jcp.org/jsf/facelets"> + + <p:commandButton id="ResetFiltersButton" action="#{userInfoController.userExperimentsListTable.resetList()}" alt="Clear Filters" icon="ui-icon-refresh" styleClass="actionButtonRight" oncomplete="PF('userExperimentsListWidget').clearFilters()" update="userExperimentsListDataTable"> + <p:tooltip for="ResetFiltersButton" value="Reset filters."/> + </p:commandButton> + + <p:dataTable id="userExperimentsListDataTable" + var="userExperimentObject" + value="#{userInfoController.userExperimentsListTable.listDataModel}" + filteredValue="#{userInfoController.userExperimentsListTable.filteredObjectList}" + paginator="true" + paginatorAlwaysVisible="false" + rows="25" + binding="#{userInfoController.userExperimentsListTable.listDataTable}" + widgetVar="userExperimentsListWidget" + emptyMessage="No users found."> + + <p:column sortBy="#{userExperimentObject.experimentName}" headerText="Experiment Name" + filterBy="#{userExperimentObject.experimentName}" filterMatchMode="contains" > + <h:outputText value="#{userExperimentObject.experimentName}"/> + </p:column> + + <p:column sortBy="#{userExperimentObject.description}" headerText="Description" + filterBy="#{userExperimentObject.description}" filterMatchMode="contains" > + <h:outputText value="#{userExperimentObject.description}"/> + </p:column> + + + <p:column headerText="Manager"> + <h:outputText value="" styleClass="ui-icon ui-icon-check" rendered="#{userExperimentObject.isManager}" /> + </p:column> + + <p:column headerText="Principal Investigator"> + <h:outputText value="" styleClass="ui-icon ui-icon-check" rendered="#{userExperimentObject.isPI}" /> + </p:column> + + <p:column headerText="User"> + <h:outputText value="" styleClass="ui-icon ui-icon-check" rendered="#{userExperimentObject.isUser}" /> + </p:column> + + + </p:dataTable> + +</ui:composition> diff --git a/src/java/DmWebPortal/web/views/userInfo/view.xhtml b/src/java/DmWebPortal/web/views/userInfo/view.xhtml index aefe56d1..50f39a1e 100644 --- a/src/java/DmWebPortal/web/views/userInfo/view.xhtml +++ b/src/java/DmWebPortal/web/views/userInfo/view.xhtml @@ -10,19 +10,28 @@ <ui:define name="middleCenter"> <h:form id="viewUserInfoForm"> + <div class="pageTitle"> + <h1>User Details</h1> + </div> - <div class="middleCenterLeftContent"> - <div class="pageTitle"> - <h1>User Details</h1> - </div> + <ui:param name="userInfoObject" value="#{userInfoController.current}"/> + <p:accordionPanel multiple="true" activeIndex="0,1" > + <p:tab title="User Properties"> + <div class="middleCenterLeftContent"> + <ui:include src="userInfoViewPanelGrid.xhtml"/> + </div> + </p:tab> - <ui:include src="userInfoViewPanelGrid.xhtml"/> + <p:tab title="User Experiments"> + <ui:include src="userExperimentsListDataTable.xhtml"/> + </p:tab> + </p:accordionPanel> + + <p/> - <p/> - <ui:param name="userInfoObject" value="#{userInfoController.selected}"/> <div class="actionButton"> - <p:commandButton action="#{userInfoController.prepareEdit(userInfoObject)}" rendered="#{loginController.isUserWriteable(userInfoObject)}" value="Edit" alt="Edit" icon="ui-icon-pencil"/> - <p:commandButton onclick="PF('userInfoDestroyDialogWidget').show();" rendered="#{loginController.loggedIn}" value="Delete" alt="Delete" icon="ui-icon-trash"> + <p:commandButton action="#{userInfoController.prepareEdit(userInfoObject)}" rendered="#{loginController.admin}" value="Edit" alt="Edit" icon="ui-icon-pencil"/> + <p:commandButton onclick="PF('userInfoDestroyDialogWidget').show();" rendered="#{loginController.admin}" value="Delete" alt="Delete" icon="ui-icon-trash"> <f:setPropertyActionListener value="#{userInfoObject}" target="#{userInfoController.current}"/> </p:commandButton> <p:commandButton action="#{userInfoController.prepareList()}" value="Return" alt="Return" icon="ui-icon-arrowreturnthick-1-w"/> @@ -30,12 +39,10 @@ <ui:include src="userInfoDestroyDialog.xhtml"/> - </div> - </h:form> - </ui:define> + </ui:composition> -- GitLab