package com.dataiku.wt1.gae;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.dataiku.wt1.ProcessingQueue;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Logger;

import com.google.appengine.api.LifecycleManager;
import com.google.appengine.api.LifecycleManager.ShutdownHook;
import com.google.appengine.api.ThreadManager;

/**
 * Servlet mounted on the GAE /_ah/start handler, called at backend initialization.
 * Its job is to start and stop the processing queue, and to configure logging.
 */
public class InitializationServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    private static final String CONFIG_PATH = "/WEB-INF/config.properties";	

    public void registerShutdownHook() {
        LifecycleManager.getInstance().setShutdownHook(new ShutdownHook() {
            public void shutdown() {
                logger.info("App will stop");
                ProcessingQueue.getInstance().setShutdown();
            }
        });
    }

    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        System.out.println("*********************");
        Logger.getRootLogger().removeAllAppenders();
        BasicConfigurator.configure();

        registerShutdownHook();

        /* Load config */
        try {
            File configFile = new File(getServletContext().getRealPath(CONFIG_PATH));
            Properties props = new Properties();
            props.load(new FileReader(configFile));
            props.load(new FileReader(configFile));

            ProcessingQueue.getInstance().configure(props);

            /* Start all processing threads */
            for (Runnable runnable : ProcessingQueue.getInstance().getRunnables()) {
                Thread thread = ThreadManager.createBackgroundThread(runnable);
                thread.start();
            }

        } catch (Exception e) {
            throw new IOException("Could not create processing threads", e);
        }
        logger.info("App started");
    }

    Logger logger = Logger.getLogger("wt1");
}