001    /*****************************************************************************
002     * Copyright (C) NanoContainer Organization. All rights reserved.            *
003     * ------------------------------------------------------------------------- *
004     * The software in this package is published under the terms of the BSD      *
005     * style license a copy of which has been included with this distribution in *
006     * the LICENSE.txt file.                                                     *
007     *                                                                           *
008     *****************************************************************************/
009    
010    package org.nanocontainer.webcontainer;
011    
012    import org.mortbay.jetty.Server;
013    import org.mortbay.jetty.Handler;
014    import org.mortbay.jetty.handler.ContextHandler;
015    import org.mortbay.jetty.handler.ResourceHandler;
016    import org.mortbay.jetty.handler.ErrorHandler;
017    import org.mortbay.jetty.servlet.*;
018    import org.picocontainer.PicoContainer;
019    import org.picocontainer.defaults.DefaultPicoContainer;
020    
021    import javax.servlet.Filter;
022    import javax.servlet.Servlet;
023    import java.util.EventListener;
024    import java.io.IOException;
025    
026    public class PicoContextHandler {
027    
028        private final ContextHandler context;
029        private final Server server;
030        private final PicoContainer parentContainer;
031        private final boolean withSessionHandler;
032        private PicoServletHandler servletHandler;
033    
034        public static final int DEFAULT = 0;
035        public static final int REQUEST = 1;
036        public static final int FORWARD = 2;
037        public static final int INCLUDE = 4;
038        public static final int ERROR = 8;
039        public static final int ALL = 15;
040    
041        public PicoContextHandler(ContextHandler context, Server server, PicoContainer parentContainer, boolean sessionManager) {
042            this.context = context;
043            this.server = server;
044            this.parentContainer = parentContainer;
045            this.withSessionHandler = sessionManager;
046        }
047    
048        public PicoServletHolder addServletWithMapping(Class servletClass, String pathMapping) {
049            PicoServletHandler handler = getServletHandler();
050            return (PicoServletHolder) handler.addServletWithMapping(servletClass, pathMapping);
051        }
052    
053        public Servlet addServletWithMapping(Servlet servlet, String pathMapping) {
054            PicoServletHandler handler = getServletHandler();
055            handler.addServletWithMapping(new ServletHolder(servlet), pathMapping);
056            return servlet;
057        }
058    
059    
060        private synchronized PicoServletHandler getServletHandler() {
061            if (servletHandler == null) {
062                servletHandler = new PicoServletHandler(parentContainer);
063                servletHandler.setServer(server);
064                if (withSessionHandler) {
065                    SessionHandler sessionHandler = new SessionHandler();
066                    sessionHandler.setServer(server);
067                    context.addHandler(sessionHandler);
068                    sessionHandler.addHandler(servletHandler);
069                } else {
070                    context.addHandler(servletHandler);
071                }
072            }
073            return servletHandler;
074        }
075    
076        public PicoFilterHolder addFilterWithMapping(Class filterClass, String pathMapping, int dispatchers) {
077            PicoServletHandler handler = getServletHandler();
078            return (PicoFilterHolder) handler.addFilterWithMapping(filterClass, pathMapping, dispatchers);
079        }
080    
081        public Filter addFilterWithMapping(Filter filter, String pathMapping, int dispatchers) {
082            PicoServletHandler servletHandler = getServletHandler();
083            servletHandler.addFilterWithMapping(new FilterHolder(filter), pathMapping, dispatchers);
084            return filter;
085        }
086    
087    
088        public EventListener addListener(Class listenerClass) {
089    
090            DefaultPicoContainer child = new DefaultPicoContainer(parentContainer);
091            child.registerComponentImplementation(EventListener.class, listenerClass);
092            EventListener instance = (EventListener) child.getComponentInstance(EventListener.class);
093    
094            return addListener(instance);
095    
096        }
097    
098        public EventListener addListener(EventListener listener) {
099            context.addEventListener(listener);
100            return listener;
101        }
102    
103    
104        public void setStaticContext(String absolutePath) {
105            ResourceHandler resourceHandler = new ResourceHandler();
106            resourceHandler.setResourceBase(absolutePath);
107            context.addHandler(resourceHandler);
108        }
109    
110        public void setStaticContext(String absolutePath, String welcomePage) {
111            ResourceHandler resourceHandler = new ResourceHandler();
112            resourceHandler.setResourceBase(absolutePath);
113            resourceHandler.setWelcomeFiles(new String[]{welcomePage});
114            context.addHandler(resourceHandler);
115        }
116    
117        public void setDefaultHandling(final String absolutePath, String scratchDir, String pageSuffix) {
118            context.setResourceBase(absolutePath);
119            PicoServletHandler handler = getServletHandler();
120            ServletHolder jspHolder = new PicoServletHolder(parentContainer);
121            jspHolder.setName("jsp");
122            jspHolder.setClassName("org.apache.jasper.servlet.JspServlet");
123            jspHolder.setInitParameter("scratchdir", scratchDir);
124            jspHolder.setInitParameter("logVerbosityLevel", "DEBUG");
125            jspHolder.setInitParameter("fork", "false");
126            jspHolder.setInitParameter("xpoweredBy", "false");
127            jspHolder.setForcedPath(null);
128            jspHolder.setInitOrder(0);
129    
130    
131            handler.addServletWithMapping(jspHolder, pageSuffix);
132            handler.addServletWithMapping(DefaultServlet.class.getName(), "/");
133    
134        }
135    
136        public void addErrorHandler() {
137            addErrorHandler(new ErrorPageErrorHandler());
138        }
139    
140        public void addErrorHandler(ErrorHandler handler) {
141            context.setErrorHandler(handler);
142        }
143    
144        //     protected void handleErrorPage(HttpServletRequest request, Writer writer, int code, String message)
145    //        throws IOException
146      //  {
147        //    writeErrorPage(request, writer, code, message, _showStacks);
148       // }
149    
150    }