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 }