* @throws FileSystemException
*/
public void setAcl(Acl acl) throws FileSystemException {
// Create empty S3 ACL list
AccessControlList s3Acl = new AccessControlList();
// Get file owner
Owner owner;
try {
owner = getS3Owner();
} catch (Exception e) {
throw new FileSystemException(e);
}
s3Acl.setOwner(owner);
// Iterate over VFS ACL rules and fill S3 ACL list
Hashtable<Acl.Group, Acl.Permission[]> rules = acl.getRules();
Enumeration<Acl.Group> keys = rules.keys();
Acl.Permission[] allRights = Acl.Permission.values();
while (keys.hasMoreElements()) {
Acl.Group group = keys.nextElement();
Acl.Permission[] rights = rules.get(group);
if (rights.length == 0) {
// Skip empty rights
continue;
}
// Set permission
Permission perm;
if (ArrayUtils.isEquals(rights, allRights)) {
// Use ArrayUtils instead of native equals method.
// JRE1.6 enum[].equals behavior is very strange:
// Two equal by elements arrays are not equal
// Yeah, AFAIK its like that for any array.
perm = Permission.FullControl;
} else if (acl.isAllowed(group, Acl.Permission.READ)) {
perm = Permission.Read;
} else if (acl.isAllowed(group, Acl.Permission.WRITE)) {
perm = Permission.Write;
} else {
logger.error(String.format("Skip unknown set of rights %s",
rights.toString()));
continue;
}
// Set grantee
Grantee grantee;
if (group.equals(Acl.Group.EVERYONE)) {
grantee = GroupGrantee.AllUsers;
} else if (group.equals(Acl.Group.AUTHORIZED)) {
grantee = GroupGrantee.AuthenticatedUsers;
} else if (group.equals(Acl.Group.OWNER)) {
grantee = new CanonicalGrantee(owner.getId());
} else {
logger.error(String.format("Skip unknown group %s", group));
continue;
}
// Grant permission
s3Acl.grantPermission(grantee, perm);
}
// Put ACL to S3
try {
putS3Acl(s3Acl);