package railo.runtime.tag; import java.util.Locale; import java.util.TimeZone; import railo.commons.date.TimeZoneUtil; import railo.commons.io.res.Resource; import railo.commons.io.res.util.ResourceUtil; import railo.commons.lang.ClassException; import railo.commons.lang.StringUtil; import railo.runtime.Mapping; import railo.runtime.config.Config; import railo.runtime.exp.ApplicationException; import railo.runtime.exp.ExpressionException; import railo.runtime.exp.PageException; import railo.runtime.ext.tag.TagImpl; import railo.runtime.i18n.LocaleFactory; import railo.runtime.listener.AppListenerUtil; import railo.runtime.listener.ApplicationContextPro; import railo.runtime.listener.ClassicApplicationContext; import railo.runtime.listener.ModernApplicationContext; import railo.runtime.op.Caster; import railo.runtime.orm.ORMUtil; import railo.runtime.type.Struct; import railo.runtime.type.UDF; import railo.runtime.type.dt.TimeSpan; import railo.runtime.type.scope.Scope; /** * Defines scoping for a CFML application, enables or disables storing client variables, * and specifies a client variable storage mechanism. * By default, client variables are disabled. Also, enables session variables and sets timeouts * for session and application variables. Session and application variables are stored in memory. * * * **/ public final class Application extends TagImpl { private static final int ACTION_CREATE = 0; private static final int ACTION_UPDATE = 1; private Boolean setClientCookies; private Boolean setDomainCookies; private Boolean setSessionManagement; private String clientstorage; private String sessionstorage; private Boolean setClientManagement; private TimeSpan sessionTimeout; private TimeSpan clientTimeout; private TimeSpan applicationTimeout; private Mapping[] mappings; private Mapping[] customTagMappings; private Mapping[] componentMappings; private String secureJsonPrefix; private Boolean bufferOutput; private Boolean secureJson; private String scriptrotect; private Object datasource; private Object defaultdatasource; private int loginstorage=Scope.SCOPE_UNDEFINED; //ApplicationContextImpl appContext; private String name=""; private int action=ACTION_CREATE; private int localMode=-1; private Locale locale; private TimeZone timeZone; private short sessionType=-1; private boolean sessionCluster; private boolean clientCluster; private boolean ormenabled; private Struct ormsettings; private Struct s3; private Boolean triggerDataMember=null; private String cacheFunction; private String cacheQuery; private String cacheTemplate; private String cacheObject; private String cacheResource; private Struct datasources; private UDF onmissingtemplate; @Override public void release() { super.release(); setClientCookies=null; setDomainCookies=null; setSessionManagement=null; clientstorage=null; sessionstorage=null; setClientManagement=null; sessionTimeout=null; clientTimeout=null; applicationTimeout=null; mappings=null; customTagMappings=null; componentMappings=null; bufferOutput=null; secureJson=null; secureJsonPrefix=null; loginstorage=Scope.SCOPE_UNDEFINED; scriptrotect=null; datasource=null; defaultdatasource=null; datasources=null; this.name=""; action=ACTION_CREATE; localMode=-1; locale=null; timeZone=null; sessionType=-1; sessionCluster=false; clientCluster=false; ormenabled=false; ormsettings=null; s3=null; //appContext=null; triggerDataMember=null; cacheFunction=null; cacheQuery=null; cacheTemplate=null; cacheObject=null; cacheResource=null; onmissingtemplate=null; } /** set the value setclientcookies * Yes or No. Yes enables client cookies. Default is Yes. If you set this attribute to * "No", CFML does not automatically send the CFID and CFTOKEN cookies to the client browser; * you must manually code CFID and CFTOKEN on the URL for every page that uses Session or Client variables. * @param setClientCookies value to set **/ public void setSetclientcookies(boolean setClientCookies) { this.setClientCookies=setClientCookies?Boolean.TRUE:Boolean.FALSE; //getAppContext().setSetClientCookies(setClientCookies); } /** set the value setdomaincookies * Yes or No. Sets the CFID and CFTOKEN cookies for a domain, not just a single host. * Applications that are running on clusters must set this value to Yes. The default is No. * @param setDomainCookies value to set **/ public void setSetdomaincookies(boolean setDomainCookies) { this.setDomainCookies=setDomainCookies?Boolean.TRUE:Boolean.FALSE; //getAppContext().setSetDomainCookies(setDomainCookies); } /** set the value sessionmanagement * Yes or No. Yes enables session variables. Default is No. * @param setSessionManagement value to set **/ public void setSessionmanagement(boolean setSessionManagement) { this.setSessionManagement=setSessionManagement?Boolean.TRUE:Boolean.FALSE; //getAppContext().setSetSessionManagement(setSessionManagement); } /** * @param datasource the datasource to set * @throws PageException */ public void setDatasource(Object datasource) throws PageException { this.datasource = ModernApplicationContext.toDefaultDatasource(datasource); } public void setDefaultdatasource(Object defaultdatasource) throws PageException { this.defaultdatasource = ModernApplicationContext.toDefaultDatasource(defaultdatasource); } public void setDatasources(Struct datasources) { this.datasources = datasources; } public void setLocalmode(String strLocalMode) throws ApplicationException { this.localMode = AppListenerUtil.toLocalMode(strLocalMode); } public void setTimezone(String strTimeZone) throws ExpressionException { if(StringUtil.isEmpty(strTimeZone)) return; this.timeZone = TimeZoneUtil.toTimeZone(strTimeZone); } public void setLocale(String strLocale) throws ExpressionException { if(StringUtil.isEmpty(strLocale)) return; this.locale = LocaleFactory.getLocale(strLocale); } /** set the value clientstorage * Specifies how Railo stores client variables * @param clientstorage value to set **/ public void setClientstorage(String clientstorage) { this.clientstorage=clientstorage; } public void setSessionstorage(String sessionstorage) { this.sessionstorage=sessionstorage; } /** set the value clientmanagement * Yes or No. Enables client variables. Default is No. * @param setClientManagement value to set **/ public void setClientmanagement(boolean setClientManagement) { this.setClientManagement=setClientManagement?Boolean.TRUE:Boolean.FALSE; //getAppContext().setSetClientManagement(setClientManagement); } /** set the value sessiontimeout * Enter the CreateTimeSpan function and values in days, hours, minutes, and seconds, separated * by commas, to specify the lifespan of session variables. * @param sessionTimeout value to set **/ public void setSessiontimeout(TimeSpan sessionTimeout) { this.sessionTimeout=sessionTimeout; } public void setSessiontype(String sessionType) throws ApplicationException { this.sessionType=AppListenerUtil.toSessionType(sessionType); } public void setClientcluster(boolean clientCluster) { this.clientCluster=clientCluster; } public void setSessioncluster(boolean sessionCluster) { this.sessionCluster=sessionCluster; } public void setClienttimeout(TimeSpan clientTimeout) { this.clientTimeout=clientTimeout; } public void setCachefunction(String cacheFunction) { if(StringUtil.isEmpty(cacheFunction,true)) return; this.cacheFunction=cacheFunction.trim(); } public void setCachequery(String cacheQuery) { if(StringUtil.isEmpty(cacheQuery,true)) return; this.cacheQuery=cacheQuery.trim(); } public void setCachetemplate(String cacheTemplate) { if(StringUtil.isEmpty(cacheTemplate,true)) return; this.cacheTemplate=cacheTemplate.trim(); } public void setCacheobject(String cacheObject) { if(StringUtil.isEmpty(cacheObject,true)) return; this.cacheObject=cacheObject.trim(); } public void setCacheresource(String cacheResource) { if(StringUtil.isEmpty(cacheResource,true)) return; this.cacheResource=cacheResource.trim(); } public void setTriggerdatamember(boolean triggerDataMember) { this.triggerDataMember=triggerDataMember?Boolean.TRUE:Boolean.FALSE; } public void setInvokeimplicitaccessor(boolean invokeimplicitaccessor) { setTriggerdatamember(invokeimplicitaccessor); } /** * @param ormenabled the ormenabled to set */ public void setOrmenabled(boolean ormenabled) { this.ormenabled = ormenabled; } /** * @param ormsettings the ormsettings to set */ public void setOrmsettings(Struct ormsettings) { this.ormsettings = ormsettings; } /** * @param s3 the s3 to set */ public void setS3(Struct s3) { this.s3 = s3; } /** set the value applicationtimeout * Enter the CreateTimeSpan function and values in days, hours, minutes, and seconds, separated * by commas, to specify the lifespan of application variables. * @param applicationTimeout value to set **/ public void setApplicationtimeout(TimeSpan applicationTimeout) { this.applicationTimeout=applicationTimeout; //getAppContext().setApplicationTimeout(applicationTimeout); } /** set the value name * The name of your application. This name can be up to 64 characters long. * Required for application and session variables, optional for client variables * @param name value to set **/ public void setName(String name) { this.name=name; } public void setAction(String strAction) throws ApplicationException { strAction=strAction.toLowerCase(); if(strAction.equals("create"))action=ACTION_CREATE; else if(strAction.equals("update")) action=ACTION_UPDATE; else throw new ApplicationException("invalid action definition ["+strAction+"] for tag application, valid values are [create,update]"); } public void setMappings(Struct mappings) throws PageException { this.mappings=AppListenerUtil.toMappings(pageContext.getConfig(), mappings,getSource()); //getAppContext().setMappings(AppListenerUtil.toMappings(pageContext, mappings)); } public void setCustomtagpaths(Object mappings) throws PageException { this.customTagMappings=AppListenerUtil.toCustomTagMappings(pageContext.getConfig(), mappings); } public void setComponentpaths(Object mappings) throws PageException { this.componentMappings=AppListenerUtil.toCustomTagMappings(pageContext.getConfig(), mappings); //getAppContext().setCustomTagMappings(AppListenerUtil.toCustomTagMappings(pageContext, mappings)); } public void setSecurejsonprefix(String secureJsonPrefix) { this.secureJsonPrefix=secureJsonPrefix; //getAppContext().setSecureJsonPrefix(secureJsonPrefix); } public void setSecurejson(boolean secureJson) { this.secureJson=secureJson?Boolean.TRUE:Boolean.FALSE; //getAppContext().setSecureJson(secureJson); } public void setBufferoutput(boolean bufferOutput) { this.bufferOutput=bufferOutput?Boolean.TRUE:Boolean.FALSE; //getAppContext().setSecureJson(secureJson); } /** * @param loginstorage The loginstorage to set. * @throws ApplicationException */ public void setLoginstorage(String loginstorage) throws ApplicationException { loginstorage=loginstorage.toLowerCase(); if(loginstorage.equals("session"))this.loginstorage=Scope.SCOPE_SESSION; else if(loginstorage.equals("cookie"))this.loginstorage=Scope.SCOPE_COOKIE; else throw new ApplicationException("invalid loginStorage definition ["+loginstorage+"] for tag application, valid values are [session,cookie]"); } /** * @param scriptrotect the scriptrotect to set */ public void setScriptprotect(String strScriptrotect) { this.scriptrotect=strScriptrotect; //getAppContext().setScriptProtect(strScriptrotect); } public void setOnmissingtemplate(Object oUDF) throws PageException { this.onmissingtemplate=Caster.toFunction(oUDF); } @Override public int doStartTag() throws PageException { ApplicationContextPro ac; boolean initORM; if(action==ACTION_CREATE){ ac=new ClassicApplicationContext(pageContext.getConfig(),name,false, pageContext.getCurrentPageSource().getResourceTranslated(pageContext)); initORM=set(ac); pageContext.setApplicationContext(ac); } else { ac=(ApplicationContextPro) pageContext.getApplicationContext(); initORM=set(ac); } if(initORM) ORMUtil.resetEngine(pageContext,false); return SKIP_BODY; } private Resource getSource() throws PageException { return ResourceUtil.getResource(pageContext,pageContext.getCurrentPageSource()); } private boolean set(ApplicationContextPro ac) throws PageException { if(applicationTimeout!=null) ac.setApplicationTimeout(applicationTimeout); if(sessionTimeout!=null) ac.setSessionTimeout(sessionTimeout); if(clientTimeout!=null) ac.setClientTimeout(clientTimeout); if(clientstorage!=null) { ac.setClientstorage(clientstorage); } if(sessionstorage!=null) { ac.setSessionstorage(sessionstorage); } if(customTagMappings!=null) ac.setCustomTagMappings(customTagMappings); if(componentMappings!=null) ac.setComponentMappings(componentMappings); if(mappings!=null) ac.setMappings(mappings); if(loginstorage!=Scope.SCOPE_UNDEFINED) ac.setLoginStorage(loginstorage); if(!StringUtil.isEmpty(datasource)) { ac.setDefDataSource(datasource); ac.setORMDataSource(datasource); } if(!StringUtil.isEmpty(defaultdatasource))ac.setDefDataSource(defaultdatasource); if(datasources!=null){ try { ac.setDataSources(AppListenerUtil.toDataSources(datasources)); } catch (ClassException e) { throw Caster.toPageException(e); } } if(onmissingtemplate!=null && ac instanceof ClassicApplicationContext){ ((ClassicApplicationContext)ac).setOnMissingTemplate(onmissingtemplate); } if(scriptrotect!=null) ac.setScriptProtect(AppListenerUtil.translateScriptProtect(scriptrotect)); if(bufferOutput!=null) ac.setBufferOutput(bufferOutput.booleanValue()); if(secureJson!=null) ac.setSecureJson(secureJson.booleanValue()); if(secureJsonPrefix!=null) ac.setSecureJsonPrefix(secureJsonPrefix); if(setClientCookies!=null) ac.setSetClientCookies(setClientCookies.booleanValue()); if(setClientManagement!=null) ac.setSetClientManagement(setClientManagement.booleanValue()); if(setDomainCookies!=null) ac.setSetDomainCookies(setDomainCookies.booleanValue()); if(setSessionManagement!=null) ac.setSetSessionManagement(setSessionManagement.booleanValue()); if(localMode!=-1) ac.setLocalMode(localMode); if(locale!=null) ac.setLocale(locale); if(timeZone!=null) ac.setTimeZone(timeZone); if(sessionType!=-1) ac.setSessionType(sessionType); if(triggerDataMember!=null) ac.setTriggerComponentDataMember(triggerDataMember.booleanValue()); if(cacheFunction!=null) ac.setDefaultCacheName(Config.CACHE_DEFAULT_FUNCTION, cacheFunction); if(cacheObject!=null) ac.setDefaultCacheName(Config.CACHE_DEFAULT_OBJECT, cacheObject); if(cacheQuery!=null) ac.setDefaultCacheName(Config.CACHE_DEFAULT_QUERY, cacheQuery); if(cacheResource!=null) ac.setDefaultCacheName(Config.CACHE_DEFAULT_RESOURCE, cacheResource); if(cacheTemplate!=null) ac.setDefaultCacheName(Config.CACHE_DEFAULT_TEMPLATE, cacheTemplate); ac.setClientCluster(clientCluster); ac.setSessionCluster(sessionCluster); if(s3!=null) ac.setS3(AppListenerUtil.toS3(s3)); // ORM boolean initORM=false; ac.setORMEnabled(ormenabled); if(ormenabled) { initORM=true; AppListenerUtil.setORMConfiguration(pageContext, ac, ormsettings); } return initORM; } @Override public int doEndTag() { return EVAL_PAGE; } }