2 // ========================================================================
3 // Copyright (c) 1995-2014 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 LOG.debug("Filter.init {}",_filter);
137 _filter.init(_config);
141 /* ------------------------------------------------------------ */
150 destroyInstance(_filter);
164 /* ------------------------------------------------------------ */
166 public void destroyInstance (Object o)
171 Filter f = (Filter)o;
173 getServletHandler().destroyFilter(f);
176 /* ------------------------------------------------------------ */
177 public synchronized void setFilter(Filter filter)
181 setHeldClass(filter.getClass());
183 setName(filter.getClass().getName());
186 /* ------------------------------------------------------------ */
187 public Filter getFilter()
192 /* ------------------------------------------------------------ */
194 public String toString()
199 /* ------------------------------------------------------------ */
201 public void dump(Appendable out, String indent) throws IOException
203 super.dump(out, indent);
204 if(_filter instanceof Dumpable) {
205 ((Dumpable) _filter).dump(out, indent);
209 /* ------------------------------------------------------------ */
210 public FilterRegistration.Dynamic getRegistration()
212 if (_registration == null)
213 _registration = new Registration();
214 return _registration;
217 /* ------------------------------------------------------------ */
218 /* ------------------------------------------------------------ */
219 /* ------------------------------------------------------------ */
220 protected class Registration extends HolderRegistration implements FilterRegistration.Dynamic
222 public void addMappingForServletNames(EnumSet<DispatcherType> dispatcherTypes, boolean isMatchAfter, String... servletNames)
224 illegalStateIfContextStarted();
225 FilterMapping mapping = new FilterMapping();
226 mapping.setFilterHolder(FilterHolder.this);
227 mapping.setServletNames(servletNames);
228 mapping.setDispatcherTypes(dispatcherTypes);
230 _servletHandler.addFilterMapping(mapping);
232 _servletHandler.prependFilterMapping(mapping);
235 public void addMappingForUrlPatterns(EnumSet<DispatcherType> dispatcherTypes, boolean isMatchAfter, String... urlPatterns)
237 illegalStateIfContextStarted();
238 FilterMapping mapping = new FilterMapping();
239 mapping.setFilterHolder(FilterHolder.this);
240 mapping.setPathSpecs(urlPatterns);
241 mapping.setDispatcherTypes(dispatcherTypes);
243 _servletHandler.addFilterMapping(mapping);
245 _servletHandler.prependFilterMapping(mapping);
248 public Collection<String> getServletNameMappings()
250 FilterMapping[] mappings =_servletHandler.getFilterMappings();
251 List<String> names=new ArrayList<String>();
252 for (FilterMapping mapping : mappings)
254 if (mapping.getFilterHolder()!=FilterHolder.this)
256 String[] servlets=mapping.getServletNames();
257 if (servlets!=null && servlets.length>0)
258 names.addAll(Arrays.asList(servlets));
263 public Collection<String> getUrlPatternMappings()
265 FilterMapping[] mappings =_servletHandler.getFilterMappings();
266 List<String> patterns=new ArrayList<String>();
267 for (FilterMapping mapping : mappings)
269 if (mapping.getFilterHolder()!=FilterHolder.this)
271 String[] specs=mapping.getPathSpecs();
272 patterns.addAll(TypeUtil.asList(specs));
278 /* ------------------------------------------------------------ */
279 /* ------------------------------------------------------------ */
280 /* ------------------------------------------------------------ */
281 class Config extends HolderConfig implements FilterConfig
283 /* ------------------------------------------------------------ */
284 public String getFilterName()