/** @since servlet-api-3.0 */
    @Override
    public FilterRegistration.Dynamic addFilter(String filterName, Filter filter) {
      if (isStarted()) throw new IllegalStateException();

      if (filterName == null || "".equals(filterName.trim()))
        throw new IllegalStateException("Missing filter name");

      if (!_enabled) throw new UnsupportedOperationException();

      final ServletHandler handler = ServletContextHandler.this.getServletHandler();
      FilterHolder holder = handler.getFilter(filterName);
      if (holder == null) {
        // new filter
        holder = handler.newFilterHolder(Source.JAVAX_API);
        holder.setName(filterName);
        holder.setFilter(filter);
        handler.addFilter(holder);
        return holder.getRegistration();
      }

      if (holder.getClassName() == null && holder.getHeldClass() == null) {
        // preliminary filter registration completion
        holder.setFilter(filter);
        return holder.getRegistration();
      } else return null; // existing filter
    }
    @Override
    public FilterRegistration getFilterRegistration(String filterName) {
      if (!_enabled) throw new UnsupportedOperationException();

      final FilterHolder holder =
          ServletContextHandler.this.getServletHandler().getFilter(filterName);
      return (holder == null) ? null : holder.getRegistration();
    }
    @Override
    public Map<String, ? extends FilterRegistration> getFilterRegistrations() {
      if (!_enabled) throw new UnsupportedOperationException();

      HashMap<String, FilterRegistration> registrations = new HashMap<String, FilterRegistration>();
      ServletHandler handler = ServletContextHandler.this.getServletHandler();
      FilterHolder[] holders = handler.getFilters();
      if (holders != null) {
        for (FilterHolder holder : holders)
          registrations.put(holder.getName(), holder.getRegistration());
      }
      return registrations;
    }