Commit 150aba21 authored by Christoffer Sawicki's avatar Christoffer Sawicki Committed by Phillip Webb

Add support for engine valves

Update TomcatEmbeddedServletContainerFactory to allow registration of
engine valves as well as context values. For clarity the ambiguous
`getValues()` method has been deprecated in favor of
`getContextValves()`

See gh-6311
parent be80a587
......@@ -34,6 +34,7 @@ import javax.servlet.ServletContainerInitializer;
import javax.servlet.ServletContext;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Host;
import org.apache.catalina.Lifecycle;
import org.apache.catalina.LifecycleEvent;
......@@ -88,6 +89,7 @@ import org.springframework.util.StringUtils;
* @author Stephane Nicoll
* @author Andy Wilkinson
* @author Eddú Meléndez
* @author Christoffer Sawicki
* @see #setPort(int)
* @see #setContextLifecycleListeners(Collection)
* @see TomcatEmbeddedServletContainer
......@@ -106,6 +108,8 @@ public class TomcatEmbeddedServletContainerFactory
private File baseDirectory;
private List<Valve> engineValves = new ArrayList<Valve>();
private List<Valve> contextValves = new ArrayList<Valve>();
private List<LifecycleListener> contextLifecycleListeners = new ArrayList<LifecycleListener>();
......@@ -162,7 +166,7 @@ public class TomcatEmbeddedServletContainerFactory
customizeConnector(connector);
tomcat.setConnector(connector);
tomcat.getHost().setAutoDeploy(false);
tomcat.getEngine().setBackgroundProcessorDelay(-1);
configureEngine(tomcat.getEngine());
for (Connector additionalConnector : this.additionalTomcatConnectors) {
tomcat.getService().addConnector(additionalConnector);
}
......@@ -170,6 +174,13 @@ public class TomcatEmbeddedServletContainerFactory
return getTomcatEmbeddedServletContainer(tomcat);
}
private void configureEngine(Engine engine) {
engine.setBackgroundProcessorDelay(-1);
for (Valve valve : this.engineValves) {
engine.getPipeline().addValve(valve);
}
}
protected void prepareContext(Host host, ServletContextInitializer[] initializers) {
File docBase = getValidDocumentRoot();
docBase = (docBase != null ? docBase : createTempDir("tomcat-docbase"));
......@@ -527,9 +538,37 @@ public class TomcatEmbeddedServletContainerFactory
this.protocol = protocol;
}
/**
* Set {@link Valve}s that should be applied to the Tomcat {@link Engine}. Calling
* this method will replace any existing valves.
* @param engineValves the valves to set
*/
public void setEngineValves(Collection<? extends Valve> engineValves) {
Assert.notNull(engineValves, "Valves must not be null");
this.engineValves = new ArrayList<Valve>(engineValves);
}
/**
* Returns a mutable collection of the {@link Valve}s that will be applied to the
* Tomcat {@link Engine}.
* @return the engineValves the valves that will be applied
*/
public Collection<Valve> getEngineValves() {
return this.engineValves;
}
/**
* Add {@link Valve}s that should be applied to the Tomcat {@link Engine}.
* @param engineValves the valves to add
*/
public void addEngineValves(Valve... engineValves) {
Assert.notNull(engineValves, "Valves must not be null");
this.engineValves.addAll(Arrays.asList(engineValves));
}
/**
* Set {@link Valve}s that should be applied to the Tomcat {@link Context}. Calling
* this method will replace any existing listeners.
* this method will replace any existing valves.
* @param contextValves the valves to set
*/
public void setContextValves(Collection<? extends Valve> contextValves) {
......@@ -541,8 +580,20 @@ public class TomcatEmbeddedServletContainerFactory
* Returns a mutable collection of the {@link Valve}s that will be applied to the
* Tomcat {@link Context}.
* @return the contextValves the valves that will be applied
* @deprecated as of 1.4 in favor of {@link #getContextValves()}
*/
@Deprecated
public Collection<Valve> getValves() {
return getContextValves();
}
/**
* Returns a mutable collection of the {@link Valve}s that will be applied to the
* Tomcat {@link Context}.
* @return the contextValves the valves that will be applied
* @see #getEngineValves()
*/
public Collection<Valve> getContextValves() {
return this.contextValves;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment