package railo.runtime.functions.s3;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import railo.commons.io.res.type.s3.AccessControl;
import railo.commons.io.res.type.s3.S3Exception;
import railo.commons.io.res.type.s3.S3Resource;
import railo.runtime.PageContext;
import railo.runtime.exp.PageException;
import railo.runtime.op.Caster;
import railo.runtime.type.Array;
import railo.runtime.type.ArrayImpl;
import railo.runtime.type.Collection;
import railo.runtime.type.KeyImpl;
import railo.runtime.type.Struct;
import railo.runtime.type.StructImpl;
import railo.runtime.type.util.KeyConstants;
public class StoreGetACL extends S3Function {
public static final Collection.Key DISPLAY_NAME = KeyImpl.intern("displayName");
public static final Collection.Key PERMISSION = KeyImpl.intern("permission");
public static Object call(PageContext pc , String url) throws PageException {
S3Resource res=toS3Resource(pc,url,"StoreGetACL");
try {
return toArrayStruct(res.getAccessControlPolicy().getAccessControlList());
} catch (IOException e) {
throw Caster.toPageException(e);
}
}
private static Object toArrayStruct(List<AccessControl> accessControlList) throws S3Exception {
Array arr=new ArrayImpl();
String type;
Struct sct;
AccessControl ac;
Iterator<AccessControl> it = accessControlList.iterator();
while(it.hasNext()){
ac=it.next();
arr.appendEL(sct=new StructImpl());
sct.setEL(KeyConstants._id, ac.getId());
sct.setEL(PERMISSION, ac.getPermission());
type = AccessControl.toType(ac.getType());
if("Group".equalsIgnoreCase(type))
setGroup(sct,ac);
else if("CanonicalUser".equalsIgnoreCase(type))
sct.setEL(DISPLAY_NAME, ac.getDisplayName());
else
sct.setEL(KeyConstants._email, ac.getId());
}
return arr;
}
private static void setGroup(Struct sct, AccessControl ac) {
String uri = ac.getUri();
sct.setEL(KeyConstants._id, uri);
if("http://acs.amazonaws.com/groups/global/AllUsers".equalsIgnoreCase(uri))
sct.setEL(KeyConstants._group, "all");
else if("http://acs.amazonaws.com/groups/global/AuthenticatedUsers".equalsIgnoreCase(uri))
sct.setEL(KeyConstants._group, "authenticated");
else if("http://acs.amazonaws.com/groups/s3/LogDelivery".equalsIgnoreCase(uri))
sct.setEL(KeyConstants._group, "log_delivery");
}
}