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