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.runtime.listener;
020
021import java.nio.charset.Charset;
022import java.util.HashMap;
023import java.util.Locale;
024import java.util.Map;
025import java.util.TimeZone;
026
027import lucee.commons.io.res.Resource;
028import lucee.commons.lang.StringUtil;
029import lucee.runtime.Mapping;
030import lucee.runtime.PageContext;
031import lucee.runtime.config.ConfigImpl;
032import lucee.runtime.config.ConfigWeb;
033import lucee.runtime.db.DataSource;
034import lucee.runtime.exp.ApplicationException;
035import lucee.runtime.exp.DeprecatedException;
036import lucee.runtime.exp.PageException;
037import lucee.runtime.exp.PageRuntimeException;
038import lucee.runtime.net.s3.Properties;
039import lucee.runtime.net.s3.PropertiesImpl;
040import lucee.runtime.op.Duplicator;
041import lucee.runtime.orm.ORMConfiguration;
042import lucee.runtime.rest.RestSettings;
043import lucee.runtime.type.CustomType;
044import lucee.runtime.type.UDF;
045import lucee.runtime.type.dt.TimeSpan;
046import lucee.runtime.type.scope.FormImpl;
047import lucee.runtime.type.scope.Scope;
048import lucee.runtime.type.scope.URLImpl;
049import lucee.runtime.type.scope.UrlFormImpl;
050import lucee.runtime.type.util.ArrayUtil;
051
052/**
053 * 
054 */
055public class ClassicApplicationContext extends ApplicationContextSupport {
056
057        private static final long serialVersionUID = 940663152793150953L;
058
059        private String name;
060    private boolean setClientCookies;
061    private boolean setDomainCookies;
062    private boolean setSessionManagement;
063    private boolean setClientManagement;
064    private TimeSpan sessionTimeout=null; 
065    private TimeSpan requestTimeout=null; 
066        private TimeSpan clientTimeout;
067    private TimeSpan applicationTimeout=null;
068    private int loginStorage=-1;
069    private String clientstorage;
070    private String sessionstorage;
071        private int scriptProtect;
072    private boolean typeChecking;
073        private Mapping[] mappings;
074        private Mapping[] ctmappings;
075        private Mapping[] cmappings;
076        private boolean bufferOutput;
077        private boolean secureJson;
078        private String secureJsonPrefix="//";
079        private boolean isDefault;
080        private Object defaultDataSource;
081        private boolean ormEnabled;
082        private Object ormdatasource;
083        private ORMConfiguration ormConfig;
084        private Properties s3;
085        
086
087        private int localMode;
088        private Locale locale; 
089        private TimeZone timeZone; 
090        private Charset webCharset; 
091        private Charset resourceCharset;
092        private short sessionType;
093    private boolean sessionCluster;
094    private boolean clientCluster;
095        private Resource source;
096        private boolean triggerComponentDataMember;
097        private Map<Integer,String> defaultCaches=new HashMap<Integer, String>();
098        private Map<Integer,Boolean> sameFieldAsArrays=new HashMap<Integer, Boolean>();
099        private RestSettings restSettings;
100        private Resource[] restCFCLocations;
101        private JavaSettingsImpl javaSettings;
102        private DataSource[] dataSources;
103        private UDF onMissingTemplate;
104
105        private short scopeCascading;
106        private boolean allowCompression;
107        private boolean suppressRemoteComponentContent;
108
109        private short wstype;
110
111        private boolean cgiScopeReadonly;
112    
113    /**
114     * constructor of the class
115     * @param config
116     */
117    public ClassicApplicationContext(ConfigWeb config,String name,boolean isDefault, Resource source) {
118        super(config);
119        this.name=name;
120        setClientCookies=config.isClientCookies();
121        cgiScopeReadonly = ((ConfigImpl)config).getCGIScopeReadonly();
122        setDomainCookies=config.isDomainCookies();
123        setSessionManagement=config.isSessionManagement();
124        setClientManagement=config.isClientManagement();
125        sessionTimeout=config.getSessionTimeout();
126        requestTimeout=config.getRequestTimeout();
127        clientTimeout=config.getClientTimeout();
128        applicationTimeout=config.getApplicationTimeout();
129        loginStorage=Scope.SCOPE_COOKIE;
130        scriptProtect=config.getScriptProtect();
131        typeChecking=((ConfigImpl)config).getTypeChecking();
132        allowCompression=((ConfigImpl)config).allowCompression();
133        this.isDefault=isDefault;
134        this.defaultDataSource=config.getDefaultDataSource();
135        this.localMode=config.getLocalMode();
136        this.locale=config.getLocale();
137        this.timeZone=config.getTimeZone();
138        this.scopeCascading=config.getScopeCascadingType();
139
140        this.webCharset=((ConfigImpl)config)._getWebCharset();
141        this.resourceCharset=((ConfigImpl)config)._getResourceCharset();
142        this.bufferOutput=((ConfigImpl)config).getBufferOutput();
143        suppressRemoteComponentContent=((ConfigImpl)config).isSuppressContent();
144        this.sessionType=config.getSessionType();
145        this.sessionCluster=config.getSessionCluster();
146        this.clientCluster=config.getClientCluster();
147        this.clientstorage=((ConfigImpl)config).getClientStorage();
148        this.sessionstorage=((ConfigImpl)config).getSessionStorage();
149        
150        this.source=source;
151        this.triggerComponentDataMember=config.getTriggerComponentDataMember();
152        this.restSettings=config.getRestSetting();
153        this.javaSettings=new JavaSettingsImpl();
154        this.wstype=WS_TYPE_AXIS1;
155    }
156    
157    /**
158     * Constructor of the class, only used by duplicate method
159     */
160    private ClassicApplicationContext(ConfigWeb config) {
161        super(config);
162    }
163    
164
165        public ApplicationContext duplicate() {
166                ClassicApplicationContext dbl = new ClassicApplicationContext(config);
167                dbl._duplicate(this);
168                
169                dbl.name=name;
170                dbl.setClientCookies=setClientCookies;
171                dbl.cgiScopeReadonly=cgiScopeReadonly;
172                dbl.setDomainCookies=setDomainCookies;
173                dbl.setSessionManagement=setSessionManagement;
174                dbl.setClientManagement=setClientManagement;
175                dbl.sessionTimeout=sessionTimeout;
176                dbl.requestTimeout=requestTimeout;
177                dbl.clientTimeout=clientTimeout;
178                dbl.applicationTimeout=applicationTimeout;
179                dbl.loginStorage=loginStorage;
180                dbl.clientstorage=clientstorage;
181                dbl.sessionstorage=sessionstorage;
182                dbl.scriptProtect=scriptProtect;
183                dbl.typeChecking=typeChecking;
184                dbl.mappings=mappings;
185                dbl.dataSources=dataSources;
186                dbl.ctmappings=ctmappings;
187                dbl.cmappings=cmappings;
188                dbl.bufferOutput=bufferOutput;
189                dbl.allowCompression=allowCompression;
190                dbl.suppressRemoteComponentContent=suppressRemoteComponentContent;
191                dbl.wstype=wstype;
192                dbl.secureJson=secureJson;
193                dbl.secureJsonPrefix=secureJsonPrefix;
194                dbl.isDefault=isDefault;
195                dbl.defaultDataSource=defaultDataSource;
196                dbl.applicationtoken=applicationtoken;
197                dbl.cookiedomain=cookiedomain;
198                dbl.idletimeout=idletimeout;
199                dbl.localMode=localMode;
200                dbl.locale=locale;
201                dbl.timeZone=timeZone;
202                dbl.scopeCascading=scopeCascading;
203                dbl.webCharset=webCharset;
204                dbl.resourceCharset=resourceCharset;
205                dbl.sessionType=sessionType;
206                dbl.triggerComponentDataMember=triggerComponentDataMember;
207                dbl.restSettings=restSettings;
208                dbl.defaultCaches=Duplicator.duplicateMap(defaultCaches, new HashMap<Integer, String>(),false );
209                dbl.sameFieldAsArrays=Duplicator.duplicateMap(sameFieldAsArrays, new HashMap<Integer, Boolean>(),false );
210                
211                dbl.ormEnabled=ormEnabled;
212                dbl.ormConfig=ormConfig;
213                dbl.ormdatasource=ormdatasource;
214                dbl.sessionCluster=sessionCluster;
215                dbl.clientCluster=clientCluster;
216                dbl.source=source;
217                
218                return dbl;
219        }
220
221        @Override
222    public TimeSpan getApplicationTimeout() {
223        return applicationTimeout;
224    }
225    /**
226     * @param applicationTimeout The applicationTimeout to set.
227     */
228    public void setApplicationTimeout(TimeSpan applicationTimeout) {
229        this.applicationTimeout = applicationTimeout;
230    }
231    @Override
232    public int getLoginStorage() {
233        return loginStorage;
234    }
235    /**
236     * @param loginStorage The loginStorage to set.
237     */
238    public void setLoginStorage(int loginStorage) {
239        this.loginStorage = loginStorage;
240    }
241    
242    public void setLoginStorage(String strLoginStorage) throws ApplicationException {
243        setLoginStorage(AppListenerUtil.translateLoginStorage(strLoginStorage));
244    }
245    
246    
247    
248    @Override
249    public String getName() {
250        return name;
251    }
252    /**
253     * @param name The name to set.
254     */
255    public void setName(String name) {
256        this.name = name;
257    }
258    @Override
259    public TimeSpan getSessionTimeout() {
260        return sessionTimeout;
261    }
262    
263    /**
264     * @param sessionTimeout The sessionTimeout to set.
265     */
266    public void setSessionTimeout(TimeSpan sessionTimeout) {
267        this.sessionTimeout = sessionTimeout;
268    }
269
270
271    public TimeSpan getClientTimeout() {
272        return clientTimeout;
273    }
274    
275    /**
276     * @param sessionTimeout The sessionTimeout to set.
277     */
278    public void setClientTimeout(TimeSpan clientTimeout) {
279        this.clientTimeout = clientTimeout;
280    }
281    
282    @Override
283    public boolean isSetClientCookies() {
284        return setClientCookies;
285    }
286    /**
287     * @param setClientCookies The setClientCookies to set.
288     */
289    public void setSetClientCookies(boolean setClientCookies) {
290        this.setClientCookies = setClientCookies;
291    }
292    @Override
293    public boolean isSetClientManagement() {
294        return setClientManagement;
295    }
296    /**
297     * @param setClientManagement The setClientManagement to set.
298     */
299    public void setSetClientManagement(boolean setClientManagement) {
300        this.setClientManagement = setClientManagement;
301    }
302    @Override
303    public boolean isSetDomainCookies() {
304        return setDomainCookies;
305    }
306    /**
307     * @param setDomainCookies The setDomainCookies to set.
308     */
309    public void setSetDomainCookies(boolean setDomainCookies) {
310        this.setDomainCookies = setDomainCookies;
311    }
312    @Override
313    public boolean isSetSessionManagement() {
314        return setSessionManagement;
315    }
316    /**
317     * @param setSessionManagement The setSessionManagement to set.
318     */
319    public void setSetSessionManagement(boolean setSessionManagement) {
320        this.setSessionManagement = setSessionManagement;
321    }
322    @Override
323    public String getClientstorage() {
324        return clientstorage;
325    }
326    public String getSessionstorage() {
327        return sessionstorage;
328    }
329    /**
330     * @param clientstorage The clientstorage to set.
331     */
332    public void setClientstorage(String clientstorage) {
333        if(StringUtil.isEmpty(clientstorage,true)) return;
334        this.clientstorage = clientstorage;
335    }
336    public void setSessionstorage(String sessionstorage) {
337        if(StringUtil.isEmpty(sessionstorage,true)) return;
338        this.sessionstorage = sessionstorage;
339    }
340
341    @Override
342    public boolean hasName() {
343        return name!=null;
344    }
345    
346    /**
347     * @param scriptProtect The scriptProtect to set.
348     */
349    public void setScriptProtect(int scriptProtect) {
350                this.scriptProtect=scriptProtect;
351        }
352
353        @Override
354        public int getScriptProtect() {
355                //if(isDefault)print.err("get:"+scriptProtect);
356                return scriptProtect;
357        }
358    
359    /**
360     * @param scriptProtect The scriptProtect to set.
361     */
362    public void setTypeChecking(boolean typeChecking) {
363                this.typeChecking=typeChecking;
364        }
365
366        @Override
367        public boolean getTypeChecking() {
368                return typeChecking;
369        }
370
371        
372
373
374        public void setMappings(Mapping[] mappings) {
375                if(mappings.length>0)this.mappings=mappings;
376        }
377
378        /**
379         * @return the mappings
380         */
381        public Mapping[] getMappings() {
382                return mappings;
383        }
384
385        public void setCustomTagMappings(Mapping[] ctmappings) {
386                this.ctmappings=ctmappings;
387        }
388
389        public Mapping[] getCustomTagMappings() {
390                return ctmappings;
391        }
392
393        public void setComponentMappings(Mapping[] cmappings) {
394                this.cmappings=cmappings;
395        }
396
397        public Mapping[] getComponentMappings() {
398                return cmappings;
399        }
400
401        public void setSecureJson(boolean secureJson) {
402                this.secureJson=secureJson;
403        }
404
405        /**
406         * @return the secureJson
407         */
408        public boolean getSecureJson() {
409                return secureJson;
410        }
411        
412        public boolean getBufferOutput(){
413                return bufferOutput;
414        }
415        
416        public void setBufferOutput(boolean bufferOutput){
417                this.bufferOutput= bufferOutput;
418        }
419        
420        public void setSecureJsonPrefix(String secureJsonPrefix) {
421                this.secureJsonPrefix=secureJsonPrefix;
422        }
423
424        /**
425         * @return the secureJsonPrefix
426         */
427        public String getSecureJsonPrefix() {
428                return secureJsonPrefix;
429        }
430
431        @Override
432        public String getDefaultDataSource() {
433                throw new PageRuntimeException(new DeprecatedException("this method is no longer supported!"));
434        }
435        
436        @Override
437        public Object getDefDataSource() {
438                return defaultDataSource;
439        }
440
441        @Override
442        public void setDefaultDataSource(String defaultDataSource) {
443                this.defaultDataSource = defaultDataSource;
444        }
445
446        @Override
447        public void setDefDataSource(Object defaultDataSource) {
448                this.defaultDataSource = defaultDataSource;
449        }
450
451        public boolean isORMEnabled() {
452                return ormEnabled;
453        }
454
455        public String getORMDatasource() {
456                throw new PageRuntimeException(new DeprecatedException("this method is no longer supported!"));
457        }
458
459        public Object getORMDataSource() {
460                return ormdatasource;
461        }
462
463        public ORMConfiguration getORMConfiguration() {
464                return ormConfig;
465        }
466        public void setORMConfiguration(ORMConfiguration config) {
467                this.ormConfig= config;
468        }
469
470        public void setORMEnabled(boolean ormEnabled) {
471                this.ormEnabled=ormEnabled;
472        }
473
474        /**
475         * @return the s3
476         */
477        public Properties getS3() {
478                if(s3==null) s3=new PropertiesImpl();
479                return s3;
480        }
481
482        @Override
483        public int getLocalMode() {
484                return localMode;
485        }
486
487        @Override
488        public Locale getLocale() {
489                return locale;
490        }
491
492        @Override
493        public TimeZone getTimeZone() {
494                return timeZone;
495        }
496        
497        @Override
498        public Charset getWebCharset() {
499                return webCharset;
500        }
501        
502        @Override
503        public Charset getResourceCharset() {
504                return resourceCharset;
505        }
506
507        /**
508         * @param localMode the localMode to set
509         */
510        public void setLocalMode(int localMode) {
511                this.localMode = localMode;
512        }
513
514        @Override
515        public void setLocale(Locale locale) {
516                this.locale = locale;
517        }
518
519        @Override
520        public void setTimeZone(TimeZone timeZone) {
521                this.timeZone = timeZone;
522        }
523        
524        @Override
525        public void setWebCharset(Charset webCharset) {
526                this.webCharset= webCharset;
527        }
528        
529        @Override
530        public void setResourceCharset(Charset resourceCharset) {
531                this.resourceCharset = resourceCharset;
532        }
533
534
535
536    /**
537         * @return the sessionType
538         */
539        public short getSessionType() {
540                return sessionType;
541        }
542
543    /**
544         * @return the sessionType
545         */
546        public void setSessionType(short sessionType) {
547                this.sessionType= sessionType;
548        }
549
550
551        /**
552         * @return the sessionCluster
553         */
554        public boolean getSessionCluster() {
555                return sessionCluster;
556        }
557
558
559        /**
560         * @param sessionCluster the sessionCluster to set
561         */
562        public void setSessionCluster(boolean sessionCluster) {
563                this.sessionCluster = sessionCluster;
564        }
565
566
567        /**
568         * @return the clientCluster
569         */
570        public boolean getClientCluster() {
571                return clientCluster;
572        }
573
574
575        /**
576         * @param clientCluster the clientCluster to set
577         */
578        public void setClientCluster(boolean clientCluster) {
579                this.clientCluster = clientCluster;
580        }
581
582
583        public void setS3(Properties s3) {
584                this.s3=s3;
585        }
586
587        @Override
588        public void setORMDatasource(String ormdatasource) {
589                this.ormdatasource=ormdatasource;
590        }
591
592        @Override
593        public void setORMDataSource(Object ormdatasource) {
594                this.ormdatasource=ormdatasource;
595        }
596
597        @Override
598        public void reinitORM(PageContext pc) throws PageException {
599                // do nothing
600        }
601
602        @Override
603        public Resource getSource() {
604                return source;
605        }
606
607        @Override
608        public boolean getTriggerComponentDataMember() {
609                return triggerComponentDataMember;
610        }
611
612        @Override
613        public void setTriggerComponentDataMember(boolean triggerComponentDataMember) {
614                this.triggerComponentDataMember=triggerComponentDataMember;
615        }
616
617        @Override
618        public void setDefaultCacheName(int type,String name) {
619                if(StringUtil.isEmpty(name,true)) return;
620                defaultCaches.put(type, name.trim());
621        }
622        
623        @Override
624        public String getDefaultCacheName(int type) {
625                return defaultCaches.get(type);
626        }
627
628        public void setSameFieldAsArray(PageContext pc,int scope, boolean sameFieldAsArray) {
629                
630                sameFieldAsArrays.put(scope, sameFieldAsArray);
631                
632                if(Scope.SCOPE_URL==scope)reinitScope(pc.urlScope(),this); 
633                else reinitScope(pc.formScope(),this);
634        }
635        
636        
637        public static void reinitScope(Scope scope,ApplicationContext ac) {
638                if(scope instanceof URLImpl ) ((URLImpl)scope).reinitialize(ac);
639                else if(scope instanceof FormImpl ) ((FormImpl)scope).reinitialize(ac);
640                if(scope instanceof UrlFormImpl ) ((UrlFormImpl)scope).reinitialize(ac);
641        }
642
643        @Override
644        public boolean getSameFieldAsArray(int scope) {
645                Boolean b= sameFieldAsArrays.get(scope);
646                if(b==null) return false;
647                return b.booleanValue();
648        }
649
650        @Override
651        public RestSettings getRestSettings() {
652                return restSettings;
653        }
654
655        public void setRestSettings(RestSettings restSettings) {
656                this.restSettings=restSettings;
657        }
658        
659
660        public void setRestCFCLocations(Resource[] restCFCLocations) {
661                this.restCFCLocations = restCFCLocations;
662        }
663
664        @Override
665        public Resource[] getRestCFCLocations() {
666                return restCFCLocations;
667        }
668
669        @Override
670        public JavaSettings getJavaSettings() {
671                return javaSettings;
672        }
673
674        @Override
675        public DataSource[] getDataSources() {
676                return dataSources;
677        }
678
679        @Override
680        public void setDataSources(DataSource[] dataSources) {
681                if(!ArrayUtil.isEmpty(dataSources))this.dataSources=dataSources;
682        }
683
684        public void setOnMissingTemplate(UDF onMissingTemplate) {
685                this.onMissingTemplate=onMissingTemplate;
686        }
687
688        public UDF getOnMissingTemplate() { 
689                return onMissingTemplate;
690        }
691
692        @Override
693        public short getScopeCascading() {
694                return scopeCascading;
695        }
696
697        @Override
698        public void setScopeCascading(short scopeCascading) {
699                this.scopeCascading=scopeCascading;
700        }
701
702        @Override
703        public boolean getAllowCompression() {
704                return allowCompression;
705        }
706
707        @Override
708        public void setAllowCompression(boolean allowCompression) {
709                this.allowCompression=allowCompression;
710        }
711
712        @Override
713        public TimeSpan getRequestTimeout() {
714                return requestTimeout;
715        }
716
717        @Override
718        public void setRequestTimeout(TimeSpan requestTimeout) {
719                this.requestTimeout=requestTimeout;
720        }
721
722        @Override
723        public CustomType getCustomType(String strType) {
724                // not supported
725                return null;
726        }
727
728        @Override
729        public boolean getSuppressContent() {
730                return suppressRemoteComponentContent;
731        }
732
733        @Override
734        public void setSuppressContent(boolean suppressContent) {
735                this.suppressRemoteComponentContent=suppressContent;
736        }
737
738        @Override
739        public short getWSType() {
740                return wstype;
741        }
742
743        @Override
744        public void setWSType(short wstype) {
745                this.wstype=wstype;
746        }
747
748        @Override
749        public boolean getCGIScopeReadonly() {
750                return cgiScopeReadonly;
751        }
752
753        @Override
754        public void setCGIScopeReadonly(boolean cgiScopeReadonly) {
755                this.cgiScopeReadonly=cgiScopeReadonly;
756        }
757}