package railo.runtime.type.scope; import java.io.File; import railo.commons.io.SystemUtil; import railo.commons.lang.ClassUtil; import railo.commons.lang.StringUtil; import railo.runtime.Info; import railo.runtime.PageContext; import railo.runtime.engine.ThreadLocalPageContext; import railo.runtime.exp.ExpressionException; import railo.runtime.exp.PageException; import railo.runtime.i18n.LocaleFactory; import railo.runtime.instrumentation.InstrumentationUtil; import railo.runtime.op.Caster; import railo.runtime.type.Collection; import railo.runtime.type.KeyImpl; import railo.runtime.type.ReadOnlyStruct; import railo.runtime.type.dt.DateTimeImpl; import railo.runtime.type.util.KeyConstants; /** * Server Scope */ public final class ServerImpl extends ScopeSupport implements Server,SharedScope { private static final DateTimeImpl expired=new DateTimeImpl(2145913200000L,false); private static final Key PRODUCT_NAME = KeyImpl.intern("productname"); private static final Key PRODUCT_LEVEL = KeyImpl.intern("productlevel"); private static final Key PRODUCT_CONTEXT_COUNT = KeyImpl.intern("productcontextcount"); private static final Key PRODUCT_VERSION = KeyImpl.intern("productversion"); private static final Key SERIAL_NUMBER = KeyImpl.intern("serialnumber"); private static final Key APP_SERVER =KeyConstants._appserver; private static final Key EXPIRATION = KeyImpl.intern("expiration"); private static final Key INSTALL_KIT = KeyImpl.intern("installkit"); private static final Key ROOT_DIR = KeyImpl.intern("rootdir"); private static final Key SUPPORTED_LOCALES = KeyImpl.intern("supportedlocales"); private static final Key COLDFUSION= KeyConstants._coldfusion; private static final Key SERVLET= KeyConstants._servlet; private static final Key ARCH= KeyImpl.intern("arch"); private static final Key MAC_ADDRESS= KeyImpl.intern("macAddress"); private static final Key ARCH_MODEL= KeyImpl.intern("archModel"); // private static final Key JAVA_AGENT_PATH = KeyImpl.intern("javaAgentPath"); private static final Key JAVA_EXECUTION_PATH = KeyImpl.intern("executionPath"); private static final Key JAVA_AGENT_SUPPORTED = KeyImpl.intern("javaAgentSupported"); private static final Key LOADER_VERSION= KeyImpl.intern("loaderVersion"); private static final Key LOADER_PATH = KeyImpl.intern("loaderPath"); private static final Key VERSION= KeyConstants._version; private static final Key ADDITIONAL_INFORMATION= KeyImpl.intern("additionalinformation"); private static final Key BUILD_NUMBER = KeyImpl.intern("buildnumber"); private static final Key OS = KeyConstants._os; private static final Key STATE = KeyConstants._state; private static final Key RELEASE_DATE = KeyImpl.intern("release-date"); private static final Key RAILO = KeyConstants._railo; private static final Key FILE = KeyConstants._file; private static final Key SEPARATOR = KeyConstants._separator; private static final Key VENDOR = KeyImpl.intern("vendor"); private static final Key FREE_MEMORY = KeyImpl.intern("freeMemory"); private static final Key MAX_MEMORY = KeyImpl.intern("maxMemory"); private static final Key TOTAL_MEMORY = KeyImpl.intern("totalMemory"); private static final Key JAVA = KeyConstants._java; private static final Key VERSION_NAME = KeyImpl.intern("versionName"); private static final Key VERSION_NAME_EXPLANATION = KeyImpl.intern("versionNameExplanation"); private static String jap; private static String jep; /* Supported CFML Application Blog - http://www.blogcfm.org */ /** * constructor of the server scope * @param pc */ public ServerImpl(PageContext pc) { super(true,"server",SCOPE_SERVER); reload(pc); } @Override public void reload() { reload(ThreadLocalPageContext.get()); } public void reload(PageContext pc) { ReadOnlyStruct coldfusion=new ReadOnlyStruct(); coldfusion.setEL(PRODUCT_LEVEL,Info.getLevel()); //coldfusion.setEL(PRODUCT_CONTEXT_COUNT,"inf"); coldfusion.setEL(PRODUCT_VERSION,"10,0,0,0"); //coldfusion.setEL(PRODUCT_VERSION,"8,0,0,1"); coldfusion.setEL(SERIAL_NUMBER,"0"); coldfusion.setEL(PRODUCT_NAME,"Railo"); // TODO scope server missing values coldfusion.setEL(APP_SERVER,"");// Jrun coldfusion.setEL(EXPIRATION,expired);// coldfusion.setEL(INSTALL_KIT,"");// String rootdir=""; try{ rootdir=ThreadLocalPageContext.getConfig(pc).getRootDirectory().getAbsolutePath(); } catch(Throwable t){} coldfusion.setEL(ROOT_DIR,rootdir);// coldfusion.setEL(SUPPORTED_LOCALES,LocaleFactory.getLocaleList());// coldfusion.setReadOnly(true); super.setEL (COLDFUSION,coldfusion); ReadOnlyStruct os=new ReadOnlyStruct(); os.setEL(KeyConstants._name,System.getProperty("os.name") ); os.setEL(ARCH,System.getProperty("os.arch") ); os.setEL(MAC_ADDRESS,SystemUtil.getMacAddress()); int arch=SystemUtil.getOSArch(); if(arch!=SystemUtil.ARCH_UNKNOW)os.setEL(ARCH_MODEL,new Double(arch) ); os.setEL(VERSION,System.getProperty("os.version") ); os.setEL(ADDITIONAL_INFORMATION,""); os.setEL(BUILD_NUMBER,""); os.setReadOnly(true); super.setEL (OS,os); ReadOnlyStruct railo=new ReadOnlyStruct(); railo.setEL(VERSION,Info.getVersionAsString()); railo.setEL(VERSION_NAME,Info.getVersionName()); railo.setEL(VERSION_NAME_EXPLANATION,Info.getVersionNameExplanation()); railo.setEL(STATE,Info.getStateAsString()); railo.setEL(RELEASE_DATE,Info.getRealeaseDate()); railo.setEL(LOADER_VERSION,Caster.toDouble(SystemUtil.getLoaderVersion())); railo.setEL(LOADER_PATH, ClassUtil.getSourcePathForClass("railo.loader.servlet.CFMLServlet", "")); railo.setReadOnly(true); super.setEL (RAILO,railo); ReadOnlyStruct separator=new ReadOnlyStruct(); separator.setEL(KeyConstants._path,System.getProperty("path.separator")); separator.setEL(FILE,System.getProperty("file.separator")); separator.setEL(KeyConstants._line,System.getProperty("line.separator")); separator.setReadOnly(true); super.setEL (SEPARATOR,separator); ReadOnlyStruct java=new ReadOnlyStruct(); java.setEL(VERSION,System.getProperty("java.version")); java.setEL(VENDOR,System.getProperty("java.vendor")); arch=SystemUtil.getJREArch(); if(arch!=SystemUtil.ARCH_UNKNOW)java.setEL(ARCH_MODEL,new Double(arch) ); Runtime rt = Runtime.getRuntime(); java.setEL(FREE_MEMORY,new Double(rt.freeMemory())); java.setEL(TOTAL_MEMORY,new Double(rt.totalMemory())); java.setEL(MAX_MEMORY,new Double(rt.maxMemory())); java.setEL(JAVA_AGENT_SUPPORTED,Caster.toBoolean(InstrumentationUtil.isSupported())); //if(jap==null) jap=JavaUtil.getSourcePathForClass("railo.runtime.instrumentation.Agent"); //java.setEL(JAVA_AGENT_PATH, jap); if(jep==null) { String temp = System.getProperty( "user.dir", "" ); if ( !StringUtil.isEmpty(temp) && !temp.endsWith( File.separator ) ) temp = temp + File.separator; jep=temp; } java.setEL( JAVA_EXECUTION_PATH, jep ); java.setReadOnly(true); super.setEL (JAVA,java); ReadOnlyStruct servlet=new ReadOnlyStruct(); String name=""; try{ name=pc.getServletContext().getServerInfo(); } catch(Throwable t){} servlet.setEL(KeyConstants._name,name); servlet.setReadOnly(true); super.setEL (SERVLET,servlet); } @Override public Object set(Collection.Key key, Object value) throws PageException { if(isReadOnlyKey(key)) throw new ExpressionException("you can't rewrite key ["+key+"] from server scope, key is readonly"); return super.set (key, value); } @Override public Object setEL(Collection.Key key, Object value) { if(!isReadOnlyKey(key))return super.setEL (key, value); return value; } /** * returns if the key is a readonly key * @param key key to check * @return is readonly */ private boolean isReadOnlyKey(Collection.Key key) { return (key.equals(JAVA) || key.equals(SEPARATOR) || key.equals(OS) || key.equals(COLDFUSION) || key.equals(RAILO)); } public void touchBeforeRequest(PageContext pc) { // do nothing } public void touchAfterRequest(PageContext pc) { // do nothing } }