001 package railo.commons.io.res.type.compress; 002 003 import java.io.IOException; 004 import java.util.Map; 005 006 import railo.commons.io.res.Resource; 007 import railo.commons.io.res.ResourceProvider; 008 import railo.commons.io.res.Resources; 009 import railo.commons.io.res.util.ResourceLockImpl; 010 import railo.commons.io.res.util.ResourceUtil; 011 import railo.commons.lang.SizeOf; 012 import railo.commons.lang.StringUtil; 013 import railo.runtime.PageContext; 014 import railo.runtime.engine.ThreadLocalPageContext; 015 import railo.runtime.op.Caster; 016 import railo.runtime.type.Sizeable; 017 018 public abstract class CompressResourceProvider implements ResourceProvider,Sizeable { 019 020 private static final long serialVersionUID = 5930090603192203086L; 021 022 private Resources resources; 023 protected String scheme=null; 024 protected boolean caseSensitive=true; 025 boolean async=true; 026 private long lockTimeout=10000; 027 private final ResourceLockImpl lock=new ResourceLockImpl(lockTimeout,caseSensitive); 028 private Map arguments; 029 030 @Override 031 public ResourceProvider init(String scheme, Map arguments) { 032 if(!StringUtil.isEmpty(scheme))this.scheme=scheme; 033 if(arguments!=null) { 034 this.arguments=arguments; 035 // case-sensitive 036 String strCaseSensitive=(String) arguments.get("case-sensitive"); 037 if(strCaseSensitive!=null) { 038 caseSensitive=Caster.toBooleanValue(strCaseSensitive,true); 039 } 040 041 // sync 042 String strASync=(String) arguments.get("asynchronus"); 043 if(strASync==null)strASync=(String) arguments.get("async"); 044 if(strASync!=null) { 045 async=Caster.toBooleanValue(strASync,true); 046 } 047 048 // lock-timeout 049 String strTimeout = (String) arguments.get("lock-timeout"); 050 if(strTimeout!=null) { 051 lockTimeout=Caster.toLongValue(arguments.get("lock-timeout"),lockTimeout); 052 } 053 } 054 lock.setLockTimeout(lockTimeout); 055 lock.setCaseSensitive(caseSensitive); 056 057 return this; 058 } 059 060 public ResourceProvider init(String scheme, boolean caseSensitive, boolean async) { 061 if(!StringUtil.isEmpty(scheme))this.scheme=scheme; 062 this.caseSensitive=caseSensitive; 063 this.async=async; 064 return this; 065 } 066 067 @Override 068 public Resource getResource(String path) { 069 path=ResourceUtil.removeScheme(scheme,path); 070 int index=path.lastIndexOf('!'); 071 if(index!=-1) { 072 073 Resource file = toResource(path.substring(0,index));//resources.getResource(path.substring(0,index)); 074 return new CompressResource(this,getCompress(file),path.substring(index+1),caseSensitive); 075 } 076 Resource file = toResource(path);//resources.getResource(path); 077 return new CompressResource(this,getCompress(file),"/",caseSensitive); 078 } 079 080 private Resource toResource(String path) { 081 PageContext pc = ThreadLocalPageContext.get(); 082 if(pc!=null) { 083 return ResourceUtil.toResourceNotExisting(ThreadLocalPageContext.get(), path,true); 084 } 085 return resources.getResource(path); 086 } 087 088 public abstract Compress getCompress(Resource file); 089 090 @Override 091 public String getScheme() { 092 return scheme; 093 } 094 095 096 097 public void setResources(Resources resources) { 098 this.resources=resources; 099 } 100 101 @Override 102 public void lock(Resource res) throws IOException { 103 lock.lock(res); 104 } 105 106 @Override 107 public void unlock(Resource res) { 108 lock.unlock(res); 109 } 110 111 @Override 112 public void read(Resource res) throws IOException { 113 lock.read(res); 114 } 115 116 @Override 117 public Map getArguments() { 118 return arguments; 119 } 120 121 /*public static void main(String[] args) throws IOException { 122 Resources rs=ResourcesImpl.getGlobal(); 123 rs.registerResourceProvider(new ZipResourceProvider().init("zip", null)); 124 rs.registerResourceProvider(new RamResourceProvider().init("ram", null)); 125 126 127 Resource ra = rs.getResource("zip:///Users/mic/temp/test/ras111.zip!/dd/"); 128 print.ln(ra); 129 print.ln(ra.getParent()); 130 131 ra = rs.getResource("ram:///dd/"); 132 print.ln(ra); 133 print.ln(ra.getParent()); 134 135 136 Resource org = rs.getResource("/Users/mic/temp/test/org.zip"); 137 Resource trg = rs.getResource("/Users/mic/temp/test/trg.zip"); 138 Resource ras = rs.getResource("/Users/mic/temp/test/ras.zip"); 139 140 ResourceUtil.copy(org, ras); 141 142 143 144 Resource res1 = rs.getResource("zip:///Users/mic/temp/test/rasx.zip!/dd"); 145 Resource res2 = rs.getResource("zip:///Users/mic/temp/test/ras.zip!/ddd"+Math.random()+".txt"); 146 147 res1.mkdirs(); 148 res2.createNewFile(); 149 ResourceUtil.copy(ras, trg); 150 print.ln("copy"); 151 152 //Resource org2 = rs.getResource("/Users/mic/temp/test/org.zip"); 153 Resource railotmp = rs.getResource("/Users/mic/temp/railotmp/"); 154 Resource trg2 = rs.getResource("zip:///Users/mic/temp/railotmp.zip!"); 155 trg2.delete(); 156 long start=System.currentTimeMillis(); 157 ResourceUtil.copyRecursive(railotmp, trg2); 158 159 print.ln("ende "+(System.currentTimeMillis()-start)); 160 161 //print(res3); 162 163 164 } 165 166 private static void print(Resource r) { 167 168 print.ln("****************************************"); 169 print.ln(r); 170 if(r==null) return; 171 print.ln("path:"+r.getPath()); 172 print.ln("name:"+r.getName()); 173 print.ln("parent:"+r.getParent()); 174 print.ln("parent-res:"+r.getParentResource()); 175 print.ln("exists:"+r.exists()); 176 print.ln("isDirectory:"+r.isDirectory()); 177 print.ln("isFile:"+r.isFile()); 178 print.ln("lastModified:"+r.lastModified()); 179 if(r.isFile()) { 180 //print.ln("->"+IOUtil.toString(r.getI nputStream(),null)+"<-"); 181 } 182 if(r.isDirectory()) { 183 print.ln(" - children"); 184 String[] children = r.list(); 185 Resource[] ch2 = r.listResources(); 186 for(int i=0;i<children.length;i++) { 187 print.ln(" - "+children[i]); 188 print.ln(" - "+ch2[i]); 189 } 190 } 191 }*/ 192 193 194 @Override 195 public long sizeOf() { 196 return SizeOf.size(lock); 197 } 198 }