package railo.runtime.listener; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.TimeZone; import railo.commons.date.TimeZoneUtil; import railo.commons.io.res.Resource; import railo.commons.lang.ClassException; import railo.commons.lang.StringUtil; import railo.commons.lang.types.RefBoolean; import railo.runtime.Component; import railo.runtime.ComponentWrap; import railo.runtime.Mapping; import railo.runtime.PageContext; import railo.runtime.component.Member; import railo.runtime.config.Config; import railo.runtime.config.ConfigImpl; import railo.runtime.config.ConfigWeb; import railo.runtime.db.DataSource; import railo.runtime.exp.DeprecatedException; import railo.runtime.exp.PageException; import railo.runtime.exp.PageRuntimeException; import railo.runtime.i18n.LocaleFactory; import railo.runtime.net.s3.Properties; import railo.runtime.op.Caster; import railo.runtime.op.Decision; import railo.runtime.orm.ORMConfiguration; import railo.runtime.orm.ORMConfigurationImpl; import railo.runtime.rest.RestSettingImpl; import railo.runtime.rest.RestSettings; import railo.runtime.type.Array; import railo.runtime.type.ArrayImpl; import railo.runtime.type.Collection; import railo.runtime.type.Collection.Key; import railo.runtime.type.KeyImpl; import railo.runtime.type.Struct; import railo.runtime.type.StructImpl; import railo.runtime.type.cfc.ComponentAccess; import railo.runtime.type.dt.TimeSpan; import railo.runtime.type.scope.Scope; import railo.runtime.type.util.CollectionUtil; import railo.runtime.type.util.KeyConstants; public class ModernApplicationContext extends ApplicationContextSupport { private static final long serialVersionUID = -8230105685329758613L; private static final Collection.Key APPLICATION_TIMEOUT = KeyConstants._applicationTimeout; private static final Collection.Key CLIENT_MANAGEMENT = KeyConstants._clientManagement; private static final Collection.Key CLIENT_STORAGE = KeyImpl.intern("clientStorage"); private static final Collection.Key SESSION_STORAGE = KeyImpl.intern("sessionStorage"); private static final Collection.Key LOGIN_STORAGE = KeyImpl.intern("loginStorage"); private static final Collection.Key SESSION_TYPE = KeyImpl.intern("sessionType"); private static final Collection.Key TRIGGER_DATA_MEMBER = KeyImpl.intern("triggerDataMember"); private static final Collection.Key INVOKE_IMPLICIT_ACCESSOR = KeyImpl.intern("InvokeImplicitAccessor"); private static final Collection.Key SESSION_MANAGEMENT = KeyImpl.intern("sessionManagement"); private static final Collection.Key SESSION_TIMEOUT = KeyImpl.intern("sessionTimeout"); private static final Collection.Key CLIENT_TIMEOUT = KeyImpl.intern("clientTimeout"); private static final Collection.Key SET_CLIENT_COOKIES = KeyImpl.intern("setClientCookies"); private static final Collection.Key SET_DOMAIN_COOKIES = KeyImpl.intern("setDomainCookies"); private static final Collection.Key SCRIPT_PROTECT = KeyImpl.intern("scriptProtect"); private static final Collection.Key CUSTOM_TAG_PATHS = KeyImpl.intern("customtagpaths"); private static final Collection.Key COMPONENT_PATHS = KeyImpl.intern("componentpaths"); private static final Collection.Key SECURE_JSON_PREFIX = KeyImpl.intern("secureJsonPrefix"); private static final Collection.Key SECURE_JSON = KeyImpl.intern("secureJson"); private static final Collection.Key LOCAL_MODE = KeyImpl.intern("localMode"); private static final Collection.Key BUFFER_OUTPUT = KeyImpl.intern("bufferOutput"); private static final Collection.Key SESSION_CLUSTER = KeyImpl.intern("sessionCluster"); private static final Collection.Key CLIENT_CLUSTER = KeyImpl.intern("clientCluster"); private static final Collection.Key DEFAULT_DATA_SOURCE = KeyImpl.intern("defaultdatasource"); private static final Collection.Key ORM_ENABLED = KeyImpl.intern("ormenabled"); private static final Collection.Key ORM_SETTINGS = KeyImpl.intern("ormsettings"); private static final Collection.Key IN_MEMORY_FILESYSTEM = KeyImpl.intern("inmemoryfilesystem"); private static final Collection.Key REST_SETTING = KeyImpl.intern("restsettings"); private static final Collection.Key JAVA_SETTING = KeyImpl.intern("javasettings"); private ComponentAccess component; private ConfigWeb config; private String name=null; private boolean setClientCookies; private boolean setDomainCookies; private boolean setSessionManagement; private boolean setClientManagement; private TimeSpan sessionTimeout; private TimeSpan clientTimeout; private TimeSpan applicationTimeout; private int loginStorage=Scope.SCOPE_COOKIE; private int scriptProtect; private Object defaultDataSource; private boolean bufferOutput; private short sessionType; private boolean sessionCluster; private boolean clientCluster; private String clientStorage; private String sessionStorage; private String secureJsonPrefix="//"; private boolean secureJson; private Mapping[] mappings; private Mapping[] ctmappings; private Mapping[] cmappings; private DataSource[] dataSources; private Properties s3; private boolean triggerComponentDataMember; private Map<Integer,String> defaultCaches; private Map<Integer,Boolean> sameFieldAsArrays; private boolean initApplicationTimeout; private boolean initSessionTimeout; private boolean initClientTimeout; private boolean initSetClientCookies; private boolean initSetClientManagement; private boolean initSetDomainCookies; private boolean initSetSessionManagement; private boolean initScriptProtect; private boolean initClientStorage; private boolean initSecureJsonPrefix; private boolean initSecureJson; private boolean initSessionStorage; private boolean initSessionCluster; private boolean initClientCluster; private boolean initLoginStorage; private boolean initSessionType; private boolean initTriggerComponentDataMember; private boolean initMappings; private boolean initDataSources; private boolean initDefaultCaches; private boolean initSameFieldAsArrays; private boolean initCTMappings; private boolean initCMappings; private int localMode; private boolean initLocalMode; private boolean initBufferOutput; private boolean initS3; private boolean ormEnabled; private ORMConfiguration ormConfig; private boolean initRestSetting; private RestSettings restSetting; private boolean initJavaSettings; private JavaSettings javaSettings; private Object ormDatasource; private Locale locale; private boolean initLocale; private TimeZone timeZone; private boolean initTimeZone; private Resource[] restCFCLocations; public ModernApplicationContext(PageContext pc, ComponentAccess cfc, RefBoolean throwsErrorWhileInit) { config = pc.getConfig(); setClientCookies=config.isClientCookies(); setDomainCookies=config.isDomainCookies(); setSessionManagement=config.isSessionManagement(); setClientManagement=config.isClientManagement(); sessionTimeout=config.getSessionTimeout(); clientTimeout=config.getClientTimeout(); applicationTimeout=config.getApplicationTimeout(); scriptProtect=config.getScriptProtect(); this.defaultDataSource=config.getDefaultDataSource(); this.localMode=config.getLocalMode(); this.locale=config.getLocale(); this.timeZone=config.getTimeZone(); this.bufferOutput=((ConfigImpl)config).getBufferOutput(); this.sessionType=config.getSessionType(); this.sessionCluster=config.getSessionCluster(); this.clientCluster=config.getClientCluster(); this.sessionStorage=((ConfigImpl)config).getSessionStorage(); this.clientStorage=((ConfigImpl)config).getClientStorage(); this.triggerComponentDataMember=config.getTriggerComponentDataMember(); this.restSetting=config.getRestSetting(); this.javaSettings=new JavaSettingsImpl(); this.component=cfc; pc.addPageSource(component.getPageSource(), true); try { /////////// ORM ///////////////////////////////// reinitORM(pc); throwsErrorWhileInit.setValue(false); } catch(Throwable t) { throwsErrorWhileInit.setValue(true); pc.removeLastPageSource(true); } } public void reinitORM(PageContext pc) throws PageException { // datasource Object o = get(component,KeyConstants._datasource,null); if(o!=null) { this.ormDatasource=this.defaultDataSource = toDefaultDatasource(o); } // default datasource o=get(component,DEFAULT_DATA_SOURCE,null); if(o!=null) this.defaultDataSource =toDefaultDatasource(o); // ormenabled o = get(component,ORM_ENABLED,null); if(o!=null && Caster.toBooleanValue(o,false)){ this.ormEnabled=true; // settings o=get(component,ORM_SETTINGS,null); Struct settings; if(o instanceof Struct) settings=(Struct) o; else settings=new StructImpl(); AppListenerUtil.setORMConfiguration(pc, this, settings); } } public static Object toDefaultDatasource(Object o) throws PageException { if(Decision.isStruct(o)) { Struct sct=(Struct) o; // fix for Jira ticket RAILO-1931 if(sct.size()==1) { Key[] keys = CollectionUtil.keys(sct); if(keys.length==1 && keys[0].equalsIgnoreCase(KeyConstants._name)) { return Caster.toString(sct.get(KeyConstants._name)); } } try { return AppListenerUtil.toDataSource("__default__",sct); } catch (PageException pe) { // again try fix for Jira ticket RAILO-1931 String name= Caster.toString(sct.get(KeyConstants._name,null),null); if(!StringUtil.isEmpty(name)) return name; throw pe; } catch (ClassException e) { throw Caster.toPageException(e); } } return Caster.toString(o); } @Override public boolean hasName() { return true;//!StringUtil.isEmpty(getName()); } @Override public String getName() { if(this.name==null) { this.name=Caster.toString(get(component,KeyConstants._name,""),""); } return name; } @Override public int getLoginStorage() { if(!initLoginStorage) { String str=null; Object o = get(component,LOGIN_STORAGE,null); if(o!=null){ str=Caster.toString(o,null); if(str!=null)loginStorage=AppListenerUtil.translateLoginStorage(str,loginStorage); } initLoginStorage=true; } return loginStorage; } @Override public TimeSpan getApplicationTimeout() { if(!initApplicationTimeout) { Object o=get(component,APPLICATION_TIMEOUT,null); if(o!=null)applicationTimeout=Caster.toTimespan(o,applicationTimeout); initApplicationTimeout=true; } return applicationTimeout; } @Override public TimeSpan getSessionTimeout() { if(!initSessionTimeout) { Object o=get(component,SESSION_TIMEOUT,null); if(o!=null)sessionTimeout=Caster.toTimespan(o,sessionTimeout); initSessionTimeout=true; } return sessionTimeout; } @Override public TimeSpan getClientTimeout() { if(!initClientTimeout) { Object o=get(component,CLIENT_TIMEOUT,null); if(o!=null)clientTimeout=Caster.toTimespan(o,clientTimeout); initClientTimeout=true; } return clientTimeout; } @Override public boolean isSetClientCookies() { if(!initSetClientCookies) { Object o = get(component,SET_CLIENT_COOKIES,null); if(o!=null)setClientCookies=Caster.toBooleanValue(o,setClientCookies); initSetClientCookies=true; } return setClientCookies; } @Override public boolean isSetClientManagement() { if(!initSetClientManagement) { Object o = get(component,CLIENT_MANAGEMENT,null); if(o!=null)setClientManagement=Caster.toBooleanValue(o,setClientManagement); initSetClientManagement=true; } return setClientManagement; } @Override public boolean isSetDomainCookies() { if(!initSetDomainCookies) { Object o = get(component,SET_DOMAIN_COOKIES,null); if(o!=null)setDomainCookies=Caster.toBooleanValue(o,setDomainCookies); initSetDomainCookies=true; } return setDomainCookies; } @Override public boolean isSetSessionManagement() { if(!initSetSessionManagement) { Object o = get(component,SESSION_MANAGEMENT,null); if(o!=null)setSessionManagement=Caster.toBooleanValue(o,setSessionManagement); initSetSessionManagement=true; } return setSessionManagement; } @Override public String getClientstorage() { if(!initClientStorage) { String str=Caster.toString(get(component,CLIENT_STORAGE,null),null); if(!StringUtil.isEmpty(str))clientStorage=str; initClientStorage=true; } return clientStorage; } @Override public int getScriptProtect() { if(!initScriptProtect) { String str=null; Object o = get(component,SCRIPT_PROTECT,null); if(o!=null){ str=Caster.toString(o,null); if(str!=null)scriptProtect=AppListenerUtil.translateScriptProtect(str); } initScriptProtect=true; } return scriptProtect; } @Override public String getSecureJsonPrefix() { if(!initSecureJsonPrefix) { Object o=get(component,SECURE_JSON_PREFIX,null); if(o!=null)secureJsonPrefix=Caster.toString(o,secureJsonPrefix); initSecureJsonPrefix=true; } return secureJsonPrefix; } @Override public boolean getSecureJson() { if(!initSecureJson) { Object o = get(component,SECURE_JSON,null); if(o!=null)secureJson=Caster.toBooleanValue(o,secureJson); initSecureJson=true; } return secureJson; } @Override public String getSessionstorage() { if(!initSessionStorage) { String str=Caster.toString(get(component,SESSION_STORAGE,null),null); if(!StringUtil.isEmpty(str))sessionStorage=str; initSessionStorage=true; } return sessionStorage; } @Override public boolean getSessionCluster() { if(!initSessionCluster) { Object o = get(component,SESSION_CLUSTER,null); if(o!=null)sessionCluster=Caster.toBooleanValue(o,sessionCluster); initSessionCluster=true; } return sessionCluster; } @Override public boolean getClientCluster() { if(!initClientCluster) { Object o = get(component,CLIENT_CLUSTER,null); if(o!=null)clientCluster=Caster.toBooleanValue(o,clientCluster); initClientCluster=true; } return clientCluster; } @Override public short getSessionType() { if(!initSessionType) { String str=null; Object o = get(component,SESSION_TYPE,null); if(o!=null){ str=Caster.toString(o,null); if(str!=null)sessionType=AppListenerUtil.toSessionType(str, sessionType); } initSessionType=true; } return sessionType; } @Override public boolean getTriggerComponentDataMember() { if(!initTriggerComponentDataMember) { Boolean b=null; Object o = get(component,INVOKE_IMPLICIT_ACCESSOR,null); if(o==null)o = get(component,TRIGGER_DATA_MEMBER,null); if(o!=null){ b=Caster.toBoolean(o,null); if(b!=null)triggerComponentDataMember=b.booleanValue(); } initTriggerComponentDataMember=true; } return triggerComponentDataMember; } @Override public void setTriggerComponentDataMember(boolean triggerComponentDataMember) { initTriggerComponentDataMember=true; this.triggerComponentDataMember=triggerComponentDataMember; } @Override public boolean getSameFieldAsArray(int scope) { if(!initSameFieldAsArrays) { if(sameFieldAsArrays==null)sameFieldAsArrays=new HashMap<Integer, Boolean>(); // Form Object o = get(component,KeyImpl.init("sameformfieldsasarray"),null); if(o!=null && Decision.isBoolean(o)) sameFieldAsArrays.put(Scope.SCOPE_FORM, Caster.toBooleanValue(o,false)); // URL o = get(component,KeyImpl.init("sameurlfieldsasarray"),null); if(o!=null && Decision.isBoolean(o)) sameFieldAsArrays.put(Scope.SCOPE_URL, Caster.toBooleanValue(o,false)); initSameFieldAsArrays=true; } return Caster.toBooleanValue(sameFieldAsArrays.get(scope),false); } @Override public String getDefaultCacheName(int type) { if(!initDefaultCaches) { boolean hasResource=false; if(defaultCaches==null)defaultCaches=new HashMap<Integer, String>(); Object o = get(component,KeyConstants._cache,null); if(o!=null && Decision.isStruct(o)){ Struct sct = Caster.toStruct(o,null); if(sct!=null){ // Function String name=Caster.toString(sct.get(KeyConstants._function,null),null); if(!StringUtil.isEmpty(name,true)) defaultCaches.put(Config.CACHE_DEFAULT_FUNCTION, name.trim()); // Query name=Caster.toString(sct.get(KeyConstants._query,null),null); if(!StringUtil.isEmpty(name,true)) defaultCaches.put(Config.CACHE_DEFAULT_QUERY, name.trim()); // Template name=Caster.toString(sct.get(KeyConstants._template,null),null); if(!StringUtil.isEmpty(name,true)) defaultCaches.put(Config.CACHE_DEFAULT_TEMPLATE, name.trim()); // Object name=Caster.toString(sct.get(KeyConstants._object,null),null); if(!StringUtil.isEmpty(name,true)) defaultCaches.put(Config.CACHE_DEFAULT_OBJECT, name.trim()); // Resource name=Caster.toString(sct.get(KeyConstants._resource,null),null); if(!StringUtil.isEmpty(name,true)) { defaultCaches.put(Config.CACHE_DEFAULT_RESOURCE, name.trim()); hasResource=true; } } } // check alias inmemoryfilesystem if(!hasResource) { String str = Caster.toString(get(component,IN_MEMORY_FILESYSTEM,null),null); if(!StringUtil.isEmpty(str,true)) { defaultCaches.put(Config.CACHE_DEFAULT_RESOURCE, str.trim()); } } initDefaultCaches=true; } return defaultCaches.get(type); } @Override public void setDefaultCacheName(int type, String cacheName) { if(StringUtil.isEmpty(cacheName,true)) return; initDefaultCaches=true; if(defaultCaches==null)defaultCaches=new HashMap<Integer, String>(); defaultCaches.put(type, cacheName.trim()); } @Override public Mapping[] getMappings() { if(!initMappings) { Object o = get(component,KeyConstants._mappings,null); if(o!=null)mappings=AppListenerUtil.toMappings(config,o,mappings,getSource()); initMappings=true; } return mappings; } @Override public Mapping[] getCustomTagMappings() { if(!initCTMappings) { Object o = get(component,CUSTOM_TAG_PATHS,null); if(o!=null)ctmappings=AppListenerUtil.toCustomTagMappings(config,o,ctmappings); initCTMappings=true; } return ctmappings; } @Override public Mapping[] getComponentMappings() { if(!initCMappings) { Object o = get(component,COMPONENT_PATHS,null); if(o!=null)cmappings=AppListenerUtil.toCustomTagMappings(config,o,cmappings); initCMappings=true; } return cmappings; } @Override public int getLocalMode() { if(!initLocalMode) { Object o = get(component,LOCAL_MODE,null); if(o!=null)localMode=AppListenerUtil.toLocalMode(o, localMode); initLocalMode=true; } return localMode; } @Override public Locale getLocale() { if(!initLocale) { Object o = get(component,KeyConstants._locale,null); if(o!=null){ String str = Caster.toString(o,null); if(!StringUtil.isEmpty(str))locale=LocaleFactory.getLocale(str,locale); } initLocale=true; } return locale; } @Override public TimeZone getTimeZone() { if(!initTimeZone) { Object o = get(component,KeyConstants._timezone,null); if(o!=null){ String str = Caster.toString(o,null); if(!StringUtil.isEmpty(str))timeZone=TimeZoneUtil.toTimeZone(str,timeZone); } initTimeZone=true; } return timeZone; } public boolean getBufferOutput() { boolean bo = _getBufferOutput(); return bo; } public boolean _getBufferOutput() { if(!initBufferOutput) { Object o = get(component,BUFFER_OUTPUT,null); if(o!=null)bufferOutput=Caster.toBooleanValue(o, bufferOutput); initBufferOutput=true; } return bufferOutput; } @Override public Properties getS3() { if(!initS3) { Object o = get(component,KeyConstants._s3,null); if(o!=null && Decision.isStruct(o))s3=AppListenerUtil.toS3(Caster.toStruct(o,null)); initS3=true; } return s3; } @Override public String getDefaultDataSource() { throw new PageRuntimeException(new DeprecatedException("this method is no longer supported!")); } @Override public Object getDefDataSource() { return defaultDataSource; } @Override public DataSource[] getDataSources() { if(!initDataSources) { Object o = get(component,KeyConstants._datasources,null); // if "this.datasources" does not exists, check if "this.datasource" exists and contains a struct if(o==null){ o = get(component,KeyConstants._datasource,null); if(!Decision.isStruct(o)) o=null; } if(o!=null)dataSources=AppListenerUtil.toDataSources(o,dataSources); initDataSources=true; } return dataSources; } @Override public boolean isORMEnabled() { return this.ormEnabled; } @Override public String getORMDatasource() { throw new PageRuntimeException(new DeprecatedException("this method is no longer supported!")); } @Override public Object getORMDataSource() { return ormDatasource; } @Override public ORMConfiguration getORMConfiguration() { return ormConfig; } public ComponentAccess getComponent() { return component; } public Object getCustom(Key key) { try { ComponentWrap cw=ComponentWrap.toComponentWrap(Component.ACCESS_PRIVATE, component); return cw.get(key,null); } catch (Throwable t) {} return null; } private static Object get(ComponentAccess app, Key name,String defaultValue) { Member mem = app.getMember(Component.ACCESS_PRIVATE, name, true, false); if(mem==null) return defaultValue; return mem.getValue(); } //////////////////////// SETTERS ///////////////////////// @Override public void setApplicationTimeout(TimeSpan applicationTimeout) { initApplicationTimeout=true; this.applicationTimeout=applicationTimeout; } @Override public void setSessionTimeout(TimeSpan sessionTimeout) { initSessionTimeout=true; this.sessionTimeout=sessionTimeout; } @Override public void setClientTimeout(TimeSpan clientTimeout) { initClientTimeout=true; this.clientTimeout=clientTimeout; } @Override public void setClientstorage(String clientstorage) { initClientStorage=true; this.clientStorage=clientstorage; } @Override public void setSessionstorage(String sessionstorage) { initSessionStorage=true; this.sessionStorage=sessionstorage; } @Override public void setCustomTagMappings(Mapping[] customTagMappings) { initCTMappings=true; this.ctmappings=customTagMappings; } @Override public void setComponentMappings(Mapping[] componentMappings) { initCMappings=true; this.cmappings=componentMappings; } @Override public void setMappings(Mapping[] mappings) { initMappings=true; this.mappings=mappings; } public void setDataSources(DataSource[] dataSources) { initDataSources=true; this.dataSources=dataSources; } @Override public void setLoginStorage(int loginStorage) { initLoginStorage=true; this.loginStorage=loginStorage; } @Override public void setDefaultDataSource(String datasource) { this.defaultDataSource=datasource; } @Override public void setDefDataSource(Object datasource) { this.defaultDataSource=datasource; } @Override public void setScriptProtect(int scriptrotect) { initScriptProtect=true; this.scriptProtect=scriptrotect; } @Override public void setSecureJson(boolean secureJson) { initSecureJson=true; this.secureJson=secureJson; } @Override public void setSecureJsonPrefix(String secureJsonPrefix) { initSecureJsonPrefix=true; this.secureJsonPrefix=secureJsonPrefix; } @Override public void setSetClientCookies(boolean setClientCookies) { initSetClientCookies=true; this.setClientCookies=setClientCookies; } @Override public void setSetClientManagement(boolean setClientManagement) { initSetClientManagement=true; this.setClientManagement=setClientManagement; } @Override public void setSetDomainCookies(boolean setDomainCookies) { initSetDomainCookies=true; this.setDomainCookies=setDomainCookies; } @Override public void setSetSessionManagement(boolean setSessionManagement) { initSetSessionManagement=true; this.setSessionManagement=setSessionManagement; } @Override public void setLocalMode(int localMode) { initLocalMode=true; this.localMode=localMode; } @Override public void setLocale(Locale locale) { initLocale=true; this.locale=locale; } @Override public void setTimeZone(TimeZone timeZone) { initTimeZone=true; this.timeZone=timeZone; } public void setBufferOutput(boolean bufferOutput) { initBufferOutput=true; this.bufferOutput=bufferOutput; } @Override public void setSessionType(short sessionType) { initSessionType=true; this.sessionType=sessionType; } @Override public void setClientCluster(boolean clientCluster) { initClientCluster=true; this.clientCluster=clientCluster; } @Override public void setSessionCluster(boolean sessionCluster) { initSessionCluster=true; this.sessionCluster=sessionCluster; } @Override public void setS3(Properties s3) { initS3=true; this.s3=s3; } @Override public void setORMEnabled(boolean ormEnabled) { this.ormEnabled=ormEnabled; } @Override public void setORMConfiguration(ORMConfiguration ormConfig) { this.ormConfig=ormConfig; } @Override public void setORMDatasource(String ormDatasource) { this.ormDatasource=ormDatasource; } @Override public void setORMDataSource(Object ormDatasource) { this.ormDatasource=ormDatasource; } @Override public Resource getSource() { return component.getPageSource().getResource(); } @Override public RestSettings getRestSettings() { initRest(); return restSetting; } @Override public Resource[] getRestCFCLocations() { initRest(); return restCFCLocations; } private void initRest() { if(!initRestSetting) { Object o = get(component,REST_SETTING,null); if(o!=null && Decision.isStruct(o)){ Struct sct = Caster.toStruct(o,null); // cfclocation Object obj = sct.get(KeyConstants._cfcLocation,null); if(obj==null) obj = sct.get(KeyConstants._cfcLocations,null); List<Resource> list = ORMConfigurationImpl.loadCFCLocation(config, null, obj,true); restCFCLocations=list==null?null:list.toArray(new Resource[list.size()]); // skipCFCWithError boolean skipCFCWithError=Caster.toBooleanValue(sct.get(KeyConstants._skipCFCWithError,null),restSetting.getSkipCFCWithError()); // returnFormat int returnFormat=Caster.toIntValue(sct.get(KeyConstants._returnFormat,null),restSetting.getReturnFormat()); restSetting=new RestSettingImpl(skipCFCWithError,returnFormat); } initRestSetting=true; } } @Override public JavaSettings getJavaSettings() { initJava(); return javaSettings; } private void initJava() { if(!initJavaSettings) { Object o = get(component,JAVA_SETTING,null); if(o!=null && Decision.isStruct(o)){ Struct sct = Caster.toStruct(o,null); // loadPaths Object obj = sct.get(KeyImpl.init("loadPaths"),null); List<Resource> paths; if(obj!=null) { paths = ORMConfigurationImpl.loadCFCLocation(config, null, obj,false); } else paths=new ArrayList<Resource>(); // loadCFMLClassPath Boolean loadCFMLClassPath=Caster.toBoolean(sct.get(KeyImpl.init("loadCFMLClassPath"),null),null); if(loadCFMLClassPath==null) loadCFMLClassPath=Caster.toBoolean(sct.get(KeyImpl.init("loadColdFusionClassPath"),null),null); if(loadCFMLClassPath==null)loadCFMLClassPath=javaSettings.loadCFMLClassPath(); // reloadOnChange boolean reloadOnChange=Caster.toBooleanValue(sct.get(KeyImpl.init("reloadOnChange"),null),javaSettings.reloadOnChange()); // watchInterval int watchInterval=Caster.toIntValue(sct.get(KeyImpl.init("watchInterval"),null),javaSettings.watchInterval()); // watchExtensions obj = sct.get(KeyImpl.init("watchExtensions"),null); List<String> extensions=new ArrayList<String>(); if(obj!=null) { Array arr; if(Decision.isArray(obj)) { try { arr = Caster.toArray(obj); } catch (PageException e) { arr=new ArrayImpl(); } } else { arr=railo.runtime.type.util.ListUtil.listToArrayRemoveEmpty(Caster.toString(obj,""), ','); } Iterator<Object> it = arr.valueIterator(); String ext; while(it.hasNext()){ ext=Caster.toString(it.next(),null); if(StringUtil.isEmpty(ext))continue; ext=ext.trim(); if(ext.startsWith("."))ext=ext.substring(1); if(ext.startsWith("*."))ext=ext.substring(2); extensions.add(ext); } } javaSettings=new JavaSettingsImpl( paths.toArray(new Resource[paths.size()]), loadCFMLClassPath,reloadOnChange,watchInterval, extensions.toArray(new String[extensions.size()])); } initJavaSettings=true; } } }