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    }