Revision: 389cb718a70c
Author: Sam Berlin <[email protected]>
Date: Sun May 27 10:44:06 2012
Log: Fixed exception in contextpath string manipulation.
Revision created by MOE tool push_codebase.
MOE_MIGRATION=4880
http://code.google.com/p/google-guice/source/detail?r=389cb718a70c
Added:
/extensions/servlet/src/com/google/inject/servlet/ServletUtils.java
/extensions/servlet/test/com/google/inject/servlet/ServletUtilsTest.java
Modified:
/extensions/servlet/src/com/google/inject/servlet/FilterDefinition.java
/extensions/servlet/src/com/google/inject/servlet/ServletDefinition.java
/extensions/servlet/test/com/google/inject/servlet/FilterDefinitionTest.java
/extensions/servlet/test/com/google/inject/servlet/ServletDefinitionTest.java
=======================================
--- /dev/null
+++ /extensions/servlet/src/com/google/inject/servlet/ServletUtils.java Sun
May 27 10:44:06 2012
@@ -0,0 +1,38 @@
+// Copyright 2012 Google Inc. All Rights Reserved.
+
+package com.google.inject.servlet;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * Some servlet utility methods.
+ *
+ * @author [email protected] (Michael Tang)
+ */
+final class ServletUtils {
+ private ServletUtils() {
+ // private to prevent instantiation.
+ }
+
+ /**
+ * Gets the context path relative path of the URI. Returns the path of
the
+ * resource relative to the context path for a request's URI, or null if
no
+ * path can be extracted.
+ */
+ // @Nullable
+ public static String getContextRelativePath(
+ // @Nullable
+ final HttpServletRequest request) {
+ if (request != null) {
+ String contextPath = request.getContextPath();
+ String requestURI = request.getRequestURI();
+ if (contextPath.length() < requestURI.length()) {
+ return requestURI.substring(contextPath.length());
+ } else if (requestURI != null && requestURI.trim().length() > 0 &&
+ contextPath.length() == requestURI.length()) {
+ return "/";
+ }
+ }
+ return null;
+ }
+}
=======================================
--- /dev/null
+++
/extensions/servlet/test/com/google/inject/servlet/ServletUtilsTest.java
Sun May 27 10:44:06 2012
@@ -0,0 +1,58 @@
+// Copyright 2012 Google Inc. All Rights Reserved.
+
+package com.google.inject.servlet;
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+
+import junit.framework.TestCase;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * Unit test for the servlet utility class.
+ *
+ * @author [email protected] (Michael Tang)
+ */
+public class ServletUtilsTest extends TestCase {
+ public void testGetContextRelativePath() {
+ HttpServletRequest servletRequest =
createMock(HttpServletRequest.class);
+ expect(servletRequest.getContextPath()).andReturn("/a_context_path");
+
expect(servletRequest.getRequestURI()).andReturn("/a_context_path/test.html");
+ replay(servletRequest);
+ String path = ServletUtils.getContextRelativePath(servletRequest);
+ assertEquals("/test.html", path);
+ verify(servletRequest);
+ }
+
+ public void testGetContextRelativePathWithWrongPath() {
+ HttpServletRequest servletRequest =
createMock(HttpServletRequest.class);
+ expect(servletRequest.getContextPath()).andReturn("/a_context_path");
+ expect(servletRequest.getRequestURI()).andReturn("/test.html");
+ replay(servletRequest);
+ String path = ServletUtils.getContextRelativePath(servletRequest);
+ assertNull(path);
+ verify(servletRequest);
+ }
+
+ public void testGetContextRelativePathWithRootPath() {
+ HttpServletRequest servletRequest =
createMock(HttpServletRequest.class);
+ expect(servletRequest.getContextPath()).andReturn("/a_context_path");
+ expect(servletRequest.getRequestURI()).andReturn("/a_context_path");
+ replay(servletRequest);
+ String path = ServletUtils.getContextRelativePath(servletRequest);
+ assertEquals("/", path);
+ verify(servletRequest);
+ }
+
+ public void testGetContextRelativePathWithEmptyPath() {
+ HttpServletRequest servletRequest =
createMock(HttpServletRequest.class);
+ expect(servletRequest.getContextPath()).andReturn("");
+ expect(servletRequest.getRequestURI()).andReturn("");
+ replay(servletRequest);
+ String path = ServletUtils.getContextRelativePath(servletRequest);
+ assertNull(path);
+ verify(servletRequest);
+ }
+}
=======================================
--- /extensions/servlet/src/com/google/inject/servlet/FilterDefinition.java
Sun May 27 10:43:31 2012
+++ /extensions/servlet/src/com/google/inject/servlet/FilterDefinition.java
Sun May 27 10:44:06 2012
@@ -60,11 +60,11 @@
this.initParams = Collections.unmodifiableMap(new HashMap<String,
String>(initParams));
this.filterInstance = filterInstance;
}
-
+
public FilterDefinition get() {
return this;
}
-
+
public <B, V> V acceptExtensionVisitor(BindingTargetVisitor<B, V>
visitor,
ProviderInstanceBinding<? extends B> binding) {
if(visitor instanceof ServletModuleTargetVisitor) {
@@ -73,7 +73,7 @@
new InstanceFilterBindingImpl(initParams,
pattern,
filterInstance,
- patternMatcher));
+ patternMatcher));
} else {
return ((ServletModuleTargetVisitor<B, V>)visitor).visit(
new LinkedFilterBindingImpl(initParams,
@@ -87,7 +87,7 @@
}
private boolean shouldFilter(String uri) {
- return patternMatcher.matches(uri);
+ return uri != null && patternMatcher.matches(uri);
}
public void init(final ServletContext servletContext, Injector injector,
@@ -133,7 +133,7 @@
public void destroy(Set<Filter> destroyedSoFar) {
// filters are always singletons
Filter reference = filter.get();
-
+
// Do nothing if this Filter was invalid (usually due to not being
scoped
// properly), or was already destroyed. According to Servlet Spec: it
is
// "out of service", and does not need to be destroyed.
@@ -152,8 +152,7 @@
public Filter getFilterIfMatching(HttpServletRequest request) {
- final String path =
request.getRequestURI().substring(request.getContextPath().length());
-
+ final String path = ServletUtils.getContextRelativePath(request);
if (shouldFilter(path)) {
return filter.get();
} else {
=======================================
---
/extensions/servlet/src/com/google/inject/servlet/ServletDefinition.java
Tue Sep 27 08:36:19 2011
+++
/extensions/servlet/src/com/google/inject/servlet/ServletDefinition.java
Sun May 27 10:44:06 2012
@@ -68,11 +68,11 @@
this.initParams = Collections.unmodifiableMap(new HashMap<String,
String>(initParams));
this.servletInstance = servletInstance;
}
-
+
public ServletDefinition get() {
return this;
}
-
+
public <B, V> V acceptExtensionVisitor(BindingTargetVisitor<B, V>
visitor,
ProviderInstanceBinding<? extends B> binding) {
if(visitor instanceof ServletModuleTargetVisitor) {
@@ -81,7 +81,7 @@
new InstanceServletBindingImpl(initParams,
pattern,
servletInstance,
- patternMatcher));
+ patternMatcher));
} else {
return ((ServletModuleTargetVisitor<B, V>)visitor).visit(
new LinkedServletBindingImpl(initParams,
@@ -95,7 +95,7 @@
}
boolean shouldServe(String uri) {
- return patternMatcher.matches(uri);
+ return uri != null && patternMatcher.matches(uri);
}
public void init(final ServletContext servletContext, Injector injector,
@@ -163,7 +163,7 @@
*
* @return Returns true if this servlet triggered for the given request.
Or false if
* guice-servlet should continue dispatching down the servlet
pipeline.
- *
+ *
* @throws IOException If thrown by underlying servlet
* @throws ServletException If thrown by underlying servlet
*/
@@ -171,7 +171,7 @@
ServletResponse servletResponse) throws IOException,
ServletException {
final HttpServletRequest request = (HttpServletRequest) servletRequest;
- final String path =
request.getRequestURI().substring(request.getContextPath().length());
+ final String path = ServletUtils.getContextRelativePath(request);
final boolean serve = shouldServe(path);
=======================================
---
/extensions/servlet/test/com/google/inject/servlet/FilterDefinitionTest.java
Sun May 27 10:43:31 2012
+++
/extensions/servlet/test/com/google/inject/servlet/FilterDefinitionTest.java
Sun May 27 10:44:06 2012
@@ -6,6 +6,7 @@
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
+import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.google.inject.Binding;
@@ -28,6 +29,7 @@
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
/**
* Tests the lifecycle of the encapsulated {@link FilterDefinition} class.
@@ -56,14 +58,9 @@
//some init params
//noinspection SSBasedInspection
- final Map<String, String> initParams = new HashMap<String, String>() {{
- put("ahsd", "asdas24dok");
- put("ahssd", "asdasd124ok");
- put("ahfsasd", "asda124sdok");
- put("ahsasgd", "a124sdasdok");
- put("ahsd124124", "as124124124dasdok");
- }};
-
+ final Map<String, String> initParams = new
ImmutableMap.Builder<String, String>()
+ .put("ahsd", "asdas24dok")
+ .put("ahssd", "asdasd124ok").build();
ServletContext servletContext = createMock(ServletContext.class);
final String contextName = "thing__!@@44";
@@ -90,7 +87,7 @@
assertTrue(initParams.containsKey(name));
assertTrue(initParams.get(name).equals(filterConfig.getInitParameter(name)));
}
-
+
verify(binding, injector, servletContext);
}
@@ -167,7 +164,7 @@
.andReturn(true);
expect(injector.getBinding(Key.get(Filter.class)))
.andReturn(binding);
-
+
expect(injector.getInstance(Key.get(Filter.class)))
.andReturn(mockFilter)
.anyTimes();
@@ -210,6 +207,78 @@
verify(injector, request);
}
+
+ public void testGetFilterIfMatching() throws ServletException {
+ String pattern = "/*";
+ final FilterDefinition filterDef = new FilterDefinition(pattern,
Key.get(Filter.class),
+ UriPatternType.get(UriPatternType.SERVLET, pattern),
+ new HashMap<String, String>(), null);
+ HttpServletRequest servletRequest =
createMock(HttpServletRequest.class);
+ ServletContext servletContext = createMock(ServletContext.class);
+ Injector injector = createMock(Injector.class);
+ Binding binding = createMock(Binding.class);
+
+ final MockFilter mockFilter = new MockFilter() {
+ @Override
+ public void doFilter(ServletRequest servletRequest, ServletResponse
servletResponse,
+ FilterChain filterChain) {
+ //suppress rest of chain...
+ }
+ };
+ expect(injector.getBinding(Key.get(Filter.class)))
+ .andReturn(binding);
+ expect(binding.acceptScopingVisitor((BindingScopingVisitor)
anyObject()))
+ .andReturn(true);
+ expect(injector.getInstance(Key.get(Filter.class)))
+ .andReturn(mockFilter)
+ .anyTimes();
+
+ expect(servletRequest.getContextPath()).andReturn("/a_context_path");
+
expect(servletRequest.getRequestURI()).andReturn("/a_context_path/test.html");
+
+ replay(servletRequest, binding, injector);
+ filterDef.init(servletContext, injector,
+ Sets.newSetFromMap(Maps.<Filter, Boolean>newIdentityHashMap()));
+ Filter filter = filterDef.getFilterIfMatching(servletRequest);
+ assertSame(filter, mockFilter);
+ verify(servletRequest, binding, injector);
+ }
+
+ public void testGetFilterIfMatchingNotMatching() throws ServletException
{
+ String pattern = "/*";
+ final FilterDefinition filterDef = new FilterDefinition(pattern,
Key.get(Filter.class),
+ UriPatternType.get(UriPatternType.SERVLET, pattern),
+ new HashMap<String, String>(), null);
+ HttpServletRequest servletRequest =
createMock(HttpServletRequest.class);
+ ServletContext servletContext = createMock(ServletContext.class);
+ Injector injector = createMock(Injector.class);
+ Binding binding = createMock(Binding.class);
+
+ final MockFilter mockFilter = new MockFilter() {
+ @Override
+ public void doFilter(ServletRequest servletRequest, ServletResponse
servletResponse,
+ FilterChain filterChain) {
+ //suppress rest of chain...
+ }
+ };
+ expect(injector.getBinding(Key.get(Filter.class)))
+ .andReturn(binding);
+ expect(binding.acceptScopingVisitor((BindingScopingVisitor)
anyObject()))
+ .andReturn(true);
+ expect(injector.getInstance(Key.get(Filter.class)))
+ .andReturn(mockFilter)
+ .anyTimes();
+
+ expect(servletRequest.getContextPath()).andReturn("/a_context_path");
+ expect(servletRequest.getRequestURI()).andReturn("/test.html");
+
+ replay(servletRequest, binding, injector);
+ filterDef.init(servletContext, injector,
+ Sets.newSetFromMap(Maps.<Filter, Boolean>newIdentityHashMap()));
+ Filter filter = filterDef.getFilterIfMatching(servletRequest);
+ assertNull(filter);
+ verify(servletRequest, binding, injector);
+ }
private static class MockFilter implements Filter {
private boolean init;
=======================================
---
/extensions/servlet/test/com/google/inject/servlet/ServletDefinitionTest.java
Thu Jul 7 17:34:16 2011
+++
/extensions/servlet/test/com/google/inject/servlet/ServletDefinitionTest.java
Sun May 27 10:44:06 2012
@@ -22,6 +22,7 @@
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
+import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.google.inject.Binding;
@@ -31,14 +32,16 @@
import junit.framework.TestCase;
+import java.io.IOException;
import java.util.Enumeration;
-import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
/**
* Basic unit test for lifecycle of a ServletDefinition (wrapper).
@@ -65,15 +68,9 @@
//some init params
//noinspection SSBasedInspection
- final Map<String, String> initParams = new HashMap<String, String>() {
- {
- put("ahsd", "asdas24dok");
- put("ahssd", "asdasd124ok");
- put("ahfsasd", "asda124sdok");
- put("ahsasgd", "a124sdasdok");
- put("ahsd124124", "as124124124dasdok");
- }
- };
+ final Map<String, String> initParams = new
ImmutableMap.Builder<String, String>()
+ .put("ahsd", "asdas24dok")
+ .put("ahssd", "asdasd124ok").build();
String pattern = "/*";
final ServletDefinition servletDefinition = new
ServletDefinition(pattern,
@@ -101,7 +98,28 @@
assertTrue(initParams.containsKey(name));
assertEquals(initParams.get(name),
servletConfig.getInitParameter(name));
}
-
+
verify(injector, binding, servletContext);
}
-}
+
+ public void testServiceWithContextPath() throws IOException,
ServletException {
+ String pattern = "/*";
+ //some init params
+ Map<String, String> initParams = new ImmutableMap.Builder<String,
String>()
+ .put("ahsd", "asdas24dok")
+ .put("ahssd", "asdasd124ok")
+ .build();
+
+ final ServletDefinition servletDefinition = new
ServletDefinition(pattern,
+ Key.get(HttpServlet.class),
UriPatternType.get(UriPatternType.SERVLET, pattern),
+ initParams, null);
+ HttpServletResponse servletResponse =
createMock(HttpServletResponse.class);
+ HttpServletRequest servletRequest =
createMock(HttpServletRequest.class);
+
+ expect(servletRequest.getContextPath()).andReturn("/a_context_path");
+ expect(servletRequest.getRequestURI()).andReturn("/test.html");
+ replay(servletRequest, servletResponse);
+ servletDefinition.service(servletRequest, servletResponse);
+ verify(servletRequest, servletResponse);
+ }
+}
--
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.