2 // ========================================================================
3 // Copyright (c) 1995-2016 Mort Bay Consulting Pty. Ltd.
4 // ------------------------------------------------------------------------
5 // All rights reserved. This program and the accompanying materials
6 // are made available under the terms of the Eclipse Public License v1.0
7 // and Apache License v2.0 which accompanies this distribution.
9 // The Eclipse Public License is available at
10 // http://www.eclipse.org/legal/epl-v10.html
12 // The Apache License v2.0 is available at
13 // http://www.opensource.org/licenses/apache2.0.php
15 // You may elect to redistribute this code under either of these licenses.
16 // ========================================================================
19 package org.eclipse.jetty.servlet;
21 import java.io.IOException;
22 import java.util.ArrayList;
23 import java.util.Arrays;
24 import java.util.Collection;
25 import java.util.EnumSet;
26 import java.util.List;
28 import javax.servlet.DispatcherType;
29 import javax.servlet.Filter;
30 import javax.servlet.FilterConfig;
31 import javax.servlet.FilterRegistration;
32 import javax.servlet.ServletContext;
33 import javax.servlet.ServletException;
35 import org.eclipse.jetty.util.TypeUtil;
36 import org.eclipse.jetty.util.component.Dumpable;
37 import org.eclipse.jetty.util.log.Log;
38 import org.eclipse.jetty.util.log.Logger;
40 /* --------------------------------------------------------------------- */
44 public class FilterHolder extends Holder<Filter>
46 private static final Logger LOG = Log.getLogger(FilterHolder.class);
48 /* ------------------------------------------------------------ */
49 private transient Filter _filter;
50 private transient Config _config;
51 private transient FilterRegistration.Dynamic _registration;
53 /* ---------------------------------------------------------------- */
58 this(Source.EMBEDDED);
62 /* ---------------------------------------------------------------- */
65 public FilterHolder(Holder.Source source)
70 /* ---------------------------------------------------------------- */
73 public FilterHolder(Class<? extends Filter> filter)
75 this(Source.EMBEDDED);
79 /* ---------------------------------------------------------------- */
80 /** Constructor for existing filter.
82 public FilterHolder(Filter filter)
84 this(Source.EMBEDDED);
88 /* ------------------------------------------------------------ */
95 if (!javax.servlet.Filter.class
96 .isAssignableFrom(_class))
98 String msg = _class+" is not a javax.servlet.Filter";
100 throw new IllegalStateException(msg);
109 /* ------------------------------------------------------------ */
111 public void initialize() throws Exception
119 ServletContext context=_servletHandler.getServletContext();
120 _filter=(context instanceof ServletContextHandler.Context)
121 ?((ServletContextHandler.Context)context).createFilter(getHeldClass())
122 :getHeldClass().newInstance();
124 catch (ServletException se)
126 Throwable cause = se.getRootCause();
127 if (cause instanceof InstantiationException)
128 throw (InstantiationException)cause;
129 if (cause instanceof IllegalAccessException)
130 throw (IllegalAccessException)cause;
135 _config=new Config();
136 if (LOG.isDebugEnabled())
137 LOG.debug("Filter.init {}",_filter);
138 _filter.init(_config);
142 /* ------------------------------------------------------------ */
151 destroyInstance(_filter);
165 /* ------------------------------------------------------------ */
167 public void destroyInstance (Object o)
172 Filter f = (Filter)o;
174 getServletHandler().destroyFilter(f);
177 /* ------------------------------------------------------------ */
178 public synchronized void setFilter(Filter filter)
182 setHeldClass(filter.getClass());
184 setName(filter.getClass().getName());
187 /* ------------------------------------------------------------ */
188 public Filter getFilter()
193 /* ------------------------------------------------------------ */
195 public String toString()
200 /* ------------------------------------------------------------ */
202 public void dump(Appendable out, String indent) throws IOException
204 super.dump(out, indent);
205 if(_filter instanceof Dumpable) {
206 ((Dumpable) _filter).dump(out, indent);
210 /* ------------------------------------------------------------ */
211 public FilterRegistration.Dynamic getRegistration()
213 if (_registration == null)
214 _registration = new Registration();
215 return _registration;
218 /* ------------------------------------------------------------ */
219 /* ------------------------------------------------------------ */
220 /* ------------------------------------------------------------ */
221 protected class Registration extends HolderRegistration implements FilterRegistration.Dynamic
223 public void addMappingForServletNames(EnumSet<DispatcherType> dispatcherTypes, boolean isMatchAfter, String... servletNames)
225 illegalStateIfContextStarted();
226 FilterMapping mapping = new FilterMapping();
227 mapping.setFilterHolder(FilterHolder.this);
228 mapping.setServletNames(servletNames);
229 mapping.setDispatcherTypes(dispatcherTypes);
231 _servletHandler.addFilterMapping(mapping);
233 _servletHandler.prependFilterMapping(mapping);
236 public void addMappingForUrlPatterns(EnumSet<DispatcherType> dispatcherTypes, boolean isMatchAfter, String... urlPatterns)
238 illegalStateIfContextStarted();
239 FilterMapping mapping = new FilterMapping();
240 mapping.setFilterHolder(FilterHolder.this);
241 mapping.setPathSpecs(urlPatterns);
242 mapping.setDispatcherTypes(dispatcherTypes);
244 _servletHandler.addFilterMapping(mapping);
246 _servletHandler.prependFilterMapping(mapping);
249 public Collection<String> getServletNameMappings()
251 FilterMapping[] mappings =_servletHandler.getFilterMappings();
252 List<String> names=new ArrayList<String>();
253 for (FilterMapping mapping : mappings)
255 if (mapping.getFilterHolder()!=FilterHolder.this)
257 String[] servlets=mapping.getServletNames();
258 if (servlets!=null && servlets.length>0)
259 names.addAll(Arrays.asList(servlets));
264 public Collection<String> getUrlPatternMappings()
266 FilterMapping[] mappings =_servletHandler.getFilterMappings();
267 List<String> patterns=new ArrayList<String>();
268 for (FilterMapping mapping : mappings)
270 if (mapping.getFilterHolder()!=FilterHolder.this)
272 String[] specs=mapping.getPathSpecs();
273 patterns.addAll(TypeUtil.asList(specs));
279 /* ------------------------------------------------------------ */
280 /* ------------------------------------------------------------ */
281 /* ------------------------------------------------------------ */
282 class Config extends HolderConfig implements FilterConfig
284 /* ------------------------------------------------------------ */
285 public String getFilterName()