001    package railo.commons.io.res;
002    
003    import java.io.IOException;
004    
005    import railo.commons.io.res.type.file.FileResourceProvider;
006    import railo.commons.io.res.type.ram.RamResourceProviderOld;
007    import railo.commons.io.res.util.ResourceLockImpl;
008    
009    
010    public final class ResourcesImpl implements Resources {
011    
012            private static ResourceProvider frp=new FileResourceProvider();
013            private static Resources global=new ResourcesImpl();
014            private ResourceProvider defaultResource=frp;
015            private ResourceProvider[] resources=new ResourceProvider[0];
016            
017            /**
018             * adds a default factory, this factory is used, when shemecan't be mapped to a other factory
019             * @param provider
020             */
021            public void registerDefaultResourceProvider(ResourceProvider provider) {
022                    provider.setResources(this);
023                    this.defaultResource=provider;
024            }
025    
026            /**
027             * adds a additional resource to System
028             * @param provider
029             */
030            public void registerResourceProvider(ResourceProvider provider) {
031                    
032                    provider.setResources(this);
033                    String scheme = provider.getScheme();
034                    if(scheme==null) return;
035                    
036                    ResourceProvider[] tmp=new ResourceProvider[resources.length+1];
037                    for(int i=0;i<resources.length;i++) {
038                            if(scheme.equalsIgnoreCase(resources[i].getScheme())) {
039                                    resources[i]=provider;
040                                    return;
041                            }
042                            tmp[i]=resources[i];
043                    }
044                    tmp[resources.length]=provider;
045                    resources=tmp;
046            }
047            
048            /**
049             * returns a resource that matching the given path
050             * @param path
051             * @return matching resource
052             */
053            public Resource getResource(String path) {
054                    int index=path.indexOf("://");
055                    if(index!=-1) {
056                            String scheme=path.substring(0,index).toLowerCase().trim();
057                            String subPath = path.substring(index+3);
058                            for(int i=0;i<resources.length;i++) {
059                                    if(scheme.equalsIgnoreCase(resources[i].getScheme()))
060                                            return resources[i].getResource(subPath);
061                            }
062                    }
063                    return defaultResource.getResource(path);
064                    
065            }
066    
067            public static Resources getGlobal() {
068                    return global;
069            }
070    
071            public static void main(String[] args) throws IOException {
072                    Resources rs=ResourcesImpl.getGlobal();
073                    rs.registerResourceProvider(new RamResourceProviderOld());
074                    
075                    Resource changes = rs.getResource("d:/changes.txt");
076                    changes = rs.getResource("file://d:/changes.txt");
077                    System.out.println(changes.getCanonicalPath());
078                    
079                    Resource mem = rs.getResource("ram://changes.txt");
080                    ResourceProvider mf=mem.getResourceProvider();
081                    System.out.println(mem.getPath());
082                    System.out.println(mem);
083                    
084                    mem = mf.getResource("changes.txt");
085                    System.out.println(mem.getPath());
086                    System.out.println(mem);
087                    
088            }
089    
090            /**
091             * @return the defaultResource
092             */
093            public ResourceProvider getDefaultResourceProvider() {
094                    return defaultResource;
095            }
096    
097            public ResourceProvider[] getResourceProviders() {
098                    ResourceProvider[] tmp = new ResourceProvider[resources.length];
099                    for(int i=0;i<tmp.length;i++) {
100                            tmp[i]=resources[i];
101                    }
102                    return tmp;
103            }
104    
105            public static ResourceProvider getFileResourceProvider() {
106                    return frp;
107            }
108    
109            /**
110             * @see railo.commons.io.res.Resources#createResourceLock(long, boolean)
111             */
112            public ResourceLock createResourceLock(long timeout,boolean caseSensitive) {
113                    return new ResourceLockImpl(timeout,caseSensitive);
114            }
115    
116            public void reset() {
117                    resources=new ResourceProvider[0];
118            }
119    }