All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.contextfw.web.application.internal.service.InitHandler Maven / Gradle / Ivy

package net.contextfw.web.application.internal.service;

import java.io.IOException;
import java.util.Date;
import java.util.List;

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

import net.contextfw.web.application.HttpContext;
import net.contextfw.web.application.ResourceCleaner;
import net.contextfw.web.application.WebApplicationException;
import net.contextfw.web.application.WebApplicationHandle;
import net.contextfw.web.application.component.Component;
import net.contextfw.web.application.configuration.Configuration;
import net.contextfw.web.application.internal.LifecycleListeners;
import net.contextfw.web.application.internal.scope.WebApplicationScopedBeans;
import net.contextfw.web.application.lifecycle.PageFlowFilter;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.inject.Inject;
import com.google.inject.Provider;

public class InitHandler {

    private Logger logger = LoggerFactory.getLogger(InitHandler.class);
    @Inject
    private WebApplicationContextHandler handler;

    //private final InitializerProvider initializers;
    @Inject
    private Provider webApplicationProvider;
    @Inject
    private LifecycleListeners listeners;
    @Inject
    private PageFlowFilter pageFlowFilter;
    
    private final long initialMaxInactivity;
    
    private DirectoryWatcher watcher;
    
    private ResourceCleaner cleaner;
    
    private final boolean developmentMode;

    public InitHandler(Configuration properties) {
        initialMaxInactivity = properties.get(Configuration.INITIAL_MAX_INACTIVITY);
        developmentMode = properties.get(Configuration.DEVELOPMENT_MODE);
    }

    public final void handleRequest(
            List> chain, 
            HttpServlet servlet,
            HttpServletRequest request, 
            HttpServletResponse response)
            throws ServletException, IOException {
        
    	if (watcher != null && watcher.hasChanged()) {
    		logger.info("Reloading resources");
    		cleaner.clean();
    	}
    	
        if(!pageFlowFilter.beforePageCreate(
                handler.getContextCount(),
                    request)) {
            return;
        }

        response.addHeader("Expires", "Sun, 19 Nov 1978 05:00:00 GMT");
        response.addHeader("Last-Modified", new Date().toString());
        response.addHeader("Cache-Control", "no-store, no-cache, must-revalidate");
        response.addHeader("Cache-Control", "post-check=0, pre-check=0");
        response.addHeader("Pragma", "no-cache");

        if (chain == null) {
            response.sendError(HttpServletResponse.SC_NOT_FOUND);
        } else {
            
            WebApplicationContext context = prepareWebApplicationScope(servlet,
                        request, response);
            WebApplication app = webApplicationProvider.get();
            app.setInitializerChain(chain);
            context.setApplication(app);
            handler.addContext(context);

            synchronized (context.getApplication()) {
                try {
                    
                    pageFlowFilter.onPageCreate(
                                handler.getContextCount(),
                                pageFlowFilter.getRemoteAddr(request),
                                context.getHandle().getKey());

                    listeners.beforeInitialize();
                    app.initState();
                    listeners.afterInitialize();
                    listeners.beforeRender();
                    boolean expired = app.sendResponse();
                    listeners.afterRender();

                    // Setting expiration here so that long page processing is
                    // not
                    // penalizing client
                    if (expired) {
                        context.setExpires(System.currentTimeMillis());
                    } else {
                        context.setExpires(System.currentTimeMillis() + initialMaxInactivity);
                    }

                } catch (Exception e) {
                    listeners.onException(e);
                    if (e instanceof WebApplicationException) {
                        throw (WebApplicationException) e;
                    } else {
                        throw new WebApplicationException(e);
                    }
                } finally {
                    context.getHttpContext().setServlet(null);
                    context.getHttpContext().setRequest(null);
                    context.getHttpContext().setResponse(null);
                }
            }
        }
    }

    private WebApplicationContext prepareWebApplicationScope(HttpServlet servlet, HttpServletRequest request,
            HttpServletResponse response) {
        WebApplicationScopedBeans beans = WebApplicationScopedBeans
                .createNewInstance();
        HttpContext httpContext = new HttpContext(servlet, request, response);
        WebApplicationContext context = new WebApplicationContext(httpContext,
                pageFlowFilter.getRemoteAddr(request),
                System.currentTimeMillis() + initialMaxInactivity,
                handler.createNewHandle(), beans);
        beans.seed(HttpContext.class, httpContext);
        beans.seed(WebApplicationHandle.class, context.getHandle());
        return context;
    }

    @Inject
    public void setWatcher(DirectoryWatcher watcher) {
        if (developmentMode) {
            this.watcher = watcher;
        }
    }
    
    @Inject
    public void setCleaner(ResourceCleaner cleaner) {
        if (developmentMode) {
            this.cleaner = cleaner;
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy