Skip to content
Snippets Groups Projects
Commit d4d13703 authored by Barbara B. Frosik's avatar Barbara B. Frosik
Browse files

No commit message

No commit message
parent 71d45c26
No related branches found
No related tags found
No related merge requests found
Showing
with 251 additions and 42 deletions
......@@ -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;
}
......
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;
......
......@@ -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;
}
}
......@@ -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;
}
}
......@@ -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
{
......
......@@ -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
{
......
......@@ -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>
......
......@@ -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"/>
......
......@@ -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>
......
<?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>
......@@ -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>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment