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