if (null == bundle) {
throw new BundleNotFoundException("Bundle ID [" + bundleId + "]");
}
}
BundleGroupAssignmentComposite result = new BundleGroupAssignmentComposite(assigningSubject, bundle);
Set<Permission> globalPermissions = authorizationManager.getExplicitGlobalPermissions(assigningSubject);
boolean hasManageBundleGroups = globalPermissions.contains(Permission.MANAGE_BUNDLE_GROUPS);
// can assign any bundle anywhere, or leave unassigned
if (hasManageBundleGroups) {
BundleGroupCriteria criteria = new BundleGroupCriteria();
// just get all the bundle groups by using overlord and no filters
List<BundleGroup> bundleGroups = findBundleGroupsByCriteria(subjectManager.getOverlord(), criteria);
result.setCanBeUnassigned(true);
result.setBundleGroupMap(populateBundleGroupMap(bundleGroups, bundle));
return result;
}
boolean hasViewBundles = globalPermissions.contains(Permission.VIEW_BUNDLES);
boolean hasCreateBundles = globalPermissions.contains(Permission.CREATE_BUNDLES);
boolean isNewBundle = (null == bundle);
ArrayList<Permission> permFilter = new ArrayList<Permission>(1);
if (isNewBundle) {
// set whether can leave unassigned
result.setCanBeUnassigned(hasCreateBundles && hasViewBundles);
// can assign to bundle groups for which he has create_bundles_in_group
permFilter.add(Permission.CREATE_BUNDLES_IN_GROUP);
} else {
// if necessary, make sure the bundle is viewable
if (!hasViewBundles && !authorizationManager.canViewBundle(assigningSubject, bundleId)) {
throw new PermissionException("Bundle ID [" + bundleId + "] is not viewable by subject ["
+ assigningSubject.getName() + "]");
}
// can assign to bundle groups for which he has create_bundles_in_group or assign_bundles_to_group
permFilter.add(Permission.CREATE_BUNDLES_IN_GROUP);
permFilter.add(Permission.ASSIGN_BUNDLES_TO_GROUP);
}
List<BundleGroup> bundleGroups;
if (hasCreateBundles) {
// can assign to any viewable bundle group
// get all the viewable bundle groups for the subject, no filters
BundleGroupCriteria criteria = new BundleGroupCriteria();
bundleGroups = findBundleGroupsByCriteria(assigningSubject, criteria);
} else {
// can only assign to bundle groups for which he has the necessary permissions
RoleCriteria criteria = new RoleCriteria();
criteria.addFilterSubjectId(assigningSubject.getId());
criteria.addFilterPermissions(permFilter);
criteria.fetchBundleGroups(true);
List<Role> roles = LookupUtil.getRoleManager().findRolesByCriteria(subjectManager.getOverlord(), criteria);
bundleGroups = new ArrayList<BundleGroup>();
for (Role role : roles) {
for (BundleGroup bundleGroup : role.getBundleGroups()) {
if (!bundleGroups.contains(bundleGroup)) {
bundleGroups.add(bundleGroup);
}
}
}
}
result.setBundleGroupMap(populateBundleGroupMap(bundleGroups, bundle));
return result;
}