001    package railo.runtime.type.scope;
002    
003    import java.io.UnsupportedEncodingException;
004    
005    import railo.commons.net.URLItem;
006    import railo.runtime.PageContext;
007    import railo.runtime.op.Caster;
008    import railo.runtime.type.Collection;
009    import railo.runtime.type.KeyImpl;
010    import railo.runtime.util.ApplicationContext;
011    
012    /**
013     * Implements URL Scope 
014     */
015    public final class URLImpl extends ScopeSupport implements URL,ScriptProtected {
016    
017            private String encoding=null;
018        private int scriptProtected=ScriptProtected.UNDEFINED;
019        private static final URLItem[] empty=new URLItem[0];
020            private static final Collection.Key REQUEST_TIMEOUT = KeyImpl.intern("RequestTimeout"); 
021        private URLItem[] raw=empty;
022        
023            /**
024             * Standart Constructor
025             */
026            public URLImpl() {
027                    super(true,"url",SCOPE_URL);
028            }
029    
030        /**
031         * @see railo.runtime.type.scope.URL#getEncoding()
032         */
033        public String getEncoding() {
034            return encoding;
035        }
036    
037        /**
038         * @see railo.runtime.type.scope.URL#setEncoding(java.lang.String)
039         */
040        public void setEncoding(String encoding) throws UnsupportedEncodingException {
041            encoding=encoding.trim().toUpperCase();
042            if(encoding.equals(this.encoding)) return;
043            this.encoding = encoding;
044            if(isInitalized())fillDecoded(raw,encoding,isScriptProtected());
045        }
046    
047            /**
048             * @see railo.runtime.type.scope.ScopeSupport#initialize(railo.runtime.PageContext)
049             */
050            public void initialize(PageContext pc) {
051            if(encoding==null)encoding=pc.getConfig().getWebCharset();
052            if(scriptProtected==ScriptProtected.UNDEFINED) {
053                            scriptProtected=((pc.getApplicationContext().getScriptProtect()&ApplicationContext.SCRIPT_PROTECT_URL)>0)?
054                                            ScriptProtected.YES:ScriptProtected.NO;
055                    }
056            
057            try {
058                            super.initialize(pc); 
059                raw=setFromQueryString(pc. getHttpServletRequest().getQueryString());
060                
061                fillDecoded(raw,encoding,isScriptProtected());
062                
063                if(raw.length>0 && pc.getConfig().isAllowURLRequestTimeout()){
064                    Object o=get(REQUEST_TIMEOUT,null);
065                    if(o!=null) {
066                            long timeout = Caster.toLongValue(o,-1);
067                            if(timeout!=-1)pc.setRequestTimeout(timeout*1000);
068                    }
069                    Caster.toDoubleValue(o,-1);
070                }
071                    }
072            catch (Exception e) {}
073            }
074        /**
075         * @see railo.runtime.type.scope.ScopeSupport#release()
076         */
077        public void release() {
078            encoding=null;
079            raw=empty;
080            scriptProtected=ScriptProtected.UNDEFINED;
081            super.release();
082        }
083    
084            /**
085             *
086             * @see railo.runtime.type.scope.URL#setScriptProtecting(boolean)
087             */
088            public void setScriptProtecting(boolean scriptProtected) {
089                    
090                    int _scriptProtected = scriptProtected?ScriptProtected.YES:ScriptProtected.NO;
091                    //print.out(isInitalized()+"x"+(_scriptProtected+"!="+this.scriptProtected));
092                    if(isInitalized() && _scriptProtected!=this.scriptProtected) {
093                            fillDecodedEL(raw,encoding,scriptProtected);
094                    }
095                    this.scriptProtected=_scriptProtected;
096                    /*if(isScriptProtected()) return;
097                    if(scriptProtected) {
098                            if(isInitalized()) {
099                                    fillDecodedEL(raw,encoding,scriptProtected);
100                            }
101                            this.scriptProtected=ScriptProtected.YES;
102                    }
103                    else this.scriptProtected=ScriptProtected.NO;*/
104            }
105            
106    
107            /**
108             *
109             * @see railo.runtime.type.scope.URL#isScriptProtected()
110             */
111            public boolean isScriptProtected() {
112                    return scriptProtected==ScriptProtected.YES;
113            }
114    
115            /**
116             * @return the raw
117             */
118            public URLItem[] getRaw() {
119                    return raw;
120            }
121    }