001    // This file is part of AceWiki.
002    // Copyright 2011, AceWiki developers.
003    //
004    // AceWiki is free software: you can redistribute it and/or modify it under the terms of the GNU
005    // Lesser General Public License as published by the Free Software Foundation, either version 3 of
006    // the License, or (at your option) any later version.
007    //
008    // AceWiki is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
009    // even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
010    // Lesser General Public License for more details.
011    //
012    // You should have received a copy of the GNU Lesser General Public License along with AceWiki. If
013    // not, see http://www.gnu.org/licenses/.
014    
015    package ch.uzh.ifi.attempto.acewiki;
016    
017    import java.util.Enumeration;
018    import java.util.HashMap;
019    import java.util.Map;
020    
021    import javax.servlet.ServletConfig;
022    import javax.servlet.ServletContext;
023    import javax.servlet.ServletException;
024    import javax.servlet.http.HttpServlet;
025    
026    import ch.uzh.ifi.attempto.base.APE;
027    
028    /**
029     * This class is a servlet that creates a Backend object and shares it with the AceWiki servlet.
030     *
031     * To use a Backend object from a particular BackendServlet, add a "backend"
032     * parameter to the AceWiki servlet configuration and set its value to the BackendServlet
033     * name.
034     * <servlet>
035     *   <servlet-name>acewiki1<servlet-name>
036     *   <servlet-class>ch.uzh.ifi.attempto.acewiki.AceWikiServlet</servlet-class>
037     *   <load-on-startup>2</load-on-startup>
038     *   <init-param>
039     *     <param-name>backend</param-name>
040     *     <param-value>backend1</param-value>
041     *   </init-param>
042     * </servlet>
043     * <servlet>
044     *   <servlet-name>backend1<servlet-name>
045     *   <servlet-class>ch.uzh.ifi.attempto.acewiki.BackendServlet</servlet-class>
046     *   <load-on-startup>1</load-on-startup>
047     *   <!-- other parameter -->
048     * </servlet>
049     *
050     * This servlet accepts all parameters that the AceWiki servlet accepts.
051     *
052     * @author Yu Changyuan
053     */
054    public class BackendServlet extends HttpServlet {
055        private Backend backend;
056        private static final long serialVersionUID = 1358039576597838L;
057    
058        @SuppressWarnings("rawtypes")
059        private Map<String, String> getInitParameters(ServletConfig config) {
060    
061            Map<String, String> initParameters = new HashMap<String, String>();
062            Enumeration paramEnum = config.getInitParameterNames();
063            while (paramEnum.hasMoreElements()) {
064                String n = paramEnum.nextElement().toString();
065                initParameters.put(n, config.getInitParameter(n));
066            }
067            Enumeration contextParamEnum = config.getServletContext().getInitParameterNames();
068            while (contextParamEnum.hasMoreElements()) {
069                String n = contextParamEnum.nextElement().toString();
070                initParameters.put("context:" + n, config.getServletContext().getInitParameter(n));
071            }
072            return initParameters;
073        }
074    
075        public void init(ServletConfig config) throws ServletException {
076            Map<String, String> parameters = getInitParameters(config);
077            String name = config.getServletName();
078    
079            setDefaultValues(parameters);
080    
081            APE.setParameters(parameters);
082    
083            backend = new Backend(parameters);
084    
085            ServletContext ctx = config.getServletContext();
086            ctx.setAttribute(name, backend);
087    
088            super.init(config);
089        }
090    
091        /**
092         * Sets some default values for the given parameter map.
093         * 
094         * @param parameters The parameter map.
095         */
096        public static void setDefaultValues(Map<String, String> parameters) {
097            if (parameters.get("context:apecommand") == null) {
098                parameters.put("context:apecommand", "ape.exe");
099            }
100    
101            if (parameters.get("context:logdir") == null) {
102                parameters.put("context:logdir", "logs");
103            }
104    
105            if (parameters.get("context:datadir") == null) {
106                parameters.put("context:datadir", "data");
107            }
108        }
109    }
110