package railo.commons.io.res; import java.io.IOException; import railo.commons.io.res.type.file.FileResourceProvider; import railo.commons.io.res.type.ram.RamResourceProviderOld; import railo.commons.io.res.util.ResourceLockImpl; public final class ResourcesImpl implements Resources { private static ResourceProvider frp=new FileResourceProvider(); private static Resources global=new ResourcesImpl(); private ResourceProvider defaultResource=frp; private ResourceProvider[] resources=new ResourceProvider[0]; /** * adds a default factory, this factory is used, when shemecan't be mapped to a other factory * @param provider */ public void registerDefaultResourceProvider(ResourceProvider provider) { provider.setResources(this); this.defaultResource=provider; } /** * adds a additional resource to System * @param provider */ public void registerResourceProvider(ResourceProvider provider) { provider.setResources(this); String scheme = provider.getScheme(); if(scheme==null) return; ResourceProvider[] tmp=new ResourceProvider[resources.length+1]; for(int i=0;i<resources.length;i++) { if(scheme.equalsIgnoreCase(resources[i].getScheme())) { resources[i]=provider; return; } tmp[i]=resources[i]; } tmp[resources.length]=provider; resources=tmp; } /** * returns a resource that matching the given path * @param path * @return matching resource */ public Resource getResource(String path) { int index=path.indexOf("://"); if(index!=-1) { String scheme=path.substring(0,index).toLowerCase().trim(); String subPath = path.substring(index+3); for(int i=0;i<resources.length;i++) { if(scheme.equalsIgnoreCase(resources[i].getScheme())) return resources[i].getResource(subPath); } } return defaultResource.getResource(path); } public static Resources getGlobal() { return global; } public static void main(String[] args) throws IOException { Resources rs=ResourcesImpl.getGlobal(); rs.registerResourceProvider(new RamResourceProviderOld()); Resource changes = rs.getResource("d:/changes.txt"); changes = rs.getResource("file://d:/changes.txt"); System.out.println(changes.getCanonicalPath()); Resource mem = rs.getResource("ram://changes.txt"); ResourceProvider mf=mem.getResourceProvider(); System.out.println(mem.getPath()); System.out.println(mem); mem = mf.getResource("changes.txt"); System.out.println(mem.getPath()); System.out.println(mem); } /** * @return the defaultResource */ public ResourceProvider getDefaultResourceProvider() { return defaultResource; } public ResourceProvider[] getResourceProviders() { ResourceProvider[] tmp = new ResourceProvider[resources.length]; for(int i=0;i<tmp.length;i++) { tmp[i]=resources[i]; } return tmp; } public static ResourceProvider getFileResourceProvider() { return frp; } @Override public ResourceLock createResourceLock(long timeout,boolean caseSensitive) { return new ResourceLockImpl(timeout,caseSensitive); } public void reset() { resources=new ResourceProvider[0]; } }