001    package railo.commons.io.res.type.file;
002    
003    import java.io.IOException;
004    import java.util.Map;
005    
006    import railo.commons.io.SystemUtil;
007    import railo.commons.io.res.Resource;
008    import railo.commons.io.res.ResourceProvider;
009    import railo.commons.io.res.Resources;
010    import railo.commons.io.res.util.ResourceLockImpl;
011    import railo.commons.io.res.util.ResourceUtil;
012    import railo.commons.lang.SizeOf;
013    import railo.commons.lang.StringUtil;
014    import railo.runtime.op.Caster;
015    import railo.runtime.type.Sizeable;
016    
017    public final class FileResourceProvider implements ResourceProvider,Sizeable {
018    
019            private String scheme="file";
020            
021            private long lockTimeout=10000;
022            private boolean caseSensitive=SystemUtil.isFSCaseSensitive();
023            private final ResourceLockImpl lock=new ResourceLockImpl(lockTimeout,caseSensitive);
024            private Map arguments;
025    
026            /**
027             * @see railo.commons.io.res.ResourceProvider#init(java.lang.String, java.util.Map)
028             */
029            public ResourceProvider init(String scheme, Map arguments) {
030                    if(!StringUtil.isEmpty(scheme))this.scheme=scheme;
031                    this.arguments=arguments;
032                    if(arguments!=null) {
033                            // lock-timeout
034                            String strTimeout = (String) arguments.get("lock-timeout");
035                            if(strTimeout!=null) {
036                                    lockTimeout=Caster.toLongValue(arguments.get("lock-timeout"),lockTimeout);
037                            }
038                    }
039                    lock.setLockTimeout(lockTimeout);
040                    
041                    return this;
042            }
043            /**
044             * Constructor of the class
045             */
046            public FileResourceProvider() {}
047            
048            /**
049             * @see res.ResourceProvider#getResource(java.lang.String)
050             */
051            public Resource getResource(String path) {
052                    return new FileResource(this,ResourceUtil.removeScheme("file",path));
053            }
054    
055            /**
056             * @see res.ResourceProvider#getScheme()
057             */
058            public String getScheme() {
059                    return scheme;
060            }
061            
062            /**
063             * @see railo.commons.io.res.ResourceProvider#setResources(railo.commons.io.res.Resources)
064             */
065            public void setResources(Resources resources) {
066                    //this.resources=resources;
067            }
068            
069    
070            /**
071             * @throws IOException 
072             * @see railo.commons.io.res.ResourceProvider#lock(railo.commons.io.res.Resource)
073             */
074            public void lock(Resource res) throws IOException {
075                    lock.lock(res);
076            }
077    
078            /**
079             * @see railo.commons.io.res.ResourceProvider#unlock(railo.commons.io.res.Resource)
080             */
081            public void unlock(Resource res) {
082                    lock.unlock(res);
083            }
084    
085            /**
086             * @throws IOException 
087             * @see railo.commons.io.res.ResourceProvider#read(railo.commons.io.res.Resource)
088             */
089            public void read(Resource res) throws IOException {
090                    lock.read(res);
091            }
092            
093            /**
094             * @see railo.commons.io.res.ResourceProvider#isAttributesSupported()
095             */
096            public boolean isAttributesSupported() {
097                    return SystemUtil.isWindows();
098            }
099            
100            /**
101             * @see railo.commons.io.res.ResourceProvider#isCaseSensitive()
102             */
103            public boolean isCaseSensitive() {
104                    return caseSensitive;
105            }
106            
107            /**
108             * @see railo.commons.io.res.ResourceProvider#isModeSupported()
109             */
110            public boolean isModeSupported() {
111                    return false;//SystemUtil.isUnix(); FUTURE add again
112            }
113            /**
114             * @see railo.runtime.type.Sizeable#sizeOf()
115             */
116            public long sizeOf() {
117                    return SizeOf.size(lock);
118            }
119            
120            public Map getArguments() {
121                    return arguments;
122            }
123    }