001/** 002 * 003 * Copyright (c) 2014, the Railo Company Ltd. All rights reserved. 004 * 005 * This library is free software; you can redistribute it and/or 006 * modify it under the terms of the GNU Lesser General Public 007 * License as published by the Free Software Foundation; either 008 * version 2.1 of the License, or (at your option) any later version. 009 * 010 * This library is distributed in the hope that it will be useful, 011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 013 * Lesser General Public License for more details. 014 * 015 * You should have received a copy of the GNU Lesser General Public 016 * License along with this library. If not, see <http://www.gnu.org/licenses/>. 017 * 018 **/ 019package lucee.commons.io.res.type.cfml; 020 021import java.io.IOException; 022import java.io.InputStream; 023import java.io.OutputStream; 024 025import lucee.commons.io.CharsetUtil; 026import lucee.commons.io.res.Resource; 027import lucee.commons.io.res.ResourceProvider; 028import lucee.commons.io.res.util.ResourceSupport; 029import lucee.commons.io.res.util.ResourceUtil; 030import lucee.runtime.Component; 031import lucee.runtime.PageContext; 032import lucee.runtime.engine.ThreadLocalPageContext; 033import lucee.runtime.exp.PageException; 034import lucee.runtime.exp.PageRuntimeException; 035import lucee.runtime.op.Caster; 036import lucee.runtime.type.dt.DateTime; 037import lucee.runtime.type.dt.DateTimeImpl; 038 039public class CFMLResource extends ResourceSupport { 040 041 private static final long serialVersionUID = 7693378761683536212L; 042 043 private static final Object[] ZERO_ARGS = new Object[0]; 044 private CFMLResourceProvider provider; 045 private Component cfc; 046 047 public CFMLResource(CFMLResourceProvider provider,Component cfc) { 048 this.provider=provider; 049 this.cfc=cfc; 050 } 051 052 @Override 053 public boolean isReadable() { 054 return provider.callbooleanRTE(null,cfc,"isReadable",ZERO_ARGS); 055 } 056 057 @Override 058 public boolean isWriteable() { 059 return provider.callbooleanRTE(null,cfc,"isWriteable",ZERO_ARGS); 060 } 061 062 @Override 063 public void remove(boolean force) throws IOException { 064 provider.callRTE(null,cfc, "remove", new Object[]{force?Boolean.TRUE:Boolean.FALSE}); 065 } 066 067 068 @Override 069 public boolean exists() { 070 return provider.callbooleanRTE(null,cfc,"exists",ZERO_ARGS); 071 } 072 073 @Override 074 public String getName() { 075 return provider.callStringRTE(null,cfc,"getName",ZERO_ARGS); 076 } 077 078 @Override 079 public String getParent() { 080 return provider.callStringRTE(null,cfc,"getParent",ZERO_ARGS); 081 } 082 083 @Override 084 public Resource getParentResource() { 085 return provider.callResourceRTE(null, cfc, "getParentResource", ZERO_ARGS,true); 086 } 087 088 @Override 089 public Resource getRealResource(String realpath) { 090 return provider.callResourceRTE(null, cfc, "getRealResource", new Object[]{realpath},true); 091 } 092 093 @Override 094 public String getPath() { 095 return provider.callStringRTE(null,cfc,"getPath",ZERO_ARGS); 096 } 097 098 @Override 099 public boolean isAbsolute() { 100 return provider.callbooleanRTE(null,cfc,"isAbsolute",ZERO_ARGS); 101 } 102 103 @Override 104 public boolean isDirectory() { 105 return provider.callbooleanRTE(null,cfc,"isDirectory",ZERO_ARGS); 106 } 107 108 @Override 109 public boolean isFile() { 110 return provider.callbooleanRTE(null,cfc,"isFile",ZERO_ARGS); 111 } 112 113 @Override 114 public long lastModified() { 115 PageContext pc = ThreadLocalPageContext.get(); 116 try{ 117 DateTime date = Caster.toDate(provider.call(pc,cfc,"lastModified",ZERO_ARGS), true, pc.getTimeZone()); 118 return date.getTime(); 119 } 120 catch(PageException pe){ 121 throw new PageRuntimeException(pe); 122 } 123 124 } 125 126 @Override 127 public long length() { 128 return provider.calllongRTE(null,cfc,"length",ZERO_ARGS); 129 } 130 131 @Override 132 public Resource[] listResources() { 133 return provider.callResourceArrayRTE(null, cfc, "listResources", ZERO_ARGS); 134 } 135 136 @Override 137 public boolean setLastModified(long time) { 138 PageContext pc = ThreadLocalPageContext.get(); 139 return provider.callbooleanRTE(pc,cfc,"setLastModified",new Object[]{new DateTimeImpl(pc, time, false)}); 140 } 141 142 @Override 143 public boolean setWritable(boolean writable) { 144 return provider.callbooleanRTE(null,cfc,"setWritable",new Object[]{writable?Boolean.TRUE:Boolean.FALSE}); 145 } 146 147 @Override 148 public boolean setReadable(boolean readable) { 149 return provider.callbooleanRTE(null,cfc,"setReadable",new Object[]{readable?Boolean.TRUE:Boolean.FALSE}); 150 } 151 152 @Override 153 public void createFile(boolean createParentWhenNotExists) throws IOException { 154 ResourceUtil.checkCreateFileOK(this,createParentWhenNotExists); 155 provider.lock(this); 156 try { 157 provider.callRTE(null,cfc,"createFile",new Object[]{createParentWhenNotExists?Boolean.TRUE:Boolean.FALSE}); 158 } 159 finally { 160 provider.unlock(this); 161 } 162 } 163 164 @Override 165 public void createDirectory(boolean createParentWhenNotExists) throws IOException { 166 ResourceUtil.checkCreateDirectoryOK(this,createParentWhenNotExists); 167 provider.lock(this); 168 try { 169 provider.callRTE(null,cfc,"createDirectory",new Object[]{createParentWhenNotExists?Boolean.TRUE:Boolean.FALSE}); 170 } 171 finally { 172 provider.unlock(this); 173 } 174 175 } 176 177 @Override 178 public InputStream getInputStream() throws IOException { 179 ResourceUtil.checkGetInputStreamOK(this); 180 181 try { 182 Object obj; 183 if(provider.isUseStreams()) 184 obj = provider.call(null, cfc, "getInputStream", ZERO_ARGS); 185 else 186 obj = provider.call(null, cfc, "getBinary", ZERO_ARGS); 187 if(obj==null) obj=new byte[0]; 188 return Caster.toInputStream(obj,null); 189 } 190 catch (PageException pe) { 191 throw new PageRuntimeException(pe); 192 } 193 } 194 195 @Override 196 public OutputStream getOutputStream(boolean append) throws IOException { 197 try { 198 if(provider.isUseStreams()) { 199 Object obj = provider.call(null, cfc, "getOutputStream", new Object[]{append?Boolean.TRUE:Boolean.FALSE}); 200 return Caster.toOutputStream(obj); 201 } 202 return new CFMLResourceOutputStream(this); 203 } 204 catch (PageException pe) { 205 throw new PageRuntimeException(pe); 206 } 207 } 208 209 public void setBinary(Object obj) throws PageException { 210 byte[] barr; 211 if(obj instanceof CharSequence) { 212 CharSequence cs=(CharSequence) obj; 213 String str = cs.toString(); 214 barr=str.getBytes(CharsetUtil.UTF8); 215 } 216 else { 217 barr=Caster.toBinary(obj); 218 } 219 provider.call(null, cfc, "setBinary", new Object[]{barr}); 220 } 221 222 @Override 223 public ResourceProvider getResourceProvider() { 224 return provider; 225 } 226 227 @Override 228 public int getMode() { 229 return provider.callintRTE(null,cfc,"getMode",ZERO_ARGS); 230 } 231 232 @Override 233 public void setMode(int mode) throws IOException { 234 provider.callRTE(null,cfc,"setMode",new Object[]{Caster.toDouble(mode)}); 235 } 236 237}