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

org.nakedobjects.plugins.html.servlet.ControllerServlet Maven / Gradle / Ivy

package org.nakedobjects.plugins.html.servlet;

import java.io.IOException;
import java.io.PrintWriter;

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

import org.apache.log4j.Logger;
import org.nakedobjects.metamodel.authentication.AuthenticationSession;
import org.nakedobjects.metamodel.config.NakedObjectConfiguration;
import org.nakedobjects.plugins.html.component.Page;
import org.nakedobjects.plugins.html.component.html.HtmlComponentFactory;
import org.nakedobjects.plugins.html.context.Context;
import org.nakedobjects.plugins.html.request.Request;
import org.nakedobjects.plugins.html.request.ServletRequest;
import org.nakedobjects.plugins.html.servlet.internal.WebController;
import org.nakedobjects.runtime.context.NakedObjectsContext;



public class ControllerServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private static final Logger LOG = Logger.getLogger(ControllerServlet.class);
    
    private String encoding = HtmlServletConstants.ENCODING_DEFAULT;
    private WebController controller;

    
    ////////////////////////////////////////////////////////////////////
    // init
    ////////////////////////////////////////////////////////////////////

    @Override
    public void init(final ServletConfig servletConfig) throws ServletException {
        super.init(servletConfig);
        encoding = getConfiguration().getString(HtmlServletConstants.ENCODING_KEY, encoding);
        
        controller = new WebController();
        controller.setDebug(getConfiguration().getBoolean(HtmlServletConstants.DEBUG_KEY));
        controller.init();
    }



    ////////////////////////////////////////////////////////////////////
    // doGet, doPost
    ////////////////////////////////////////////////////////////////////

    @Override
    protected void doPost(final HttpServletRequest request, final HttpServletResponse response) throws ServletException,
            IOException {
        request.setCharacterEncoding(encoding);
        processRequest(request, response);
    }

    @Override
    protected void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException,
            IOException {
        processRequest(request, response);
    }

    private void processRequest(final HttpServletRequest request, final HttpServletResponse response) throws ServletException,
            IOException {
        LOG.info("request: " + request.getServletPath() + "?" + request.getQueryString());

        final Request req = new ServletRequest(request);

        if (req.getRequestType() == null) {
            throw new ServletException("No action specified");
        } else if (!controller.actionExists(req)) {
            throw new ServletException("No such action " + req.getRequestType());
        } else {
            try {
                final Context context = getContextForRequest(request);
                processRequest(request, response, req, context);
            } catch (final Exception e) {
                LOG.error("exception during request handling", e);
                throw new ServletException("Internal exception", e);
            }
        }
    }

    private Context getContextForRequest(final HttpServletRequest request) {
        AuthenticationSession authenticationSession = getAuthenticationSession();
		Context context = (Context) authenticationSession.getAttribute(HtmlServletConstants.AUTHENTICATION_SESSION_CONTEXT_KEY);
        if (context == null || !context.isValid()) {
            // TODO reuse the component factory
            context = new Context(new HtmlComponentFactory());
            authenticationSession.setAttribute(HtmlServletConstants.AUTHENTICATION_SESSION_CONTEXT_KEY, context);
        }
        return context;
    }


    private void processRequest(
            final HttpServletRequest request,
            final HttpServletResponse response,
            final Request req,
            final Context context) throws IOException, ServletException {
        response.setContentType("text/html");

        // no need to check if logged in; the NakedObjectsSessionFilter would
        // have prevented us from getting here.
        
        try {
            //SessionAccess.startRequest(context.getSession());
            final Page page = controller.generatePage(context, req);
            if (context.isValid()) {
                if (controller.isDebug()) {
                    controller.addDebug(page, req);
                    addDebug(request, page);
                }
                PrintWriter writer;
                writer = response.getWriter();
                page.write(writer);
            } else {
                response.sendRedirect(HtmlServletConstants.LOGON_APP_PAGE);
            }
        } finally {
            //SessionAccess.endRequest(context.getSession());
            if (!context.isLoggedIn()) {
                final HttpSession httpSession = request.getSession(false);
                LOG.info("dropping session: " + httpSession);
            }
        }
    }

    private void addDebug(final HttpServletRequest request, final Page page) {
        page.addDebug("Servlet path", request.getServletPath());
        page.addDebug("Query string", request.getQueryString());
        page.addDebug("Context path", request.getContextPath());
        page.addDebug("Path info", request.getPathInfo());
    }

    
    ////////////////////////////////////////////////////////////////////
    // Dependencies (from context)
    ////////////////////////////////////////////////////////////////////
    
	private static AuthenticationSession getAuthenticationSession() {
		return NakedObjectsContext.getAuthenticationSession();
	}

	private static NakedObjectConfiguration getConfiguration() {
		return NakedObjectsContext.getConfiguration();
	}
    

}

// Copyright (c) Naked Objects Group Ltd.




© 2015 - 2025 Weber Informatics LLC | Privacy Policy