001    package railo.commons.io.res.type.cfml;
002    
003    import java.io.ByteArrayInputStream;
004    import java.io.IOException;
005    import java.io.InputStream;
006    import java.io.OutputStream;
007    
008    import railo.commons.io.CharsetUtil;
009    import railo.commons.io.res.Resource;
010    import railo.commons.io.res.ResourceProvider;
011    import railo.commons.io.res.util.ResourceSupport;
012    import railo.commons.io.res.util.ResourceUtil;
013    import railo.runtime.Component;
014    import railo.runtime.PageContext;
015    import railo.runtime.engine.ThreadLocalPageContext;
016    import railo.runtime.exp.PageException;
017    import railo.runtime.exp.PageRuntimeException;
018    import railo.runtime.op.Caster;
019    import railo.runtime.type.dt.DateTime;
020    import railo.runtime.type.dt.DateTimeImpl;
021    
022    public class CFMLResource extends ResourceSupport {
023    
024            private static final long serialVersionUID = 7693378761683536212L;
025            
026            private static final Object[] ZERO_ARGS = new Object[0];
027            private CFMLResourceProvider provider;
028            private Component cfc;
029    
030            public CFMLResource(CFMLResourceProvider provider,Component cfc) {
031                    this.provider=provider;
032                    this.cfc=cfc;
033            }
034    
035            @Override
036            public boolean isReadable() {
037                    return provider.callbooleanRTE(null,cfc,"isReadable",ZERO_ARGS);
038            }
039    
040            @Override
041            public boolean isWriteable() {
042                    return provider.callbooleanRTE(null,cfc,"isWriteable",ZERO_ARGS);
043            }
044    
045            @Override
046            public void remove(boolean force) throws IOException {
047                    provider.callRTE(null,cfc, "remove", new Object[]{force?Boolean.TRUE:Boolean.FALSE});
048            }
049            
050    
051            @Override
052            public boolean exists() {
053                    return provider.callbooleanRTE(null,cfc,"exists",ZERO_ARGS);
054            }
055    
056            @Override
057            public String getName() {
058                    return provider.callStringRTE(null,cfc,"getName",ZERO_ARGS);
059            }
060    
061            @Override
062            public String getParent() {
063                    return provider.callStringRTE(null,cfc,"getParent",ZERO_ARGS);
064            }
065    
066            @Override
067            public Resource getParentResource() {
068                    return provider.callResourceRTE(null, cfc, "getParentResource", ZERO_ARGS,true);
069            }
070    
071            @Override
072            public Resource getRealResource(String realpath) {
073                    return provider.callResourceRTE(null, cfc, "getRealResource", new Object[]{realpath},true);
074            }
075    
076            @Override
077            public String getPath() {
078                    return provider.callStringRTE(null,cfc,"getPath",ZERO_ARGS);
079            }
080    
081            @Override
082            public boolean isAbsolute() {
083                    return provider.callbooleanRTE(null,cfc,"isAbsolute",ZERO_ARGS);
084            }
085    
086            @Override
087            public boolean isDirectory() {
088                    return provider.callbooleanRTE(null,cfc,"isDirectory",ZERO_ARGS);
089            }
090    
091            @Override
092            public boolean isFile() {
093                    return provider.callbooleanRTE(null,cfc,"isFile",ZERO_ARGS);
094            }
095    
096            @Override
097            public long lastModified() {
098                    PageContext pc = ThreadLocalPageContext.get();
099                    try{
100                            DateTime date = Caster.toDate(provider.call(pc,cfc,"lastModified",ZERO_ARGS), true, pc.getTimeZone());
101                            return date.getTime();
102                    }
103                    catch(PageException pe){
104                            throw new PageRuntimeException(pe);
105                    }
106                    
107            }
108    
109            @Override
110            public long length() {
111                    return provider.calllongRTE(null,cfc,"length",ZERO_ARGS);
112            }
113    
114            @Override
115            public Resource[] listResources() {
116                    return provider.callResourceArrayRTE(null, cfc, "listResources", ZERO_ARGS);
117            }
118    
119            @Override
120            public boolean setLastModified(long time) {
121                    PageContext pc = ThreadLocalPageContext.get();
122                    return provider.callbooleanRTE(pc,cfc,"setLastModified",new Object[]{new DateTimeImpl(pc, time, false)});
123            }
124    
125            @Override
126            public boolean setWritable(boolean writable) {
127                    return provider.callbooleanRTE(null,cfc,"setWritable",new Object[]{writable?Boolean.TRUE:Boolean.FALSE});
128            }
129    
130            @Override
131            public boolean setReadable(boolean readable) {
132                    return provider.callbooleanRTE(null,cfc,"setReadable",new Object[]{readable?Boolean.TRUE:Boolean.FALSE});
133            }
134    
135            @Override
136            public void createFile(boolean createParentWhenNotExists) throws IOException {
137                    ResourceUtil.checkCreateFileOK(this,createParentWhenNotExists);
138                    provider.lock(this);
139                    try {
140                            provider.callRTE(null,cfc,"createFile",new Object[]{createParentWhenNotExists?Boolean.TRUE:Boolean.FALSE});
141                    }
142                    finally {
143                            provider.unlock(this);
144                    }
145            }
146            
147            @Override
148            public void createDirectory(boolean createParentWhenNotExists) throws IOException {
149                    ResourceUtil.checkCreateDirectoryOK(this,createParentWhenNotExists);
150                    provider.lock(this);
151                    try {
152                            provider.callRTE(null,cfc,"createDirectory",new Object[]{createParentWhenNotExists?Boolean.TRUE:Boolean.FALSE});
153                    }
154                    finally {
155                            provider.unlock(this);
156                    }
157                    
158            }
159    
160            @Override
161            public InputStream getInputStream() throws IOException {
162                    ResourceUtil.checkGetInputStreamOK(this);
163                    
164                    try {
165                            Object obj;
166                            if(provider.isUseStreams())  
167                                    obj = provider.call(null, cfc, "getInputStream", ZERO_ARGS);
168                            else
169                                    obj = provider.call(null, cfc, "getBinary", ZERO_ARGS);
170                            if(obj==null) obj=new byte[0];
171                            return Caster.toInputStream(obj);
172                    } 
173                    catch (PageException pe) {
174                            throw new PageRuntimeException(pe);
175                    }
176            }
177    
178            @Override
179            public OutputStream getOutputStream(boolean append) throws IOException {
180                    try {
181                            if(provider.isUseStreams()) {
182                                    Object obj = provider.call(null, cfc, "getOutputStream", new Object[]{append?Boolean.TRUE:Boolean.FALSE});
183                                    return Caster.toOutputStream(obj);
184                            }
185                            return new CFMLResourceOutputStream(this);
186                    } 
187                    catch (PageException pe) {
188                            throw new PageRuntimeException(pe);
189                    }
190            }
191            
192            public void setBinary(Object obj) throws PageException {
193                    byte[] barr;
194                    if(obj instanceof CharSequence) {
195                            CharSequence cs=(CharSequence) obj;
196                            String str = cs.toString();
197                            barr=str.getBytes(CharsetUtil.UTF8);
198                    }
199                    else {
200                            barr=Caster.toBinary(obj);
201                    }
202                    provider.call(null, cfc, "setBinary", new Object[]{barr});
203            }
204    
205            @Override
206            public ResourceProvider getResourceProvider() {
207                    return provider;
208            }
209    
210            @Override
211            public int getMode() {
212                    return provider.callintRTE(null,cfc,"getMode",ZERO_ARGS);
213            }
214    
215            @Override
216            public void setMode(int mode) throws IOException {
217                    provider.callRTE(null,cfc,"setMode",new Object[]{Caster.toDouble(mode)});
218            }
219    
220    }