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.picocontainer.jetty;
011    
012    import java.util.EventListener;
013    import java.util.HashMap;
014    import java.util.Map;
015    import java.util.Arrays;
016    
017    import javax.servlet.Filter;
018    import javax.servlet.Servlet;
019    
020    import org.mortbay.jetty.handler.ErrorHandler;
021    import org.mortbay.jetty.servlet.Context;
022    import org.mortbay.jetty.servlet.DefaultServlet;
023    import org.mortbay.jetty.servlet.ErrorPageErrorHandler;
024    import org.mortbay.jetty.servlet.FilterHolder;
025    import org.mortbay.jetty.servlet.ServletHolder;
026    import org.picocontainer.PicoContainer;
027    import org.picocontainer.DefaultPicoContainer;
028    
029    public class PicoContext {
030    
031        private final Context context;
032        private final PicoContainer parentContainer;
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        }
045    
046        public PicoServletHolder addServletWithMapping(Class servletClass, String pathMapping) {
047            PicoServletHolder holder = new PicoServletHolder(servletClass, parentContainer);
048            context.addServlet(holder, pathMapping);
049            return holder;
050        }
051    
052        public Servlet addServletWithMapping(Servlet servlet, String pathMapping) {
053            ServletHolder holder = new ServletHolder(servlet);
054            context.addServlet(holder, pathMapping);
055            return servlet;
056        }
057    
058        public PicoFilterHolder addFilterWithMapping(Class filterClass, String pathMapping, int dispatchers) {
059            PicoFilterHolder filterHolder = new PicoFilterHolder(filterClass, parentContainer);
060            context.addFilter(filterHolder, pathMapping, dispatchers);
061            return filterHolder;
062        }
063    
064        public PicoFilterHolder addFilterWithMappings(Class filterClass, String[] pathMappings, int dispatchers) {
065            PicoFilterHolder filterHolder = new PicoFilterHolder(filterClass, parentContainer);
066            for (String pathMapping : pathMappings) {
067                context.addFilter(filterHolder, pathMapping, dispatchers);
068            }
069            return filterHolder;
070        }
071    
072        public Filter addFilterWithMapping(Filter filter, String pathMapping, int dispatchers) {
073            context.addFilter(new FilterHolder(filter), pathMapping, dispatchers);
074            return filter;
075        }
076    
077        public void addInitParam(String param, String value) {
078            Map params = new HashMap(context.getInitParams());
079            params.put(param, value);
080            context.setInitParams(params);
081        }
082    
083    
084        public EventListener addListener(Class listenerClass) {
085            DefaultPicoContainer child = new DefaultPicoContainer(parentContainer);
086            child.addComponent(EventListener.class, listenerClass);
087            EventListener instance = child.getComponent(EventListener.class);
088            return addListener(instance);
089        }
090    
091        public EventListener addListener(EventListener listener) {
092            context.addEventListener(listener);
093            return listener;
094        }
095    
096    
097        public void setStaticContext(String absolutePath) {
098            context.addServlet(DefaultServlet.class.getName(), "/");
099            context.setResourceBase(absolutePath);
100        }
101    
102        public void setStaticContext(String absolutePath, String welcomePage) {
103            context.addServlet(DefaultServlet.class.getName(), "/");
104            context.setResourceBase(absolutePath);
105            context.setWelcomeFiles(new String[]{welcomePage});
106        }
107    
108        public void setVirtualHosts(String... virtualhosts) {
109            context.setVirtualHosts(virtualhosts);
110        }
111    
112        public void addVirtualHost(String virtualhost) {
113            String[] virtualHosts = context.getVirtualHosts();
114            if (virtualHosts == null) {
115                setVirtualHosts(virtualhost);
116            } else {
117                String[] newHosts = new String[virtualHosts.length +1];
118                System.arraycopy(virtualHosts,0,newHosts,0,virtualHosts.length);
119                newHosts[virtualHosts.length] = virtualhost;
120                setVirtualHosts(newHosts);
121            }
122        }
123    
124    
125    
126        public void setDefaultHandling(final String absolutePath, String scratchDir, String pageSuffix) {
127            context.setResourceBase(absolutePath);
128            ServletHolder jspHolder = new PicoServletHolder(parentContainer);
129            jspHolder.setName("jsp");
130            jspHolder.setClassName("org.apache.jasper.servlet.JspServlet");
131            jspHolder.setInitParameter("scratchdir", scratchDir);
132            jspHolder.setInitParameter("logVerbosityLevel", "DEBUG");
133            jspHolder.setInitParameter("fork", "false");
134            jspHolder.setInitParameter("xpoweredBy", "false");
135            jspHolder.setForcedPath(null);
136            jspHolder.setInitOrder(0);
137    
138            context.addServlet(jspHolder, "*.jsp");
139            context.addServlet(DefaultServlet.class.getName(), "/");
140    
141        }
142    
143        public void addErrorHandler() {
144            addErrorHandler(new ErrorPageErrorHandler());
145        }
146    
147        public void addErrorHandler(ErrorHandler handler) {
148            context.setErrorHandler(handler);
149        }
150    
151    }