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    }