001 package railo.runtime.type.scope; 002 003 import java.util.Iterator; 004 005 import railo.runtime.PageContext; 006 import railo.runtime.config.NullSupportHelper; 007 import railo.runtime.dump.DumpData; 008 import railo.runtime.dump.DumpProperties; 009 import railo.runtime.exp.ExpressionException; 010 import railo.runtime.exp.PageException; 011 import railo.runtime.op.Duplicator; 012 import railo.runtime.type.Collection; 013 import railo.runtime.type.dt.DateTime; 014 import railo.runtime.type.util.CollectionUtil; 015 import railo.runtime.type.util.KeyConstants; 016 import railo.runtime.type.util.StructSupport; 017 018 /** 019 * caller scope 020 */ 021 public final class CallerImpl extends StructSupport implements Caller { 022 023 private static final long serialVersionUID = -6228400815042475435L; 024 025 private PageContext pc; 026 private Variables variablesScope; 027 private Local localScope; 028 private Argument argumentsScope; 029 private boolean checkArgs; 030 031 032 @Override 033 public Object get(Collection.Key key) throws PageException { 034 035 char c=key.lowerCharAt(0); 036 if('a'==c) { 037 if(KeyConstants._application.equalsIgnoreCase(key)) return pc.applicationScope(); 038 else if(checkArgs && KeyConstants._arguments.equalsIgnoreCase(key)) return argumentsScope;//pc.argumentsScope(); 039 } 040 else if('c'==c) { 041 if(KeyConstants._cgi.equalsIgnoreCase(key)) return pc.cgiScope(); 042 if(KeyConstants._cookie.equalsIgnoreCase(key)) return pc.cookieScope(); 043 if(KeyConstants._client.equalsIgnoreCase(key)) return pc.clientScope(); 044 if(KeyConstants._cluster.equalsIgnoreCase(key)) return pc.clusterScope(); 045 } 046 else if('f'==c) { 047 if(KeyConstants._form.equalsIgnoreCase(key)) return pc.formScope(); 048 } 049 else if('r'==c) { 050 if(KeyConstants._request.equalsIgnoreCase(key)) return pc.requestScope(); 051 } 052 else if('l'==c) { 053 if(KeyConstants._local.equalsIgnoreCase(key) && checkArgs) return localScope;//pc.localScope(); 054 } 055 else if('s'==c) { 056 if(KeyConstants._session.equalsIgnoreCase(key)) return pc.sessionScope(); 057 if(KeyConstants._server.equalsIgnoreCase(key)) return pc.serverScope(); 058 } 059 else if('u'==c) { 060 if(KeyConstants._url.equalsIgnoreCase(key)) return pc.urlScope(); 061 } 062 else if('v'==c) { 063 if(KeyConstants._variables.equalsIgnoreCase(key)) return variablesScope; 064 } 065 066 // upper variable scope 067 Object o; 068 069 if(checkArgs) { 070 o=localScope.get(key,NullSupportHelper.NULL()); 071 if(o!=NullSupportHelper.NULL()) return o; 072 o=argumentsScope.get(key,NullSupportHelper.NULL()); 073 if(o!=NullSupportHelper.NULL()) return o; 074 } 075 o=variablesScope.get(key,NullSupportHelper.NULL()); 076 if(o!=NullSupportHelper.NULL()) return o; 077 078 // get from cascaded scopes 079 o=((UndefinedImpl)pc.undefinedScope()).getCascading(key,NullSupportHelper.NULL()); 080 if(o!=NullSupportHelper.NULL()) return o; 081 082 /* 083 // get scopes 084 if(key.equalsIgnoreCase(VARIABLES)) { 085 return variablesScope;//new StructImpl(getMap()); 086 } 087 088 scope=VariableInterpreter.scopeKey2Int(key); 089 if(scope!=Scope.SCOPE_UNDEFINED) 090 return pc.scope(scope); 091 */ 092 throw new ExpressionException("["+key.getString() +"] not found in caller scope"); 093 } 094 095 @Override 096 public Object get(Collection.Key key, Object defaultValue) { 097 098 char c=key.lowerCharAt(0); 099 if('a'==c) { 100 if(KeyConstants._application.equalsIgnoreCase(key)){ 101 try { 102 return pc.applicationScope(); 103 } 104 catch (PageException e) {} 105 } 106 else if(checkArgs && KeyConstants._arguments.equalsIgnoreCase(key)) return argumentsScope;//pc.argumentsScope(); 107 } 108 else if('c'==c) { 109 if(KeyConstants._cgi.equalsIgnoreCase(key)) return pc.cgiScope(); 110 if(KeyConstants._cookie.equalsIgnoreCase(key)) return pc.cookieScope(); 111 if(KeyConstants._client.equalsIgnoreCase(key)){ 112 try { 113 return pc.clientScope(); 114 } 115 catch (PageException e) {} 116 } 117 if(KeyConstants._cluster.equalsIgnoreCase(key)){ 118 try { 119 return pc.clusterScope(); 120 } 121 catch (PageException e) {} 122 } 123 } 124 else if('f'==c) { 125 if(KeyConstants._form.equalsIgnoreCase(key)) return pc.formScope(); 126 } 127 else if('r'==c) { 128 if(KeyConstants._request.equalsIgnoreCase(key)) return pc.requestScope(); 129 } 130 else if('l'==c) { 131 if(checkArgs && KeyConstants._local.equalsIgnoreCase(key)) return localScope;//pc.localScope(); 132 } 133 else if('s'==c) { 134 if(KeyConstants._session.equalsIgnoreCase(key)){ 135 try { 136 return pc.sessionScope(); 137 } 138 catch (PageException e) {} 139 } 140 if(KeyConstants._server.equalsIgnoreCase(key)){ 141 try { 142 return pc.serverScope(); 143 } 144 catch (PageException e) {} 145 } 146 } 147 else if('u'==c) { 148 if(KeyConstants._url.equalsIgnoreCase(key)) return pc.urlScope(); 149 } 150 else if('v'==c) { 151 if(KeyConstants._variables.equalsIgnoreCase(key)) return variablesScope; 152 } 153 154 155 156 Object o; 157 if(checkArgs) { 158 o=localScope.get(key,NullSupportHelper.NULL()); 159 if(o!=NullSupportHelper.NULL()) return o; 160 o=argumentsScope.get(key,NullSupportHelper.NULL()); 161 if(o!=NullSupportHelper.NULL()) return o; 162 } 163 o=variablesScope.get(key,NullSupportHelper.NULL()); 164 if(o!=NullSupportHelper.NULL()) return o; 165 166 167 // get from cascaded scopes 168 o=((UndefinedImpl)pc.undefinedScope()).getCascading(key,NullSupportHelper.NULL()); 169 if(o!=NullSupportHelper.NULL()) return o; 170 171 return defaultValue; 172 } 173 174 @Override 175 public void initialize(PageContext pc) { 176 this.pc=pc; 177 } 178 179 @Override 180 public void setScope(Variables variablesScope, Local localScope, Argument argumentsScope, boolean checkArgs) { 181 this.variablesScope = variablesScope; 182 this.localScope = localScope; 183 this.argumentsScope = argumentsScope; 184 this.checkArgs = checkArgs; 185 } 186 187 @Override 188 public boolean isInitalized() { 189 return pc!=null; 190 } 191 192 @Override 193 public void release() { 194 this.pc=null; 195 } 196 197 @Override 198 public void release(PageContext pc) { 199 this.pc=null; 200 } 201 202 @Override 203 public int size() { 204 return variablesScope.size(); 205 } 206 207 @Override 208 public Collection.Key[] keys() { 209 return CollectionUtil.keys(this); 210 } 211 212 @Override 213 public Object remove(Collection.Key key) throws PageException { 214 if(checkArgs && localScope.containsKey(key)) 215 return localScope.remove(key); 216 return variablesScope.remove(key); 217 } 218 219 @Override 220 public Object removeEL(Collection.Key key) { 221 if(checkArgs && localScope.containsKey(key)) 222 return localScope.removeEL(key); 223 return variablesScope.removeEL(key); 224 } 225 226 @Override 227 public void clear() { 228 variablesScope.clear(); 229 } 230 231 public Object set(Key key, Object value) throws PageException { 232 if(checkArgs) { 233 if(localScope.containsKey(key)) return localScope.set(key,value); 234 if(argumentsScope.containsKey(key)) return argumentsScope.set(key,value); 235 } 236 return variablesScope.set(key,value); 237 } 238 239 @Override 240 public Object setEL(Key key, Object value) { 241 if(checkArgs) { 242 if(localScope.containsKey(key)) return localScope.setEL(key,value); 243 if(argumentsScope.containsKey(key)) return argumentsScope.setEL(key,value); 244 } 245 return variablesScope.setEL(key,value); 246 } 247 248 @Override 249 public Iterator<Collection.Key> keyIterator() { 250 return variablesScope.keyIterator(); 251 } 252 253 @Override 254 public Iterator<String> keysAsStringIterator() { 255 return variablesScope.keysAsStringIterator(); 256 } 257 258 @Override 259 public Iterator<Entry<Key, Object>> entryIterator() { 260 return variablesScope.entryIterator(); 261 } 262 263 @Override 264 public Iterator<Object> valueIterator() { 265 return variablesScope.valueIterator(); 266 } 267 268 @Override 269 public Collection duplicate(boolean deepCopy) { 270 return (Collection) Duplicator.duplicate(variablesScope,deepCopy); 271 } 272 273 @Override 274 public boolean containsKey(Collection.Key key) { 275 return get(key,null)!=null; 276 } 277 278 @Override 279 public DumpData toDumpData(PageContext pageContext, int maxlevel, DumpProperties dp) { 280 return variablesScope.toDumpData(pageContext, --maxlevel,dp); 281 } 282 283 @Override 284 public String castToString() throws PageException { 285 return variablesScope.castToString(); 286 } 287 288 @Override 289 public String castToString(String defaultValue) { 290 return variablesScope.castToString(defaultValue); 291 } 292 293 @Override 294 public boolean castToBooleanValue() throws PageException { 295 return variablesScope.castToBooleanValue(); 296 } 297 298 @Override 299 public Boolean castToBoolean(Boolean defaultValue) { 300 return variablesScope.castToBoolean(defaultValue); 301 } 302 303 @Override 304 public double castToDoubleValue() throws PageException { 305 return variablesScope.castToDoubleValue(); 306 } 307 308 @Override 309 public double castToDoubleValue(double defaultValue) { 310 return variablesScope.castToDoubleValue(defaultValue); 311 } 312 313 @Override 314 public DateTime castToDateTime() throws PageException { 315 return variablesScope.castToDateTime(); 316 } 317 318 @Override 319 public DateTime castToDateTime(DateTime defaultValue) { 320 return variablesScope.castToDateTime(defaultValue); 321 } 322 323 324 @Override 325 public int compareTo(boolean b) throws PageException { 326 return variablesScope.compareTo(b); 327 } 328 329 @Override 330 public int compareTo(DateTime dt) throws PageException { 331 return variablesScope.compareTo(dt); 332 } 333 334 @Override 335 public int compareTo(double d) throws PageException { 336 return variablesScope.compareTo(d); 337 } 338 339 @Override 340 public int compareTo(String str) throws PageException { 341 return variablesScope.compareTo(str); 342 } 343 344 @Override 345 public int getType() { 346 return SCOPE_CALLER; 347 } 348 349 @Override 350 public String getTypeAsString() { 351 return "caller"; 352 } 353 354 @Override 355 public boolean containsValue(Object value) { 356 return variablesScope.containsValue(value); 357 } 358 359 @Override 360 public java.util.Collection values() { 361 return variablesScope.values(); 362 } 363 364 @Override 365 public Variables getVariablesScope() { 366 return variablesScope; 367 } 368 369 @Override 370 public Local getLocalScope() { 371 return localScope; 372 } 373 374 @Override 375 public Argument getArgumentsScope() { 376 return argumentsScope; 377 } 378 }