001 package railo.runtime.config; 002 003 import java.io.IOException; 004 import java.io.PrintWriter; 005 import java.util.HashMap; 006 import java.util.Map; 007 008 import org.w3c.dom.Document; 009 import org.w3c.dom.Element; 010 import org.xml.sax.SAXException; 011 012 import railo.commons.io.IOUtil; 013 import railo.commons.io.SystemUtil; 014 import railo.commons.io.res.Resource; 015 import railo.commons.io.res.type.file.FileResource; 016 import railo.commons.io.res.util.ResourceUtil; 017 import railo.commons.lang.ClassException; 018 import railo.commons.lang.SystemOut; 019 import railo.runtime.CFMLFactory; 020 import railo.runtime.engine.CFMLEngineImpl; 021 import railo.runtime.exp.PageException; 022 import railo.transformer.library.function.FunctionLibException; 023 import railo.transformer.library.tag.TagLibException; 024 025 026 /** 027 * 028 */ 029 public final class ConfigServerFactory { 030 031 /** 032 * creates a new ServletConfig Impl Object 033 * @param engine 034 * @param initContextes 035 * @param contextes 036 * @param configDir 037 * @return new Instance 038 * @throws SAXException 039 * @throws ClassNotFoundException 040 * @throws PageException 041 * @throws IOException 042 * @throws TagLibException 043 * @throws FunctionLibException 044 */ 045 public static ConfigServerImpl newInstance(CFMLEngineImpl engine,Map<String,CFMLFactory> initContextes, Map<String,CFMLFactory> contextes, Resource configDir) 046 throws SAXException, ClassException, PageException, IOException, TagLibException, FunctionLibException { 047 048 boolean isCLI=SystemUtil.isCLICall(); 049 if(isCLI){ 050 Resource logs = configDir.getRealResource("logs"); 051 logs.mkdirs(); 052 Resource out = logs.getRealResource("out"); 053 Resource err = logs.getRealResource("err"); 054 ResourceUtil.touch(out); 055 ResourceUtil.touch(err); 056 if(logs instanceof FileResource) { 057 SystemUtil.setPrintWriter(SystemUtil.OUT, new PrintWriter((FileResource)out)); 058 SystemUtil.setPrintWriter(SystemUtil.ERR, new PrintWriter((FileResource)err)); 059 } 060 else{ 061 SystemUtil.setPrintWriter(SystemUtil.OUT, new PrintWriter(IOUtil.getWriter(out,"UTF-8"))); 062 SystemUtil.setPrintWriter(SystemUtil.ERR, new PrintWriter(IOUtil.getWriter(err,"UTF-8"))); 063 } 064 } 065 SystemOut.print(SystemUtil.getPrintWriter(SystemUtil.OUT), 066 "===================================================================\n"+ 067 "SERVER CONTEXT\n" + 068 "-------------------------------------------------------------------\n"+ 069 "- config:"+configDir+"\n"+ 070 "- loader-version:"+SystemUtil.getLoaderVersion()+"\n"+ 071 "===================================================================\n" 072 073 ); 074 075 boolean doNew=ConfigWebFactory.doNew(configDir); 076 077 Resource configFile=configDir.getRealResource("railo-server.xml"); 078 if(!configFile.exists()) { 079 configFile.createFile(true); 080 //InputStream in = new TextFile("").getClass().getResourceAsStream("/resource/config/server.xml"); 081 ConfigWebFactory.createFileFromResource( 082 "/resource/config/server.xml", 083 configFile.getAbsoluteResource(), 084 "tpiasfap" 085 ); 086 } 087 //print.out(configFile); 088 Document doc=ConfigWebFactory.loadDocument(configFile); 089 090 ConfigServerImpl config=new ConfigServerImpl(engine,initContextes,contextes,configDir,configFile); 091 load(config,doc,false,doNew); 092 093 createContextFiles(configDir,config,doNew); 094 return config; 095 } 096 /** 097 * reloads the Config Object 098 * @param configServer 099 * @throws SAXException 100 * @throws ClassNotFoundException 101 * @throws PageException 102 * @throws IOException 103 * @throws TagLibException 104 * @throws FunctionLibException 105 */ 106 public static void reloadInstance(ConfigServerImpl configServer) 107 throws SAXException, ClassException, PageException, IOException, TagLibException, FunctionLibException { 108 Resource configFile=configServer.getConfigFile(); 109 110 if(configFile==null) return ; 111 if(second(configServer.getLoadTime())>second(configFile.lastModified())) return ; 112 boolean doNew=ConfigWebFactory.doNew(configServer.getConfigDir()); 113 load(configServer,ConfigWebFactory.loadDocument(configFile),true,doNew); 114 } 115 116 private static long second(long ms) { 117 return ms/1000; 118 } 119 120 /** 121 * @param configServer 122 * @param doc 123 * @throws ClassNotFoundException 124 * @throws IOException 125 * @throws FunctionLibException 126 * @throws TagLibException 127 * @throws PageException 128 */ 129 static void load(ConfigServerImpl configServer, Document doc, boolean isReload, boolean doNew) throws ClassException, PageException, IOException, TagLibException, FunctionLibException { 130 ConfigWebFactory.load(null,configServer,doc, isReload,doNew); 131 loadLabel(configServer,doc); 132 } 133 134 135 private static void loadLabel(ConfigServerImpl configServer, Document doc) { 136 Element el= ConfigWebFactory.getChildByName(doc.getDocumentElement(),"labels"); 137 Element[] children=ConfigWebFactory.getChildren(el,"label"); 138 139 Map<String, String> labels=new HashMap<String, String>(); 140 if(children!=null)for(int i=0;i<children.length;i++) { 141 el=children[i]; 142 143 String id=el.getAttribute("id"); 144 String name=el.getAttribute("name"); 145 if(id!=null && name!=null) { 146 labels.put(id, name); 147 } 148 } 149 configServer.setLabels(labels); 150 } 151 152 public static void createContextFiles(Resource configDir, ConfigServer config, boolean doNew) { 153 // Security certificate 154 Resource secDir = configDir.getRealResource("security"); 155 if(!secDir.exists())secDir.mkdirs(); 156 Resource f = secDir.getRealResource("cacerts"); 157 if(!f.exists())ConfigWebFactory.createFileFromResourceEL("/resource/security/cacerts",f); 158 System.setProperty("javax.net.ssl.trustStore",f.toString()); 159 160 // ESAPI 161 Resource propDir = configDir.getRealResource("properties"); 162 if(!propDir.exists())propDir.mkdirs(); 163 f = propDir.getRealResource("ESAPI.properties"); 164 if(!f.exists())ConfigWebFactory.createFileFromResourceEL("/resource/properties/ESAPI.properties",f); 165 System.setProperty("org.owasp.esapi.resources", propDir.toString()); 166 } 167 }