Version Differences for User Workflow Execution

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]]