User Workflow Execution

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:

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;

Report Script:

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;  

Related Content

AnthillPro Template Reports
Report Templates