001    package railo.runtime.functions.s3;
002    
003    import java.io.IOException;
004    import java.util.Iterator;
005    import java.util.List;
006    
007    import railo.commons.io.res.type.s3.AccessControl;
008    import railo.commons.io.res.type.s3.S3Exception;
009    import railo.commons.io.res.type.s3.S3Resource;
010    import railo.runtime.PageContext;
011    import railo.runtime.exp.PageException;
012    import railo.runtime.op.Caster;
013    import railo.runtime.type.Array;
014    import railo.runtime.type.ArrayImpl;
015    import railo.runtime.type.Collection;
016    import railo.runtime.type.KeyImpl;
017    import railo.runtime.type.Struct;
018    import railo.runtime.type.StructImpl;
019    
020    public class StoreGetACL extends S3Function {
021    
022            public static final Collection.Key GROUP = KeyImpl.intern("group");
023            public static final Collection.Key DISPLAY_NAME = KeyImpl.intern("displayName");
024            public static final Collection.Key EMAIL = KeyImpl.intern("email");
025            public static final Collection.Key PERMISSION = KeyImpl.intern("permission");
026            
027            
028            public static Object call(PageContext pc , String url) throws PageException {
029            
030                    S3Resource res=toS3Resource(pc,url,"StoreGetACL");
031                    try {
032                            return toArrayStruct(res.getAccessControlPolicy().getAccessControlList());
033                    } catch (IOException e) {
034                            throw Caster.toPageException(e);
035                    }
036        }
037    
038            private static Object toArrayStruct(List<AccessControl> accessControlList) throws S3Exception {
039                    Array arr=new ArrayImpl();
040                    String type;
041                    Struct sct;
042                    AccessControl ac;
043                    Iterator<AccessControl> it = accessControlList.iterator();
044                    while(it.hasNext()){
045                            ac=it.next();
046                            arr.appendEL(sct=new StructImpl());
047                            sct.setEL(KeyImpl.ID, ac.getId());
048                            sct.setEL(PERMISSION, ac.getPermission());
049                            
050                            type = AccessControl.toType(ac.getType());
051                            if("Group".equalsIgnoreCase(type))                              
052                                    setGroup(sct,ac);
053                            else if("CanonicalUser".equalsIgnoreCase(type)) 
054                                    sct.setEL(DISPLAY_NAME, ac.getDisplayName());
055                            else 
056                                    sct.setEL(EMAIL, ac.getId());
057                    }
058                    return arr;
059            }
060            
061            private static void setGroup(Struct sct, AccessControl ac) {
062                    String uri = ac.getUri();
063                    sct.setEL(KeyImpl.ID, uri);
064                    if("http://acs.amazonaws.com/groups/global/AllUsers".equalsIgnoreCase(uri))
065                            sct.setEL(GROUP, "all");
066                    else if("http://acs.amazonaws.com/groups/global/AuthenticatedUsers".equalsIgnoreCase(uri))
067                            sct.setEL(GROUP, "authenticated");
068                    else if("http://acs.amazonaws.com/groups/s3/LogDelivery".equalsIgnoreCase(uri))
069                            sct.setEL(GROUP, "log_delivery");
070            }
071    
072    }