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 java.util.EventListener;
013    import java.util.HashMap;
014    import java.util.Map;
015    
016    import javax.servlet.Filter;
017    import javax.servlet.Servlet;
018    
019    import org.mortbay.jetty.handler.ErrorHandler;
020    import org.mortbay.jetty.servlet.Context;
021    import org.mortbay.jetty.servlet.DefaultServlet;
022    import org.mortbay.jetty.servlet.ErrorPageErrorHandler;
023    import org.mortbay.jetty.servlet.FilterHolder;
024    import org.mortbay.jetty.servlet.ServletHolder;
025    import org.picocontainer.PicoContainer;
026    import org.picocontainer.defaults.DefaultPicoContainer;
027    
028    public class PicoContext {
029    
030        private final Context context;
031        private final PicoContainer parentContainer;
032        private final boolean withSessionHandler;
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 PicoContext(Context context, PicoContainer parentContainer, boolean withSessionHandler) {
042            this.context = context;
043            this.parentContainer = parentContainer;
044            this.withSessionHandler = withSessionHandler;
045        }
046    
047        public PicoServletHolder addServletWithMapping(Class servletClass, String pathMapping) {
048            PicoServletHolder holder = new PicoServletHolder(servletClass, parentContainer);
049            context.addServlet(holder, pathMapping);
050            return holder;
051        }
052    
053        public Servlet addServletWithMapping(Servlet servlet, String pathMapping) {
054            ServletHolder holder = new ServletHolder(servlet);
055            context.addServlet(holder, pathMapping);
056            return servlet;
057        }
058    
059        public PicoFilterHolder addFilterWithMapping(Class filterClass, String pathMapping, int dispatchers) {
060            PicoFilterHolder filterHolder = new PicoFilterHolder(filterClass, parentContainer);
061            context.addFilter(filterHolder, pathMapping, 0);
062            return filterHolder;
063        }
064    
065        public Filter addFilterWithMapping(Filter filter, String pathMapping, int dispatchers) {
066            context.addFilter(new FilterHolder(filter), pathMapping, dispatchers);
067            return filter;
068        }
069    
070        public void addInitParam(String param, String value) {
071            Map params = new HashMap(context.getInitParams());
072            params.put(param, value);
073            context.setInitParams(params);
074        }
075    
076    
077        public EventListener addListener(Class listenerClass) {
078            DefaultPicoContainer child = new DefaultPicoContainer(parentContainer);
079            child.registerComponentImplementation(EventListener.class, listenerClass);
080            EventListener instance = (EventListener) child.getComponentInstance(EventListener.class);
081            return addListener(instance);
082        }
083    
084        public EventListener addListener(EventListener listener) {
085            context.addEventListener(listener);
086            return listener;
087        }
088    
089    
090        public void setStaticContext(String absolutePath) {
091            context.addServlet(DefaultServlet.class.getName(), "/");
092            context.setResourceBase(absolutePath);
093        }
094    
095        public void setStaticContext(String absolutePath, String welcomePage) {
096            context.addServlet(DefaultServlet.class.getName(), "/");
097            context.setResourceBase(absolutePath);
098            context.setWelcomeFiles(new String[]{welcomePage});
099        }
100    
101        public void setDefaultHandling(final String absolutePath, String scratchDir, String pageSuffix) {
102            context.setResourceBase(absolutePath);
103            ServletHolder jspHolder = new PicoServletHolder(parentContainer);
104            jspHolder.setName("jsp");
105            jspHolder.setClassName("org.apache.jasper.servlet.JspServlet");
106            jspHolder.setInitParameter("scratchdir", scratchDir);
107            jspHolder.setInitParameter("logVerbosityLevel", "DEBUG");
108            jspHolder.setInitParameter("fork", "false");
109            jspHolder.setInitParameter("xpoweredBy", "false");
110            jspHolder.setForcedPath(null);
111            jspHolder.setInitOrder(0);
112    
113            context.addServlet(jspHolder, "*.jsp");
114            context.addServlet(DefaultServlet.class.getName(), "/");
115    
116        }
117    
118        public void addErrorHandler() {
119            addErrorHandler(new ErrorPageErrorHandler());
120        }
121    
122        public void addErrorHandler(ErrorHandler handler) {
123            context.setErrorHandler(handler);
124        }
125    
126    }