001 package railo.runtime.functions.system; 002 003 import java.util.Iterator; 004 005 import railo.commons.io.res.Resource; 006 import railo.runtime.Component; 007 import railo.runtime.ComponentWrap; 008 import railo.runtime.Mapping; 009 import railo.runtime.PageContext; 010 import railo.runtime.PageContextImpl; 011 import railo.runtime.config.Config; 012 import railo.runtime.config.ConfigImpl; 013 import railo.runtime.db.DataSource; 014 import railo.runtime.exp.PageException; 015 import railo.runtime.listener.AppListenerUtil; 016 import railo.runtime.listener.ApplicationContextPro; 017 import railo.runtime.listener.JavaSettings; 018 import railo.runtime.listener.ModernApplicationContext; 019 import railo.runtime.net.s3.Properties; 020 import railo.runtime.op.Caster; 021 import railo.runtime.orm.ORMConfiguration; 022 import railo.runtime.type.Array; 023 import railo.runtime.type.ArrayImpl; 024 import railo.runtime.type.Collection; 025 import railo.runtime.type.Collection.Key; 026 import railo.runtime.type.KeyImpl; 027 import railo.runtime.type.Struct; 028 import railo.runtime.type.StructImpl; 029 import railo.runtime.type.UDF; 030 import railo.runtime.type.scope.Scope; 031 import railo.runtime.type.scope.Undefined; 032 import railo.runtime.type.util.ArrayUtil; 033 import railo.runtime.type.util.KeyConstants; 034 import railo.runtime.type.util.ListUtil; 035 036 public class GetApplicationSettings { 037 public static Struct call(PageContext pc) { 038 return call(pc, false); 039 } 040 041 public static Struct call(PageContext pc, boolean suppressFunctions) { 042 ApplicationContextPro ac = (ApplicationContextPro) pc.getApplicationContext(); 043 Component cfc = null; 044 if(ac instanceof ModernApplicationContext)cfc= ((ModernApplicationContext)ac).getComponent(); 045 046 Struct sct=new StructImpl(); 047 sct.setEL("applicationTimeout", ac.getApplicationTimeout()); 048 sct.setEL("clientManagement", Caster.toBoolean(ac.isSetClientManagement())); 049 sct.setEL("clientStorage", ac.getClientstorage()); 050 sct.setEL("sessionStorage", ac.getSessionstorage()); 051 sct.setEL("customTagPaths", toArray(ac.getCustomTagMappings())); 052 sct.setEL("loginStorage", AppListenerUtil.translateLoginStorage(ac.getLoginStorage())); 053 sct.setEL(KeyConstants._mappings, toStruct(ac.getMappings())); 054 sct.setEL(KeyConstants._name, ac.getName()); 055 sct.setEL("scriptProtect", AppListenerUtil.translateScriptProtect(ac.getScriptProtect())); 056 sct.setEL("secureJson", Caster.toBoolean(ac.getSecureJson())); 057 sct.setEL("secureJsonPrefix", ac.getSecureJsonPrefix()); 058 sct.setEL("sessionManagement", Caster.toBoolean(ac.isSetSessionManagement())); 059 sct.setEL("sessionTimeout", ac.getSessionTimeout()); 060 sct.setEL("clientTimeout", ac.getClientTimeout()); 061 sct.setEL("setClientCookies", Caster.toBoolean(ac.isSetClientCookies())); 062 sct.setEL("setDomainCookies", Caster.toBoolean(ac.isSetDomainCookies())); 063 sct.setEL(KeyConstants._name, ac.getName()); 064 sct.setEL("localMode", ac.getLocalMode()==Undefined.MODE_LOCAL_OR_ARGUMENTS_ALWAYS?Boolean.TRUE:Boolean.FALSE); 065 sct.setEL("sessionType", ((PageContextImpl) pc).getSessionType()==ConfigImpl.SESSION_TYPE_CFML?"cfml":"j2ee"); 066 sct.setEL("serverSideFormValidation", Boolean.FALSE); // TODO impl 067 068 sct.setEL("clientCluster", Caster.toBoolean(ac.getClientCluster())); 069 sct.setEL("sessionCluster", Caster.toBoolean(ac.getSessionCluster())); 070 071 072 sct.setEL("invokeImplicitAccessor", Caster.toBoolean(ac.getTriggerComponentDataMember())); 073 sct.setEL("triggerDataMember", Caster.toBoolean(ac.getTriggerComponentDataMember())); 074 sct.setEL("sameformfieldsasarray", Caster.toBoolean(ac.getSameFieldAsArray(Scope.SCOPE_FORM))); 075 sct.setEL("sameurlfieldsasarray", Caster.toBoolean(ac.getSameFieldAsArray(Scope.SCOPE_URL))); 076 077 Object ds = ac.getDefDataSource(); 078 if(ds instanceof DataSource) ds=_call((DataSource)ds); 079 else ds=Caster.toString(ds,null); 080 sct.setEL(KeyConstants._datasource, ds); 081 sct.setEL("defaultDatasource", ds); 082 083 Resource src = ac.getSource(); 084 if(src!=null)sct.setEL(KeyConstants._source,src.getAbsolutePath()); 085 086 // orm 087 if(ac.isORMEnabled()){ 088 ORMConfiguration conf = ac.getORMConfiguration(); 089 if(conf!=null)sct.setEL(KeyConstants._orm, conf.toStruct()); 090 } 091 // s3 092 Properties props = ac.getS3(); 093 if(props!=null) { 094 sct.setEL(KeyConstants._s3, props.toStruct()); 095 } 096 097 // datasources 098 DataSource[] sources = ac.getDataSources(); 099 if(!ArrayUtil.isEmpty(sources)){ 100 Struct _sources = new StructImpl(),s; 101 sct.setEL(KeyConstants._datasources, _sources); 102 for(int i=0;i<sources.length;i++){ 103 _sources.setEL(KeyImpl.init(sources[i].getName()), _call(sources[i])); 104 } 105 106 } 107 108 //cache 109 String func = ac.getDefaultCacheName(Config.CACHE_DEFAULT_FUNCTION); 110 String obj = ac.getDefaultCacheName(Config.CACHE_DEFAULT_OBJECT); 111 String qry = ac.getDefaultCacheName(Config.CACHE_DEFAULT_QUERY); 112 String res = ac.getDefaultCacheName(Config.CACHE_DEFAULT_RESOURCE); 113 String tmp = ac.getDefaultCacheName(Config.CACHE_DEFAULT_TEMPLATE); 114 if(func!=null || obj!=null || qry!=null || res!=null || tmp!=null) { 115 Struct cache=new StructImpl(); 116 sct.setEL(KeyConstants._cache, cache); 117 if(func!=null)cache.setEL(KeyConstants._function, func); 118 if(obj!=null)cache.setEL(KeyConstants._object, obj); 119 if(qry!=null)cache.setEL(KeyConstants._query, qry); 120 if(res!=null)cache.setEL(KeyConstants._resource, res); 121 if(tmp!=null)cache.setEL(KeyConstants._template, tmp); 122 } 123 124 // java settings 125 JavaSettings js = ac.getJavaSettings(); 126 StructImpl jsSct = new StructImpl(); 127 jsSct.put("loadCFMLClassPath",js.loadCFMLClassPath()); 128 jsSct.put("reloadOnChange",js.reloadOnChange()); 129 jsSct.put("watchInterval",new Double(js.watchInterval())); 130 jsSct.put("watchExtensions",ListUtil.arrayToList(js.watchedExtensions(),",")); 131 Resource[] reses = js.getResources(); 132 StringBuilder sb=new StringBuilder(); 133 for(int i=0;i<reses.length;i++){ 134 if(i>0)sb.append(','); 135 sb.append(reses[i].getAbsolutePath()); 136 } 137 jsSct.put("loadCFMLClassPath",sb.toString()); 138 sct.put("javaSettings",jsSct); 139 // REST Settings 140 // MUST 141 142 if(cfc!=null){ 143 sct.setEL(KeyConstants._component, cfc.getPageSource().getDisplayPath()); 144 145 try { 146 ComponentWrap cw=ComponentWrap.toComponentWrap(Component.ACCESS_PRIVATE, cfc); 147 Iterator<Key> it = cw.keyIterator(); 148 Collection.Key key; 149 Object value; 150 while(it.hasNext()) { 151 key=it.next(); 152 value=cw.get(key); 153 if(suppressFunctions && value instanceof UDF) continue; 154 if(!sct.containsKey(key))sct.setEL(key, value); 155 } 156 } 157 catch (PageException e) {e.printStackTrace();} 158 } 159 return sct; 160 } 161 162 163 164 private static Struct _call(DataSource source) { 165 Struct s = new StructImpl(); 166 s.setEL(KeyConstants._class, source.getClazz().getName()); 167 if(source.getConnectionLimit()>=0)s.setEL(AppListenerUtil.CONNECTION_LIMIT, Caster.toDouble(source.getConnectionLimit())); 168 if(source.getConnectionTimeout()!=1)s.setEL(AppListenerUtil.CONNECTION_TIMEOUT, Caster.toDouble(source.getConnectionTimeout())); 169 s.setEL(AppListenerUtil.CONNECTION_STRING, source.getDsnTranslated()); 170 if(source.getMetaCacheTimeout() != 60000)s.setEL(AppListenerUtil.META_CACHE_TIMEOUT, Caster.toDouble(source.getMetaCacheTimeout())); 171 s.setEL(KeyConstants._username, source.getUsername()); 172 s.setEL(KeyConstants._password, source.getPassword()); 173 if(source.getTimeZone()!=null)s.setEL(AppListenerUtil.TIMEZONE, source.getTimeZone().getID()); 174 if(source.isBlob())s.setEL(AppListenerUtil.BLOB, source.isBlob()); 175 if(source.isClob())s.setEL(AppListenerUtil.CLOB, source.isClob()); 176 if(source.isReadOnly())s.setEL(AppListenerUtil.READ_ONLY, source.isReadOnly()); 177 if(source.isStorage())s.setEL(AppListenerUtil.STORAGE, source.isStorage()); 178 return s; 179 } 180 181 private static Array toArray(Mapping[] mappings) { 182 Array arr=new ArrayImpl(); 183 if(mappings!=null)for(int i=0;i<mappings.length;i++){ 184 arr.appendEL(mappings[i].getStrPhysical()); 185 } 186 return arr; 187 } 188 189 private static Struct toStruct(Mapping[] mappings) { 190 Struct sct=new StructImpl(); 191 if(mappings!=null)for(int i=0;i<mappings.length;i++){ 192 sct.setEL(KeyImpl.init(mappings[i].getVirtual()), mappings[i].getStrPhysical()); 193 } 194 return sct; 195 } 196 }