package edu.harvard.iq.dataverse.authorization; import com.google.common.collect.Lists; import edu.harvard.iq.dataverse.DataFile; import edu.harvard.iq.dataverse.Dataset; import edu.harvard.iq.dataverse.Dataverse; import edu.harvard.iq.dataverse.DataverseRoleServiceBean; import edu.harvard.iq.dataverse.authorization.DataverseRole; import java.sql.Array; import java.util.AbstractMap; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.logging.Logger; import javax.ejb.EJB; import javax.ejb.Stateless; import javax.inject.Named; import org.apache.commons.lang.StringUtils; /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ /** * Originally created for the MyData page. * Helps facilitate "en masse" checking of whether Roles * pertain to specific DvObject types * * @author rmp553 */ public class DataverseRolePermissionHelper implements java.io.Serializable { private static final Logger logger = Logger.getLogger(DataverseRolePermissionHelper.class.getCanonicalName()); //@EJB //DataverseRoleServiceBean roleService; public Map<Long, Boolean> rolesWithDataversePermissions = new HashMap<>(); // { role id : true } public Map<Long, Boolean> rolesWithDatasetPermissions = new HashMap<>(); // { role id : true } public Map<Long, Boolean> rolesWithFilePermissions = new HashMap<>(); // { role id : true } public Map<Long, String> roleNameLookup = new HashMap<>(); // { role id : role name } public List<List<String>> rolesByDvObjectTable = Lists.newArrayList(); /** * Initialize Map objects by iterating over role objects * */ public DataverseRolePermissionHelper(List<DataverseRole> roleList){ // Load Role Information // for(DataverseRole role : roleList){ // Does this role have Dataverse permissions? // if (role.doesDvObjectClassHavePermissionForObject(Dataverse.class)){ this.rolesWithDataversePermissions.put(role.getId(), true); } // Does this role have Dataset permissions? // if (role.doesDvObjectClassHavePermissionForObject(Dataset.class)){ this.rolesWithDatasetPermissions.put(role.getId(), true); } // Does this role have File permissions? // if (role.doesDvObjectClassHavePermissionForObject(DataFile.class)){ this.rolesWithFilePermissions.put(role.getId(), true); } // Store role name in lookup // this.roleNameLookup.put(role.getId(), role.getName()); } this.loadRolesByDvObjectTable(); } /** * top row: role names * */ private void loadRolesByDvObjectTable(){ List<String> row = new ArrayList<>(); Set<Entry<Long,String>> roleNameSet = roleNameLookup.entrySet(); // Row 1: Row Names row.add(""); for (Map.Entry<Long,String> pair : roleNameSet) { row.add("<b>" + pair.getValue() + "</b> (" + pair.getKey() + ")"); } this.rolesByDvObjectTable.add(row); // Row 2: Dataverse role settings // row = new ArrayList<>(); row.add("<b>Dataverse</b>"); for (Map.Entry<Long,String> pair : roleNameSet) { Long role_id = pair.getKey(); if (this.hasDataversePermissions(role_id)){ row.add("YES"); }else{ row.add("--"); } } this.rolesByDvObjectTable.add(row); // Row 3: Dataset role settings // row = new ArrayList<>(); row.add("<b>Dataset</b>"); for (Map.Entry<Long,String> pair : roleNameSet) { Long role_id = pair.getKey(); if (this.hasDatasetPermissions(role_id)){ row.add("YES"); }else{ row.add("--"); } } this.rolesByDvObjectTable.add(row); // Row 4: File role settings // row = new ArrayList<>(); row.add("<b>File</b>"); for (Map.Entry<Long,String> pair : roleNameSet) { Long role_id = pair.getKey(); if (this.hasFilePermissions(role_id)){ row.add("YES"); }else{ row.add("--"); } } this.rolesByDvObjectTable.add(row); } /** * Check if role contains a permission related to Files (DataFile) * * @param role * @return */ public boolean hasFilePermissions(DataverseRole role){ if (role == null){ return false; } return this.hasFilePermissions(role.getId()); } public boolean hasFilePermissions(Long role_id){ if (role_id == null){ return false; } return this.rolesWithFilePermissions.containsKey(role_id); } /** * Check if role contains a permission related to Datasets * * @param role * @return */ public boolean hasDatasetPermissions(DataverseRole role){ if (role == null){ return false; } return this.hasDatasetPermissions(role.getId()); } public boolean hasDatasetPermissions(Long role_id){ if (role_id == null){ return false; } return this.rolesWithDatasetPermissions.containsKey(role_id); } /** * Check if role contains a permission related to Dataverses * * @param role * @return */ public boolean hasDataversePermissions(DataverseRole role){ if (role == null){ return false; } return this.hasDataversePermissions(role.getId()); } public boolean hasDataversePermissions(Long role_id){ if (role_id == null){ return false; } return this.rolesWithDataversePermissions.containsKey(role_id); } /*** * Get role name from lookup * * @param role * @return */ public String getRoleName(DataverseRole role){ if (role == null){ return null; } return this.getRoleName(role.getId()); } public String getRoleName(Long role_id){ if (role_id == null){ return null; } if (this.roleNameLookup.containsKey(role_id)){ return this.roleNameLookup.get(role_id); } return null; } /* entries = new ArrayList<Entry<Integer, String>>(map.entrySet()); */ private List<Entry<Long, String>> roleNamesAsArrayList; public List<Entry<Long, String>> getRoleNamesAsArrayList(){ return new ArrayList<>(roleNameLookup.entrySet()); } public List<String[]> getRoleInfoForCheckboxes(){ List<String[]> roleInfoList = new ArrayList<>(); for (Entry<Long,String> entry : roleNameLookup.entrySet()){ String idName = entry.getValue().toLowerCase().replace(" + ", "").replace(" ", ""); // triplet: key, name, id_name // Examples: { 1, Admin, admin }, {2, File Downloader, filedownloader} String[] singleRole = { entry.getKey().toString(), entry.getValue(), idName }; roleInfoList.add(singleRole); } return roleInfoList; } private void msg(String s){ logger.info(s); } private void msgt(String s){ msg("-------------------------------"); msg(s); msg("-------------------------------"); } public List<Long> getRoleIdList(){ List<Long> outputList = new ArrayList<>(); for (Map.Entry<Long,String> pair : roleNameLookup.entrySet()) { outputList.add(pair.getKey()); } return outputList; } public String getRoleNameListString(){ List<String> outputList = new ArrayList<>(); for (Map.Entry<Long,String> pair : roleNameLookup.entrySet()) { outputList.add(pair.getKey() + " --> " + pair.getValue()); } return StringUtils.join(outputList, "<br />"); } public String getRolesWithDataversePermissionsAsHTML(){ List<String> outputList = new ArrayList<>(); for (Map.Entry<Long,Boolean> pair : rolesWithDataversePermissions.entrySet()) { String roleName = this.roleNameLookup.get(pair.getKey()); outputList.add(roleName); } return StringUtils.join(outputList, "<br />"); } public String getDatasetRolesAsHTML(){ List<String> outputList = new ArrayList<>(); for (Map.Entry<Long,Boolean> pair : this.rolesWithDatasetPermissions.entrySet()) { String roleName = this.roleNameLookup.get(pair.getKey()); outputList.add(roleName); } return StringUtils.join(outputList, "<br />"); } public String getRolesWithFilePermissionsAsHTML(){ List<String> outputList = new ArrayList<>(); for (Map.Entry<Long,Boolean> pair : this.rolesWithFilePermissions.entrySet()) { String roleName = this.roleNameLookup.get(pair.getKey()); outputList.add(roleName); } return StringUtils.join(outputList, "<br />"); } public Map<Long, Boolean> getRolesWithDataversePermissions(){ return this.rolesWithDataversePermissions; } public Map<Long, Boolean> getRolesWithDatasetPermissions(){ return this.rolesWithDatasetPermissions; } public Map<Long, Boolean> getRolesWithFilePermissions(){ return this.rolesWithFilePermissions; } public List<List<String>> getRolesByDvObjectTable(){ return this.rolesByDvObjectTable; } public List<String> getRoleNamesByIdList(List<Long> idList){ if ((idList==null)||(idList.isEmpty())){ return null; } List<String> roleNameList = new ArrayList<>(); for (Long roleId : idList){ if (this.roleNameLookup.containsKey(roleId)){ roleNameList.add(this.roleNameLookup.get(roleId)); } } return roleNameList; } }