Revision: 997ae129e4a8
Author: Sam Berlin <[email protected]>
Date: Sun May 27 10:42:56 2012
Log: Reduce stack size and simplify control flow in
FilterChainInvocation.
Revision created by MOE tool push_codebase.
MOE_MIGRATION=4878
http://code.google.com/p/google-guice/source/detail?r=997ae129e4a8
Modified:
/extensions/servlet/src/com/google/inject/servlet/FilterChainInvocation.java
/extensions/servlet/src/com/google/inject/servlet/FilterDefinition.java
/extensions/servlet/test/com/google/inject/servlet/FilterDefinitionTest.java
=======================================
---
/extensions/servlet/src/com/google/inject/servlet/FilterChainInvocation.java
Mon Oct 31 13:35:33 2011
+++
/extensions/servlet/src/com/google/inject/servlet/FilterChainInvocation.java
Sun May 27 10:42:56 2012
@@ -23,6 +23,7 @@
import java.util.List;
import java.util.Set;
+import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
@@ -45,7 +46,6 @@
class FilterChainInvocation implements FilterChain {
private static final Set<String> SERVLET_INTERNAL_METHODS =
ImmutableSet.of(
- FilterDefinition.class.getName() + ".doFilter",
FilterChainInvocation.class.getName() + ".doFilter");
private final FilterDefinition[] filterDefinitions;
@@ -67,8 +67,6 @@
public void doFilter(ServletRequest servletRequest, ServletResponse
servletResponse)
throws IOException, ServletException {
- index++;
-
GuiceFilter.Context previous = GuiceFilter.localContext.get();
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
@@ -76,9 +74,12 @@
= (previous != null) ? previous.getOriginalRequest() : request;
GuiceFilter.localContext.set(new GuiceFilter.Context(originalRequest,
request, response));
try {
- //dispatch down the chain while there are more filters
- if (index < filterDefinitions.length) {
- filterDefinitions[index].doFilter(servletRequest, servletResponse,
this);
+ Filter filter = findNextFilter(servletRequest, servletResponse);
+ if (filter != null) {
+ // call to the filter, which can either consume the request or
+ // recurse back into this method. (in which case we will go to
find the next filter,
+ // or dispatch to the servlet if no more filters are left)
+ filter.doFilter(servletRequest, servletResponse, this);
} else {
//we've reached the end of the filterchain, let's try to dispatch
to a servlet
final boolean serviced = servletPipeline.service(servletRequest,
servletResponse);
@@ -103,6 +104,20 @@
GuiceFilter.localContext.set(previous);
}
}
+
+ /**
+ * Iterates over the remaining filter definitions.
+ * Returns the first applicable filter, or null if none apply.
+ */
+ private Filter findNextFilter(ServletRequest servletRequest,
ServletResponse servletResponse) {
+ while (++index < filterDefinitions.length) {
+ Filter filter =
filterDefinitions[index].getFilterIfMatching(servletRequest,
servletResponse);
+ if (filter != null) {
+ return filter;
+ }
+ }
+ return null;
+ }
/**
* Removes stacktrace elements related to AOP internal mechanics from the
=======================================
--- /extensions/servlet/src/com/google/inject/servlet/FilterDefinition.java
Thu Jul 7 17:34:16 2011
+++ /extensions/servlet/src/com/google/inject/servlet/FilterDefinition.java
Sun May 27 10:42:56 2012
@@ -23,7 +23,6 @@
import com.google.inject.spi.ProviderInstanceBinding;
import com.google.inject.spi.ProviderWithExtensionVisitor;
-import java.io.IOException;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
@@ -153,20 +152,16 @@
}
}
- public void doFilter(ServletRequest servletRequest,
- ServletResponse servletResponse, FilterChainInvocation
filterChainInvocation)
- throws IOException, ServletException {
+ public Filter getFilterIfMatching(ServletRequest servletRequest,
+ ServletResponse servletResponse) {
final HttpServletRequest request = (HttpServletRequest) servletRequest;
final String path =
request.getRequestURI().substring(request.getContextPath().length());
if (shouldFilter(path)) {
- filter.get()
- .doFilter(servletRequest, servletResponse,
filterChainInvocation);
-
+ return filter.get();
} else {
- //otherwise proceed down chain anyway
- filterChainInvocation.doFilter(servletRequest, servletResponse);
+ return null;
}
}
=======================================
---
/extensions/servlet/test/com/google/inject/servlet/FilterDefinitionTest.java
Mon Oct 31 13:35:33 2011
+++
/extensions/servlet/test/com/google/inject/servlet/FilterDefinitionTest.java
Sun May 27 10:42:56 2012
@@ -128,8 +128,11 @@
assertTrue("Init did not fire", mockFilter.isInit());
+ Filter matchingFilter = filterDef.getFilterIfMatching(request, null);
+ assertSame(mockFilter, matchingFilter);
+
final boolean proceed[] = new boolean[1];
- filterDef.doFilter(request, null, new FilterChainInvocation(null,
null, null) {
+ matchingFilter.doFilter(request, null, new FilterChainInvocation(null,
null, null) {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse
servletResponse) {
proceed[0] = true;
@@ -188,8 +191,11 @@
assertTrue("init did not fire", mockFilter.isInit());
+ Filter matchingFilter = filterDef.getFilterIfMatching(request, null);
+ assertSame(mockFilter, matchingFilter);
+
final boolean proceed[] = new boolean[1];
- filterDef.doFilter(request, null, new FilterChainInvocation(null,
null, null) {
+ matchingFilter.doFilter(request, null, new FilterChainInvocation(null,
null, null) {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse
servletResponse) {
proceed[0] = true;
--
You received this message because you are subscribed to the Google Groups
"google-guice-dev" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/google-guice-dev?hl=en.