001    package railo.runtime.functions.file;
002    
003    import railo.commons.io.res.Resource;
004    import railo.runtime.PageContext;
005    import railo.runtime.exp.PageException;
006    import railo.runtime.op.Caster;
007    import railo.runtime.type.Struct;
008    import railo.runtime.type.StructImpl;
009    import railo.runtime.type.dt.DateTimeImpl;
010    import railo.runtime.type.util.KeyConstants;
011    
012    public class GetFileInfo {
013    
014            public static Struct call(PageContext pc, Object oSrc) throws PageException {
015                    Resource src = Caster.toResource(pc,oSrc,true);
016                    pc.getConfig().getSecurityManager().checkFileLocation(src);
017                    
018                    Struct sct=new StructImpl();
019    
020                    sct.set("canRead", Caster.toBoolean(src.isReadable()));
021                    sct.set("canWrite", Caster.toBoolean(src.isWriteable()));
022                    sct.set("isHidden", Caster.toBoolean(src.getAttribute(Resource.ATTRIBUTE_HIDDEN)));
023                    sct.set("lastmodified",new DateTimeImpl(pc,src.lastModified(),false) );
024                    sct.set(KeyConstants._name,src.getName() );
025                    sct.set(KeyConstants._parent,src.getParent() );
026                    sct.set(KeyConstants._path,src.getAbsolutePath() );
027                    sct.set(KeyConstants._size, Caster.toDouble(src.length()));
028                    if(src.isDirectory())sct.set(KeyConstants._type, "directory");
029                    else if(src.isFile())sct.set(KeyConstants._type, "file");
030                    else sct.set(KeyConstants._type, "");
031                    
032                    // supported only by railo
033                    sct.set("isArchive", Caster.toBoolean(src.getAttribute(Resource.ATTRIBUTE_ARCHIVE)));
034                    sct.set("isSystem", Caster.toBoolean(src.getAttribute(Resource.ATTRIBUTE_SYSTEM)));
035                    sct.set("scheme", src.getResourceProvider().getScheme());
036                    sct.set("isCaseSensitive", Caster.toBoolean(src.getResourceProvider().isCaseSensitive()));
037                    sct.set("isAttributesSupported", Caster.toBoolean(src.getResourceProvider().isAttributesSupported()));
038                    sct.set("isModeSupported", Caster.toBoolean(src.getResourceProvider().isModeSupported()));
039                    
040                    return sct;
041            }
042    }