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    }