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    }