This commit is contained in:
Jan Bartel 2016-11-02 17:32:55 +11:00
parent ca882c8dee
commit 8461cc07b3
4 changed files with 136 additions and 26 deletions

View File

@ -109,32 +109,37 @@ public class FilterHolder extends Holder<Filter>
@Override
public void initialize() throws Exception
{
super.initialize();
if (_filter==null)
if (!_initialized)
{
try
{
ServletContext context=_servletHandler.getServletContext();
_filter=(context instanceof ServletContextHandler.Context)
?((ServletContextHandler.Context)context).createFilter(getHeldClass())
:getHeldClass().newInstance();
}
catch (ServletException se)
{
Throwable cause = se.getRootCause();
if (cause instanceof InstantiationException)
throw (InstantiationException)cause;
if (cause instanceof IllegalAccessException)
throw (IllegalAccessException)cause;
throw se;
}
}
super.initialize();
_config=new Config();
if (LOG.isDebugEnabled())
LOG.debug("Filter.init {}",_filter);
_filter.init(_config);
if (_filter==null)
{
try
{
ServletContext context=_servletHandler.getServletContext();
_filter=(context instanceof ServletContextHandler.Context)
?((ServletContextHandler.Context)context).createFilter(getHeldClass())
:getHeldClass().newInstance();
}
catch (ServletException se)
{
Throwable cause = se.getRootCause();
if (cause instanceof InstantiationException)
throw (InstantiationException)cause;
if (cause instanceof IllegalAccessException)
throw (IllegalAccessException)cause;
throw se;
}
}
_config=new Config();
if (LOG.isDebugEnabled())
LOG.debug("Filter.init {}",_filter);
_filter.init(_config);
}
_initialized = true;
}
@ -158,6 +163,7 @@ public class FilterHolder extends Holder<Filter>
_filter=null;
_config=null;
_initialized = false;
super.doStop();
}

View File

@ -53,6 +53,7 @@ public class Holder<T> extends BaseHolder<T>
protected String _displayName;
protected boolean _asyncSupported;
protected String _name;
protected boolean _initialized = false;
/* ---------------------------------------------------------------- */

View File

@ -73,7 +73,6 @@ public class ServletHolder extends Holder<Servlet> implements UserIdentity.Scope
private static final Logger LOG = Log.getLogger(ServletHolder.class);
private int _initOrder = -1;
private boolean _initOnStartup=false;
private boolean _initialized = false;
private Map<String, String> _roleMap;
private String _forcedPath;
private String _runAsRole;
@ -410,7 +409,8 @@ public class ServletHolder extends Holder<Servlet> implements UserIdentity.Scope
public void initialize ()
throws Exception
{
if(!_initialized){
if(!_initialized)
{
super.initialize();
if (_extInstance || _initOnStartup)
{

View File

@ -0,0 +1,103 @@
//
// ========================================================================
// Copyright (c) 1995-2016 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
//
package org.eclipse.jetty.servlet;
import static org.junit.Assert.*;
import java.io.IOException;
import java.util.concurrent.atomic.AtomicInteger;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.eclipse.jetty.util.log.StacklessLogging;
import org.junit.Test;
/**
* FilterHolderTest
*
*
*/
public class FilterHolderTest
{
@Test
public void testInitialize()
throws Exception
{
ServletHandler handler = new ServletHandler();
final AtomicInteger counter = new AtomicInteger(0);
Filter filter = new Filter ()
{
@Override
public void init(FilterConfig filterConfig) throws ServletException
{
counter.incrementAndGet();
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
}
@Override
public void destroy()
{
}
};
FilterHolder fh = new FilterHolder();
fh.setServletHandler(handler);
fh.setName("xx");
fh.setFilter(filter);
try (StacklessLogging stackless = new StacklessLogging(FilterHolder.class))
{
fh.initialize();
fail("Not started");
}
catch (Exception e)
{
//expected
}
fh.start();
fh.initialize();
assertEquals(1, counter.get());
fh.initialize();
assertEquals(1, counter.get());
fh.stop();
assertEquals(1, counter.get());
fh.start();
assertEquals(1, counter.get());
fh.initialize();
assertEquals(2, counter.get());
}
}