/*
 * Created by IntelliJ IDEA.
 * User: bungle
 * Date: 7.10.2002
 * Time: 14:07:56
 * To change template for new class use
 * Code Style | Class Templates options (Tools | IDE Options).
 */
package com.projectcast.web.common;

import webwork.view.velocity.WebWorkVelocityServlet;
import org.apache.velocity.Template;
import org.apache.velocity.context.Context;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import java.io.InputStream;
import java.io.IOException;
import java.util.Map;
import java.util.Iterator;
import java.util.HashMap;

import electric.xml.Document;
import electric.xml.ParseException;
import electric.xml.Elements;
import electric.xml.Element;
import com.projectcast.web.tools.velocity.Tool;

public class VelocityServlet extends WebWorkVelocityServlet {

    private static Map velocityTools;

    public void init(ServletConfig config)
    throws ServletException {

        super.init(config);

        velocityTools = new HashMap();

        InputStream is = Thread.currentThread().
                                getContextClassLoader().
                                getResourceAsStream(config.getInitParameter("tools"));

        try {
            Document document = new Document(is);
            Elements tools = document.getRoot().getElements("tool");

            while(tools.hasMoreElements()) {

                Element tool = tools.next();

                String toolName = tool.getAttributeValue("name");
                String toolClass = tool.getAttributeValue("class");

                log.info("Loading Velocity Tool: " + toolName + " (" + toolClass + ").");

                try {
                    velocityTools.put(toolName, Class.forName(toolClass).newInstance());
                } catch (InstantiationException e) {
                    log.warn(e);
                } catch (IllegalAccessException e) {
                    log.warn(e);
                } catch (ClassNotFoundException e) {
                    log.warn(e);
                }
            }
        } catch (ParseException e) {
            log.warn(e);
        }

        try { is.close(); } catch (IOException e) { }
    }

    protected Template handleRequest(javax.servlet.http.HttpServletRequest request,
                                     javax.servlet.http.HttpServletResponse response,
                                     Context ctx)
            throws java.lang.Exception {

        Iterator i = velocityTools.keySet().iterator();

        while (i.hasNext()) {
            String key = (String) i.next();
            Object o = velocityTools.get(key);

            if (o instanceof Tool) {
                log.info("Setting context for Velocity Tool: " + key + ".");
                ((Tool) o).setContext(ctx);
            }

            ctx.put(key, velocityTools.get(key));
        }

        return super.handleRequest(request, response, ctx);
    }
}
