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 @Override 110 public ResourceLock createResourceLock(long timeout,boolean caseSensitive) { 111 return new ResourceLockImpl(timeout,caseSensitive); 112 } 113 114 public void reset() { 115 resources=new ResourceProvider[0]; 116 } 117 }