package railo.runtime.engine; import railo.commons.lang.SizeOf; import railo.runtime.CFMLFactory; import railo.runtime.CFMLFactoryImpl; import railo.runtime.Mapping; import railo.runtime.MappingImpl; import railo.runtime.config.Config; import railo.runtime.config.ConfigImpl; import railo.runtime.config.ConfigServer; import railo.runtime.config.ConfigWeb; import railo.runtime.exp.PageException; import railo.runtime.op.Caster; import railo.runtime.query.QueryCacheSupport; import railo.runtime.type.Collection; import railo.runtime.type.DoubleStruct; import railo.runtime.type.KeyImpl; import railo.runtime.type.Struct; import railo.runtime.type.StructImpl; import railo.runtime.type.scope.Scope; import railo.runtime.type.scope.ScopeContext; import railo.runtime.type.util.KeyConstants; class Surveillance { private static final Collection.Key PAGE_POOL = KeyImpl.intern("pagePool"); private static final Collection.Key CLASS_LOADER = KeyImpl.intern("classLoader"); private static final Collection.Key QUERY_CACHE = KeyImpl.intern("queryCache"); private static final Collection.Key PAGE_CONTEXT_STACK = KeyImpl.intern("pageContextStack"); public static Struct getInfo(ConfigImpl config) throws PageException { Struct sct=new StructImpl(); // memory DoubleStruct mem=new DoubleStruct(); sct.set(KeyConstants._memory, mem); getInfoMemory(mem, config); // count //ScopeContext sc = ((CFMLFactoryImpl)config.getFactory()).getScopeContext(); //sc.getSessionCount(pc) return sct; } private static void getInfoMemory(Struct parent, ConfigImpl config) throws PageException { DoubleStruct server = new DoubleStruct(); DoubleStruct web = new DoubleStruct(); parent.set(KeyConstants._server, server); parent.set(KeyConstants._web, web); boolean isConfigWeb=config instanceof ConfigWeb; // server /*ConfigServer cs=isConfigWeb? config.getConfigServerImpl(): ((ConfigServer)config); */ //infoResources(server,cs); // web if(isConfigWeb){ _getInfoMemory(web, server,config); } else { ConfigWeb[] configs = ((ConfigServer) config).getConfigWebs(); for(int i=0;i<configs.length;i++){ _getInfoMemory(web,server, (ConfigImpl) configs[i]); } } } private static void _getInfoMemory(Struct web, Struct server, ConfigImpl config) throws PageException { DoubleStruct sct = new DoubleStruct(); infoMapping(sct,config); //infoResources(sct,config); infoScopes(sct,server,config); infoPageContextStack(sct,config.getFactory()); infoQueryCache(sct,config.getFactory()); //size+=infoResources(sct,cs); web.set(config.getConfigDir().getPath(), sct); } private static void infoMapping(Struct parent,Config config) throws PageException { DoubleStruct map=new DoubleStruct(); infoMapping(map,config.getMappings(),false); infoMapping(map,config.getCustomTagMappings(),true); parent.set(KeyConstants._mappings, map); } private static void infoMapping(Struct map, Mapping[] mappings, boolean isCustomTagMapping) throws PageException { if(mappings==null) return; DoubleStruct sct=new DoubleStruct(); long size; MappingImpl mapping; for(int i=0;i<mappings.length;i++) { mapping=(MappingImpl) mappings[i]; // archive classloader size=SizeOf.size(mapping.getClassLoaderForArchive()); sct.set("archiveClassLoader", Caster.toDouble(size)); // physical classloader size=0; try { size=SizeOf.size(mapping.touchPCLCollection()); } catch (Exception e) {} sct.set("physicalClassLoader", Caster.toDouble(size)); // pagepool size=SizeOf.size(mapping.getPageSourcePool()); sct.set(PAGE_POOL, Caster.toDouble(size)); map.set(!isCustomTagMapping? mapping.getVirtual():mapping.getStrPhysical(), sct); } } private static void infoScopes(Struct web,Struct server,ConfigImpl config) throws PageException { ScopeContext sc = ((CFMLFactoryImpl)config.getFactory()).getScopeContext(); DoubleStruct webScopes=new DoubleStruct(); DoubleStruct srvScopes=new DoubleStruct(); long s; s=sc.getScopesSize(Scope.SCOPE_SESSION); webScopes.set("session", Caster.toDouble(s)); s=sc.getScopesSize(Scope.SCOPE_APPLICATION); webScopes.set("application", Caster.toDouble(s)); s=sc.getScopesSize(Scope.SCOPE_CLUSTER); srvScopes.set("cluster", Caster.toDouble(s)); s=sc.getScopesSize(Scope.SCOPE_SERVER); srvScopes.set("server", Caster.toDouble(s)); s=sc.getScopesSize(Scope.SCOPE_CLIENT); webScopes.set("client", Caster.toDouble(s)); web.set(KeyConstants._scopes, webScopes); server.set(KeyConstants._scopes, srvScopes); } private static void infoQueryCache(Struct parent,CFMLFactory factory) throws PageException { long size= ((QueryCacheSupport)factory.getDefaultQueryCache()).sizeOf(); parent.set(QUERY_CACHE, Caster.toDouble(size)); } private static void infoPageContextStack(Struct parent,CFMLFactory factory) throws PageException { long size= ((CFMLFactoryImpl)factory).getPageContextsSize(); parent.set(PAGE_CONTEXT_STACK, Caster.toDouble(size)); } /*private static void infoResources(Struct parent, Config config) throws PageException { // add server proviers ti a set for checking Set set=new HashSet(); if(config instanceof ConfigWeb){ ConfigServerImpl cs=((ConfigImpl)config).getConfigServerImpl(); ResourceProvider[] providers = cs.getResourceProviders(); for(int i=0;i<providers.length;i++){ set.add(providers[i]); } } ResourceProvider[] providers = ((ConfigImpl)config).getResourceProviders(); DoubleStruct sct=new DoubleStruct(); long s; for(int i=0;i<providers.length;i++){ if(!set.contains(providers[i])){ s=SizeOf.size(providers[i]); sct.set(providers[i].getScheme(), Caster.toDouble(s)); } } parent.set("resourceProviders", sct); }*/ }