|
|
| Line 1: | |||
| + | This report will tell you all the users who have permissions to execute a workflow. This report will either be recursive for all the workflows in a folder or it will be for every workflow in the sytem. This report has to be used in conjunction with a report template such as the [[HTML Template]]. | ||
| + | ---- | ||
| + | ''Meta-Data Script:'' | ||
| + | <pre> | ||
| + | import com.urbancode.anthill3.domain.reporting.*; | ||
| + | ReportMetaData rmd = new ReportMetaData(); | ||
| + | TextParamMetaData folderParam = new TextParamMetaData(); | ||
| + | folderParam.setName("folderName"); | ||
| + | folderParam.setLabel("Folder"); | ||
| + | folderParam.setDescription("The Team/Group Folder name or All for All Projects"); | ||
| + | folderParam.setRequired(true); | ||
| + | folderParam.setDefaultValue("All"); | ||
| + | rmd.addParameter(folderParam); | ||
| + | // Configure columns | ||
| + | rmd.addColumn("Workflow"); | ||
| + | rmd.addColumn("Project"); | ||
| + | rmd.addColumn("Username"); | ||
| + | rmd.addColumn("First"); | ||
| + | rmd.addColumn("Last"); | ||
| + | rmd.addColumn("Realm"); | ||
| + | rmd.addColumn("Relevant Roles"); | ||
| + | // Lastly, return the meta data | ||
| + | return rmd; | ||
| + | </pre> | ||
| + | ---- | ||
| + | ''Report Script:'' | ||
| + | <pre>import com.urbancode.anthill3.domain.agent.*; | ||
| + | import com.urbancode.anthill3.domain.folder.*; | ||
| + | import com.urbancode.anthill3.domain.workflow.*; | ||
| + | import com.urbancode.anthill3.domain.project.*; | ||
| + | import com.urbancode.anthill3.domain.reporting.*; | ||
| + | import com.urbancode.anthill3.domain.security.*; | ||
| + | import com.urbancode.anthill3.domain.userprofile.*; | ||
| + | import org.apache.commons.lang.StringUtils; | ||
| + | ReportRow createReportRow(Workflow workflow, | ||
| + | User user, | ||
| + | UserProfile profile, | ||
| + | String relevantRoles) { | ||
| + | ReportRow result = null; | ||
| + | result = new ReportRow(output, "User"); | ||
| + | result.setColumnValue("Workflow", workflow.getName()); | ||
| + | result.setColumnValue("Project", workflow.getProject().getName()); | ||
| + | result.setColumnValue("Username", user.getName()); | ||
| + | if (profile != null) { | ||
| + | if (StringUtils.isNotEmpty(profile.getFirstName())) { | ||
| + | result.setColumnValue("First", profile.getFirstName()); | ||
| + | } | ||
| + | if (StringUtils.isNotEmpty(profile.getLastName())) { | ||
| + | result.setColumnValue("Last", profile.getLastName()); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | result.setColumnValue("Realm", user.getAuthenticationRealm().getName()); | ||
| + | result.setColumnValue("Relevant Roles", relevantRoles); | ||
| + | return result; | ||
| + | } | ||
| + | Set retrieveWorkflowsForFolder(Folder folder) { | ||
| + | Set result = new HashSet(); | ||
| + | |||
| + | Folder[] childFolders = folder.getChildren(); | ||
| + | for (int i = 0; i < childFolders.length; i++) { | ||
| + | Folder childFolder = childFolders[i]; | ||
| + | result.addAll(retrieveWorkflowsForFolder(childFolder)); | ||
| + | } | ||
| + | Project[] folderProjects = folder.getProjects(); | ||
| + | for (int i = 0; i < folderProjects.length; i++) { | ||
| + | Project project = folderProjects[i]; | ||
| + | result.addAll(Arrays.asList(project.getWorkflowArray())); | ||
| + | } | ||
| + | return result; | ||
| + | } | ||
| + | List retrieveRelevantRoles(Workflow workflow) { | ||
| + | List result = new ArrayList(); | ||
| + | Resource workflowResource = ResourceFactory.getInstance().restoreForPersistent(workflow); | ||
| + | Permission[] permissions = PermissionFactory.getInstance().restoreAllForResource(workflowResource); | ||
| + | for (int i = 0; i < permissions.length; i++) { | ||
| + | Permission perm = permissions[i]; | ||
| + | if (perm.getAction().equals("execute")) { | ||
| + | result.add(perm.getRole()); | ||
| + | } | ||
| + | } | ||
| + | return result; | ||
| + | } | ||
| + | Folder resolveFolderFromName() { | ||
| + | Folder result = null; | ||
| + | String pathStr = folderName.replaceAll("\\\\", "/"); | ||
| + | String[] path = pathStr.split("/"); | ||
| + | result = FolderFactory.getInstance().restoreForName(path[0]); | ||
| + | for (int i = 1; result != null && i < path.length; i++) { | ||
| + | Folder[] childFolders = result.getChildren(); | ||
| + | boolean found = false; | ||
| + | for (int j = 0; !found && j < childFolders.length; j++) { | ||
| + | Folder childFolder = childFolders[j]; | ||
| + | if (childFolder.getName().equals(path[i])) { | ||
| + | result = childFolder; | ||
| + | found = true; | ||
| + | } | ||
| + | } | ||
| + | if (!found) { | ||
| + | result = null; | ||
| + | } | ||
| + | } | ||
| + | return result; | ||
| + | } | ||
| + | void populateAndSortWorkflowsArray(Folder folder) { | ||
| + | Set workflowSet = retrieveWorkflowsForFolder(folder); | ||
| + | workflows = new Workflow[workflowSet.size()]; | ||
| + | workflowSet.toArray(workflows); | ||
| + | Arrays.sort(workflows, new Comparator() { | ||
| + | public int compare(Object obj1, Object obj2) { | ||
| + | Workflow workflow1 = (Workflow) obj1; | ||
| + | Workflow workflow2 = (Workflow) obj2; | ||
| + | return workflow1.getName().compareTo(workflow2.getName()); | ||
| + | } | ||
| + | } | ||
| + | ); | ||
| + | } | ||
| + | Workflow[] workflows = null; | ||
| + | if (folderName.equals("All")) { | ||
| + | workflows = WorkflowFactory.getInstance().restoreAll(); | ||
| + | } | ||
| + | else { | ||
| + | Folder folder = resolveFolderFromName(); | ||
| + | |||
| + | if (folder != null) { | ||
| + | populateAndSortWorkflowsArray(folder); | ||
| + | } | ||
| + | } | ||
| + | ReportOutput output = new ReportOutput(metaData); | ||
| + | for (int i = 0; workflows != null && i < workflows.length; i++) { | ||
| + | Workflow workflow = workflows[i]; | ||
| + | // This list is incomplete, only includes roles runner has | ||
| + | List relevantRoles = retrieveRelevantRoles(workflow); | ||
| + | User[] users = Authority.getInstance().getUsersWithPermissionToPersistent(workflow, "execute"); | ||
| + | for (int j = 0; j < users.length; j++) { | ||
| + | User user = users[j]; | ||
| + | UserProfile profile = UserProfileFactory.getInstance().restoreForUser(user); | ||
| + | String relevantRoleNames = ""; | ||
| + | for (int k = 0; k < relevantRoles.size(); k++) { | ||
| + | Role role = (Role) relevantRoles.get(k); | ||
| + | if (user.hasRole(role)) { | ||
| + | if (StringUtils.isNotEmpty(relevantRoleNames)) { | ||
| + | relevantRoleNames += ", "; | ||
| + | } | ||
| + | relevantRoleNames += role.getName(); | ||
| + | } | ||
| + | } | ||
| + | ReportRow row = null; | ||
| + | if (StringUtils.isNotEmpty(relevantRoleNames)) { | ||
| + | row = createReportRow(workflow, user, profile, relevantRoleNames); | ||
| + | } | ||
| + | else { | ||
| + | row = createReportRow(workflow, user, profile, "Protected"); | ||
| + | } | ||
| + | output.addRow(row); | ||
| + | } | ||
| + | } | ||
| + | return output; | ||
| + | </pre> | ||
| + | ---- | ||
| + | '''Related Content''' | ||
| + | [[AnthillPro Template Reports]]<br/> | ||
| + | [[Report Templates]] | ||