diff src/main/java/edu/harvard/iq/dataverse/ManagePermissionsPage.java @ 10:a50cf11e5178

Rewrite LGDataverse completely upgrading to dataverse4.0
author Zoe Hong <zhong@mpiwg-berlin.mpg.de>
date Tue, 08 Sep 2015 17:00:21 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/edu/harvard/iq/dataverse/ManagePermissionsPage.java	Tue Sep 08 17:00:21 2015 +0200
@@ -0,0 +1,691 @@
+package edu.harvard.iq.dataverse;
+
+import edu.harvard.iq.dataverse.authorization.AuthenticationServiceBean;
+import edu.harvard.iq.dataverse.authorization.DataverseRole;
+import edu.harvard.iq.dataverse.authorization.Permission;
+import edu.harvard.iq.dataverse.authorization.RoleAssignee;
+import edu.harvard.iq.dataverse.authorization.RoleAssigneeDisplayInfo;
+import edu.harvard.iq.dataverse.authorization.groups.Group;
+import edu.harvard.iq.dataverse.authorization.groups.GroupException;
+import edu.harvard.iq.dataverse.authorization.groups.GroupServiceBean;
+import edu.harvard.iq.dataverse.authorization.groups.impl.builtin.AuthenticatedUsers;
+import edu.harvard.iq.dataverse.authorization.groups.impl.explicit.ExplicitGroup;
+import edu.harvard.iq.dataverse.authorization.groups.impl.explicit.ExplicitGroupServiceBean;
+import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser;
+import edu.harvard.iq.dataverse.engine.command.exception.CommandException;
+import edu.harvard.iq.dataverse.engine.command.exception.PermissionException;
+import edu.harvard.iq.dataverse.engine.command.impl.AssignRoleCommand;
+import edu.harvard.iq.dataverse.engine.command.impl.CreateExplicitGroupCommand;
+import edu.harvard.iq.dataverse.engine.command.impl.CreateRoleCommand;
+import edu.harvard.iq.dataverse.engine.command.impl.RevokeRoleCommand;
+import edu.harvard.iq.dataverse.engine.command.impl.UpdateDataverseDefaultContributorRoleCommand;
+import edu.harvard.iq.dataverse.util.JsfHelper;
+import static edu.harvard.iq.dataverse.util.JsfHelper.JH;
+import edu.harvard.iq.dataverse.util.StringUtil;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.regex.Pattern;
+import javax.ejb.EJB;
+import javax.faces.application.FacesMessage;
+import javax.faces.component.UIComponent;
+import javax.faces.component.UIInput;
+import javax.faces.context.FacesContext;
+import javax.faces.event.ActionEvent;
+import javax.faces.view.ViewScoped;
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import org.apache.commons.lang.StringUtils;
+
+/**
+ *
+ * @author gdurand
+ */
+@ViewScoped
+@Named
+public class ManagePermissionsPage implements java.io.Serializable {
+
+    private static final Logger logger = Logger.getLogger(ManagePermissionsPage.class.getCanonicalName());
+
+    @EJB
+    DvObjectServiceBean dvObjectService;
+    @EJB
+    DataverseRoleServiceBean roleService;
+    @EJB
+    RoleAssigneeServiceBean roleAssigneeService;
+    @EJB
+    PermissionServiceBean permissionService;
+    @EJB
+    AuthenticationServiceBean authenticationService;
+    @EJB 
+    GroupServiceBean groupService;
+    @EJB
+    EjbDataverseEngine commandEngine;
+    
+
+    @PersistenceContext(unitName = "VDCNet-ejbPU")
+    EntityManager em;
+
+    @Inject
+    DataverseSession session;
+
+    DvObject dvObject = new Dataverse(); // by default we use a Dataverse, but this will be overridden in init by the findById
+
+    public DvObject getDvObject() {
+        return dvObject;
+    }
+
+    public void setDvObject(DvObject dvObject) {
+        this.dvObject = dvObject;
+        /*if (dvObject instanceof DvObjectContainer) {
+         inheritAssignments = !((DvObjectContainer) dvObject).isPermissionRoot();
+         }*/
+    }
+
+    public String init() {
+        //@todo deal with any kind of dvObject
+        if (dvObject.getId() != null) {
+            dvObject = dvObjectService.findDvObject(dvObject.getId());
+        }
+
+        // check if dvObject exists and user has permission
+        if (dvObject == null) {
+            return "/404.xhtml";
+        }
+
+        // for dataFiles, check the perms on its owning dataset
+        DvObject checkPermissionsdvObject = dvObject instanceof DataFile ? dvObject.getOwner() : dvObject;
+        if (!permissionService.on(checkPermissionsdvObject).has(checkPermissionsdvObject instanceof Dataverse ? Permission.ManageDataversePermissions : Permission.ManageDatasetPermissions)) {
+            return "/loginpage.xhtml" + DataverseHeaderFragment.getRedirectPage();
+        }
+
+        // initialize the configure settings
+        if (dvObject instanceof Dataverse) {
+            initAccessSettings();
+        }
+        return "";
+    }
+
+    /* 
+     main page - role assignment table
+     */
+    
+    // used by remove Role Assignment
+    private RoleAssignment selectedRoleAssignment;
+
+    public RoleAssignment getSelectedRoleAssignment() {
+        return selectedRoleAssignment;
+    }
+
+    public void setSelectedRoleAssignment(RoleAssignment selectedRoleAssignment) {
+        this.selectedRoleAssignment = selectedRoleAssignment;
+    }    
+  
+    public List<RoleAssignmentRow> getRoleAssignments() {
+        List<RoleAssignmentRow> raList = null;
+        if (dvObject != null && dvObject.getId() != null) {
+            Set<RoleAssignment> ras = roleService.rolesAssignments(dvObject);
+            raList = new ArrayList<>(ras.size());
+            for (RoleAssignment roleAssignment : ras) {
+                // for files, only show role assignments which can download
+                if (!(dvObject instanceof DataFile) || roleAssignment.getRole().permissions().contains(Permission.DownloadFile)) {
+                    RoleAssignee roleAssignee = roleAssigneeService.getRoleAssignee(roleAssignment.getAssigneeIdentifier());
+                    if (roleAssignee != null) {
+                        raList.add(new RoleAssignmentRow(roleAssignment, roleAssignee.getDisplayInfo()));
+                    } else {
+                        logger.info("Could not find role assignee based on role assignment id " + roleAssignment.getId());
+                    }
+                }
+            }
+        }
+        return raList;
+    }
+      
+    public void removeRoleAssignment() {
+        revokeRole(selectedRoleAssignment);
+
+        if (dvObject instanceof Dataverse) {
+            initAccessSettings(); // in case the revoke was for the AuthenticatedUsers group
+        }        
+
+        showAssignmentMessages();        
+    }
+    
+    // internal method used by removeRoleAssignment and saveConfiguration
+    private void revokeRole(RoleAssignment ra) {
+        try {
+            commandEngine.submit(new RevokeRoleCommand(ra, session.getUser()));
+            JsfHelper.addSuccessMessage(ra.getRole().getName() + " role for " + roleAssigneeService.getRoleAssignee(ra.getAssigneeIdentifier()).getDisplayInfo().getTitle() + " was removed.");
+        } catch (PermissionException ex) {
+            JH.addMessage(FacesMessage.SEVERITY_ERROR, "The role assignment was not able to be removed.", "Permissions " + ex.getRequiredPermissions().toString() + " missing.");
+        } catch (CommandException ex) {
+            JH.addMessage(FacesMessage.SEVERITY_FATAL, "The role assignment could not be removed.");
+            logger.log(Level.SEVERE, "Error removing role assignment: " + ex.getMessage(), ex);
+        }
+    }
+    
+    /* 
+     main page - roles table
+     */    
+
+    public List<DataverseRole> getRoles() {
+        if (dvObject != null && dvObject.getId() != null) {
+            return roleService.findByOwnerId(dvObject.getId());
+        }
+        return new ArrayList();
+    }
+
+    public void createNewRole(ActionEvent e) {
+        setRole(new DataverseRole());
+        role.setOwner(dvObject);
+    }
+
+    public void cloneRole(String roleId) {
+        DataverseRole clonedRole = new DataverseRole();
+        clonedRole.setOwner(dvObject);
+
+        DataverseRole originalRole = roleService.find(Long.parseLong(roleId));
+        clonedRole.addPermissions(originalRole.permissions());
+        setRole(clonedRole);
+    }
+
+    public void editRole(String roleId) {
+        setRole(roleService.find(Long.parseLong(roleId)));
+    }
+    
+    /*
+    ============================================================================
+     edit configuration dialog // only for dataverse version of page
+    ============================================================================
+     */
+    
+    private String authenticatedUsersContributorRoleAlias = null;
+    private String defaultContributorRoleAlias = DataverseRole.EDITOR;
+
+    public String getAuthenticatedUsersContributorRoleAlias() {
+        return authenticatedUsersContributorRoleAlias;
+    }
+
+    public void setAuthenticatedUsersContributorRoleAlias(String authenticatedUsersContributorRoleAlias) {
+        this.authenticatedUsersContributorRoleAlias = authenticatedUsersContributorRoleAlias;
+    }
+
+    public String getDefaultContributorRoleAlias() {
+        return defaultContributorRoleAlias;
+    }
+
+    public void setDefaultContributorRoleAlias(String defaultContributorRoleAlias) {
+        this.defaultContributorRoleAlias = defaultContributorRoleAlias;
+    }    
+    
+   public void initAccessSettings() {
+       if (dvObject instanceof Dataverse) {
+            authenticatedUsersContributorRoleAlias = "";
+
+            List<RoleAssignment> aUsersRoleAssignments = roleService.directRoleAssignments(AuthenticatedUsers.get(), dvObject);
+            for (RoleAssignment roleAssignment : aUsersRoleAssignments) {
+                String roleAlias = roleAssignment.getRole().getAlias();
+                authenticatedUsersContributorRoleAlias = roleAlias;
+                break;
+                // @todo handle case where more than one role has been assigned to the AutenticatedUsers group!
+            }
+
+            defaultContributorRoleAlias = ((Dataverse) dvObject).getDefaultContributorRole().getAlias();   
+       }
+    }
+   
+    
+   public void saveConfiguration(ActionEvent e) {
+        // Set role (if any) for authenticatedUsers
+        DataverseRole roleToAssign = null;
+        List<String> contributorRoles = Arrays.asList(DataverseRole.FULL_CONTRIBUTOR, DataverseRole.DV_CONTRIBUTOR, DataverseRole.DS_CONTRIBUTOR);
+
+        if (!StringUtil.isEmpty(authenticatedUsersContributorRoleAlias)) {
+            roleToAssign = roleService.findBuiltinRoleByAlias(authenticatedUsersContributorRoleAlias);
+        }
+
+        // then, check current contributor role
+        List<RoleAssignment> aUsersRoleAssignments = roleService.directRoleAssignments(AuthenticatedUsers.get(), dvObject);
+        for (RoleAssignment roleAssignment : aUsersRoleAssignments) {
+            DataverseRole currentRole = roleAssignment.getRole();
+            if (contributorRoles.contains(currentRole.getAlias())) {
+                if (currentRole.equals(roleToAssign)) {
+                    roleToAssign = null; // found the role, so no need to assign
+                } else {
+                    revokeRole(roleAssignment);
+                }
+            }
+        }
+        // finally, assign role, if new
+        if (roleToAssign != null) {
+            assignRole(AuthenticatedUsers.get(), roleToAssign);
+        }
+
+        // set dataverse default contributor role
+        if (dvObject instanceof Dataverse) {
+            Dataverse dv = (Dataverse) dvObject;
+            DataverseRole defaultRole = roleService.findBuiltinRoleByAlias(defaultContributorRoleAlias);
+            if (!defaultRole.equals(dv.getDefaultContributorRole())) {
+                try {
+                    commandEngine.submit(new UpdateDataverseDefaultContributorRoleCommand(defaultRole, session.getUser(), dv));
+                    JsfHelper.addSuccessMessage("The default permissions for this dataverse have been updated.");
+                } catch (PermissionException ex) {
+                    JH.addMessage(FacesMessage.SEVERITY_ERROR, "Cannot assign default permissions.", "Permissions " + ex.getRequiredPermissions().toString() + " missing.");
+                } catch (CommandException ex) {
+                    JH.addMessage(FacesMessage.SEVERITY_FATAL, "Cannot assign default permissions.");
+                    logger.log(Level.SEVERE, "Error assigning default permissions: " + ex.getMessage(), ex);
+                }
+            }
+        }
+        showConfigureMessages();
+    }    
+
+    /*
+   ============================================================================
+     assign roles dialog
+   ============================================================================
+     */
+    private List<RoleAssignee> roleAssignSelectedRoleAssignees;
+    private Long selectedRoleId;
+
+    public List<RoleAssignee> getRoleAssignSelectedRoleAssignees() {
+        return roleAssignSelectedRoleAssignees;
+    }
+
+    public void setRoleAssignSelectedRoleAssignees(List<RoleAssignee> selectedRoleAssignees) {
+        this.roleAssignSelectedRoleAssignees = selectedRoleAssignees;
+    }
+
+    public Long getSelectedRoleId() {
+        return selectedRoleId;
+    }
+
+    public void setSelectedRoleId(Long selectedRoleId) {
+        this.selectedRoleId = selectedRoleId;
+    }
+
+    public void initAssigneeDialog(ActionEvent ae) {
+        roleAssignSelectedRoleAssignees = new LinkedList<>();
+        selectedRoleId = null;
+        showNoMessages();
+    }
+    
+    public List<RoleAssignee> completeRoleAssignee( String query ) {
+        List<RoleAssignee> roleAssigneeList = new ArrayList<>();
+        // TODO push this to the authentication and group services. Below code retrieves all the users.
+        for (AuthenticatedUser au : authenticationService.findAllAuthenticatedUsers()) {
+            roleAssigneeList.add(au);
+        }
+        for ( Group g : groupService.findGlobalGroups() ) {
+            roleAssigneeList.add( g );
+        }
+        roleAssigneeList.addAll( explicitGroupSvc.findAvailableFor(dvObject) );
+        
+        List<RoleAssignee> filteredList = new LinkedList();
+        for (RoleAssignee ra : roleAssigneeList) {
+            // @todo unsure if containsIgnore case will work for all locales
+            // @todo maybe add some solr/lucene style searching, did-you-mean style?
+            if (StringUtils.containsIgnoreCase(ra.getDisplayInfo().getTitle(), query) && 
+                    (roleAssignSelectedRoleAssignees == null || !roleAssignSelectedRoleAssignees.contains(ra))) {
+                filteredList.add(ra);
+            }
+        }
+        return filteredList;
+    }
+
+    public List<DataverseRole> getAvailableRoles() {
+        List<DataverseRole> roles = new LinkedList<>();
+        if (dvObject != null && dvObject.getId() != null) {
+
+            if (dvObject instanceof Dataverse) {
+                roles.addAll(roleService.availableRoles(dvObject.getId()));
+                
+            } else if (dvObject instanceof Dataset) {
+                // don't show roles that only have Dataverse level permissions
+                // current the available roles for a dataset are gotten from its parent
+                for (DataverseRole role : roleService.availableRoles(dvObject.getOwner().getId())) {
+                    for (Permission permission : role.permissions()) {
+                        if (permission.appliesTo(Dataset.class) || permission.appliesTo(DataFile.class)) {
+                            roles.add(role);
+                            break;
+                        }
+                    }
+                }
+                
+            } else if (dvObject instanceof DataFile) {
+                roles.add(roleService.findBuiltinRoleByAlias(DataverseRole.FILE_DOWNLOADER));
+            }
+            
+            Collections.sort(roles, DataverseRole.CMP_BY_NAME);
+        }
+        return roles;
+    }
+
+    public DataverseRole getAssignedRole() {
+        if (selectedRoleId != null) {
+            return roleService.find(selectedRoleId);
+        }
+        return null;
+    }
+
+    public void assignRole(ActionEvent evt) {        
+        logger.info("Got to assignRole");
+        List<RoleAssignee> selectedRoleAssigneesList = getRoleAssignSelectedRoleAssignees();
+        if ( selectedRoleAssigneesList == null ) {
+            logger.info("** SELECTED role asignees is null");
+            selectedRoleAssigneesList = new LinkedList<>();
+        }
+        for (RoleAssignee roleAssignee : selectedRoleAssigneesList) {
+            assignRole(roleAssignee, roleService.find(selectedRoleId));
+        }
+    }
+
+    private void assignRole(RoleAssignee ra, DataverseRole r) {
+        try {
+            commandEngine.submit(new AssignRoleCommand(ra, r, dvObject, session.getUser()));
+            JsfHelper.addSuccessMessage(r.getName() + " role assigned to " + ra.getDisplayInfo().getTitle() + " for " + dvObject.getDisplayName() + ".");
+        } catch (PermissionException ex) {
+            JH.addMessage(FacesMessage.SEVERITY_ERROR, "The role was not able to be assigned.", "Permissions " + ex.getRequiredPermissions().toString() + " missing.");
+        } catch (CommandException ex) {
+            JH.addMessage(FacesMessage.SEVERITY_FATAL, "The role was not able to be assigned.");
+            logger.log(Level.SEVERE, "Error assiging role: " + ex.getMessage(), ex);
+        }
+        
+        showAssignmentMessages();
+    }
+
+    /*
+    ============================================================================
+     edit role dialog
+    ============================================================================
+    */
+    private DataverseRole role = new DataverseRole();
+    private List<String> selectedPermissions;
+
+    public DataverseRole getRole() {
+        return role;
+    }
+
+    public void setRole(DataverseRole role) {
+        this.role = role;
+        selectedPermissions = new LinkedList<>();
+        if (role != null) {
+            for (Permission p : role.permissions()) {
+                selectedPermissions.add(p.name());
+            }
+        }
+    }
+
+    public List<String> getSelectedPermissions() {
+        return selectedPermissions;
+    }
+
+    public void setSelectedPermissions(List<String> selectedPermissions) {
+        this.selectedPermissions = selectedPermissions;
+    }
+
+    public List<Permission> getPermissions() {
+        return Arrays.asList(Permission.values());
+    }
+
+    public void updateRole(ActionEvent e) {
+        // @todo currently only works for Dataverse since CreateRoleCommand only takes a dataverse
+        // we need to decide if we want roles at the dataset level or not
+        if (dvObject instanceof Dataverse) {
+            role.clearPermissions();
+            for (String pmsnStr : getSelectedPermissions()) {
+                role.addPermission(Permission.valueOf(pmsnStr));
+            }
+            try {
+                String roleState = role.getId() != null ? "updated" : "created";
+                setRole(commandEngine.submit(new CreateRoleCommand(role, session.getUser(), (Dataverse) role.getOwner())));
+                JsfHelper.addSuccessMessage("The role was " + roleState + ". To assign it to a user and/or group, click on the Assign Roles to Users/Groups button in the Users/Groups section of this page.");
+            } catch (PermissionException ex) {
+                JH.addMessage(FacesMessage.SEVERITY_ERROR, "The role was not able to be saved.", "Permissions " + ex.getRequiredPermissions().toString() + " missing.");
+            } catch (CommandException ex) {
+                JH.addMessage(FacesMessage.SEVERITY_FATAL, "The role was not able to be saved.");
+                logger.log(Level.SEVERE, "Error saving role: " + ex.getMessage(), ex);
+            }
+        }
+        showRoleMessages();
+    }
+
+
+    /* 
+    ============================================================================
+    Explicit Group dialogs
+    ============================================================================
+    */
+    
+    String explicitGroupIdentifier = "";
+    String explicitGroupName = "";
+    String newExplicitGroupDescription = "";
+    UIInput explicitGroupIdentifierField;
+    
+    @EJB
+    ExplicitGroupServiceBean explicitGroupSvc;
+    
+    List<RoleAssignee> newExplicitGroupRoleAssignees = new LinkedList<>();
+    
+    public void initExplicitGroupDialog(ActionEvent ae) {
+        showNoMessages();
+        setExplicitGroupName("");
+        setExplicitGroupIdentifier("");
+        setNewExplicitGroupDescription("");
+        setNewExplicitGroupRoleAssignees(new LinkedList<RoleAssignee>());
+        FacesContext context = FacesContext.getCurrentInstance();
+        
+    }
+
+    public void saveExplicitGroup(ActionEvent ae) {
+        
+        ExplicitGroup eg = explicitGroupSvc.getProvider().makeGroup();
+        eg.setDisplayName( getExplicitGroupName() );
+        eg.setGroupAliasInOwner( getExplicitGroupIdentifier() );
+        eg.setDescription( getNewExplicitGroupDescription() );
+        
+        if ( getNewExplicitGroupRoleAssignees()!= null ) {
+            try {
+                for ( RoleAssignee ra : getNewExplicitGroupRoleAssignees() ) {
+                    eg.add( ra );
+                }
+            } catch ( GroupException ge ) {
+                JsfHelper.JH.addMessage(FacesMessage.SEVERITY_ERROR,
+                                        "Group Creation failed.", 
+                                        ge.getMessage());
+                return;
+            }
+        }
+        try {
+            logger.info( "Attempting to create group " + eg.getGroupAliasInOwner() ); // TODO MBS remove
+            eg = commandEngine.submit( new CreateExplicitGroupCommand(session.getUser(), (Dataverse) getDvObject(), eg));
+            JsfHelper.addSuccessMessage("Succesfully created group " + eg.getDisplayName());
+        
+        } catch ( CreateExplicitGroupCommand.GroupAliasExistsException gaee ) {
+            logger.info( "Got me then message " + gaee.getMessage() ); // TODO MBS remove
+            explicitGroupIdentifierField.setValid( false );
+            FacesContext.getCurrentInstance().addMessage(explicitGroupIdentifierField.getClientId(),
+                           new FacesMessage( FacesMessage.SEVERITY_ERROR, gaee.getMessage(), null));
+            
+        } catch (CommandException ex) {
+            logger.log(Level.WARNING, "Group creation failed", ex);
+            JsfHelper.JH.addMessage(FacesMessage.SEVERITY_ERROR,
+                                    "Group Creation failed.", 
+                                    ex.getMessage());
+        } catch (Exception ex) {
+            JH.addMessage(FacesMessage.SEVERITY_FATAL, "The role was not able to be saved.");
+             logger.log(Level.SEVERE, "Error saving role: " + ex.getMessage(), ex);
+        }
+        showAssignmentMessages();
+    }
+
+    public void setExplicitGroupName(String explicitGroupFriendlyName) {
+        this.explicitGroupName = explicitGroupFriendlyName;
+    }
+
+    public String getExplicitGroupName() {
+        return explicitGroupName;
+    }
+
+    public void setExplicitGroupIdentifier(String explicitGroupName) {
+        this.explicitGroupIdentifier = explicitGroupName;
+    }
+
+    public String getExplicitGroupIdentifier() {
+        return explicitGroupIdentifier;
+    }
+
+    public UIInput getExplicitGroupIdentifierField() {
+        return explicitGroupIdentifierField;
+    }
+
+    public void setExplicitGroupIdentifierField(UIInput explicitGroupIdentifierField) {
+        this.explicitGroupIdentifierField = explicitGroupIdentifierField;
+    }
+    
+    public void validateGroupIdentifier(FacesContext context, UIComponent toValidate, Object rawValue) {
+        String value = (String) rawValue;
+        UIInput input = (UIInput) toValidate;
+        input.setValid(true); // Optimistic approach
+        
+        if ( context.getExternalContext().getRequestParameterMap().get("DO_GROUP_VALIDATION") != null 
+                && !StringUtils.isEmpty(value) ) {
+            
+            // cheap test - regex
+            if (! Pattern.matches("^[a-zA-Z0-9\\_\\-]+$", value) ) {
+                input.setValid(false);
+                context.addMessage(toValidate.getClientId(),
+                    new FacesMessage(FacesMessage.SEVERITY_ERROR, "", JH.localize("dataverse.permissions.explicitGroupEditDialog.groupIdentifier.invalid")));
+            
+            } else if ( explicitGroupSvc.findInOwner(getDvObject().getId(), value) != null ) {
+                // Ok, see that the alias is not taken
+                input.setValid(false);
+                context.addMessage(toValidate.getClientId(),
+                    new FacesMessage(FacesMessage.SEVERITY_ERROR, "", JH.localize("dataverse.permissions.explicitGroupEditDialog.groupIdentifier.taken")));
+            }
+        }
+    }
+
+    public void setNewExplicitGroupRoleAssignees(List<RoleAssignee> newExplicitGroupRoleAssignees) {
+        this.newExplicitGroupRoleAssignees = newExplicitGroupRoleAssignees;
+    }
+
+    public List<RoleAssignee> getNewExplicitGroupRoleAssignees() {
+        return newExplicitGroupRoleAssignees;
+    }
+
+    public String getNewExplicitGroupDescription() {
+        return newExplicitGroupDescription;
+    }
+
+    public void setNewExplicitGroupDescription(String newExplicitGroupDescription) {
+        this.newExplicitGroupDescription = newExplicitGroupDescription;
+    }
+    
+    /* 
+    ============================================================================
+    Internal methods
+    ============================================================================
+    */
+    
+    boolean renderConfigureMessages = false;
+    boolean renderAssignmentMessages = false;
+    boolean renderRoleMessages = false;    
+    
+    private void showNoMessages() {
+        renderConfigureMessages = false;
+        renderAssignmentMessages = false;
+        renderRoleMessages = false;
+    }    
+    
+    private void showConfigureMessages() {
+        renderConfigureMessages = true;
+        renderAssignmentMessages = false;
+        renderRoleMessages = false;
+    }
+    
+    private void showAssignmentMessages() {
+        renderConfigureMessages = false;
+        renderAssignmentMessages = true;
+        renderRoleMessages = false;
+    }
+    
+    private void showRoleMessages() {
+        renderConfigureMessages = false;
+        renderAssignmentMessages = false;
+        renderRoleMessages = true;
+    }    
+
+    public Boolean getRenderConfigureMessages() {
+        return renderConfigureMessages;
+    }
+
+    public void setRenderConfigureMessages(Boolean renderConfigureMessages) {
+        this.renderConfigureMessages = renderConfigureMessages;
+    }
+
+    public Boolean getRenderAssignmentMessages() {
+        return renderAssignmentMessages;
+    }
+
+    public void setRenderAssignmentMessages(Boolean renderAssignmentMessages) {
+        this.renderAssignmentMessages = renderAssignmentMessages;
+    }
+
+    public Boolean getRenderRoleMessages() {
+        return renderRoleMessages;
+    }
+
+    public void setRenderRoleMessages(Boolean renderRoleMessages) {
+        this.renderRoleMessages = renderRoleMessages;
+    }
+
+    // inner class used for display of role assignments
+    public static class RoleAssignmentRow {
+
+        private final RoleAssigneeDisplayInfo assigneeDisplayInfo;
+        private final RoleAssignment ra;
+
+        public RoleAssignmentRow(RoleAssignment anRa, RoleAssigneeDisplayInfo disInf) {
+            ra = anRa;
+            assigneeDisplayInfo = disInf;
+        }
+        
+        public RoleAssignment getRoleAssignment() {
+            return ra;
+        }        
+
+        public RoleAssigneeDisplayInfo getAssigneeDisplayInfo() {
+            return assigneeDisplayInfo;
+        }
+
+        public DataverseRole getRole() {
+            return ra.getRole();
+        }
+
+        public String getRoleName() {
+            return getRole().getName();
+        }
+                
+
+        public DvObject getDefinitionPoint() {
+            return ra.getDefinitionPoint();
+        }
+
+        public String getAssignedDvName() {
+            return ra.getDefinitionPoint().getDisplayName();
+        }
+
+        public Long getId() {
+            return ra.getId();
+        }
+
+    }
+}