Make ServletModule work with requireExplicitBinding().

Revision created by MOE tool push_codebase.
MOE_MIGRATION=3207


git-svn-id: https://google-guice.googlecode.com/svn/trunk@1581 d779f126-a31b-0410-b53b-1d3aecad763e
diff --git a/extensions/servlet/src/com/google/inject/servlet/InternalServletModule.java b/extensions/servlet/src/com/google/inject/servlet/InternalServletModule.java
index cbbc912..c0a9669 100644
--- a/extensions/servlet/src/com/google/inject/servlet/InternalServletModule.java
+++ b/extensions/servlet/src/com/google/inject/servlet/InternalServletModule.java
@@ -91,6 +91,7 @@
     bind(FilterPipeline.class).to(ManagedFilterPipeline.class).asEagerSingleton();
 
     bind(ServletContext.class).toProvider(BackwardsCompatibleServletContextProvider.class);
+    bind(BackwardsCompatibleServletContextProvider.class);
   }
 
   @Provides @RequestScoped HttpServletRequest provideHttpServletRequest() {
diff --git a/extensions/servlet/test/com/google/inject/servlet/ExtensionSpiTest.java b/extensions/servlet/test/com/google/inject/servlet/ExtensionSpiTest.java
index 2e5c693..e6ca1cf 100644
--- a/extensions/servlet/test/com/google/inject/servlet/ExtensionSpiTest.java
+++ b/extensions/servlet/test/com/google/inject/servlet/ExtensionSpiTest.java
@@ -37,22 +37,22 @@
 
 /**
  * A very basic test that servletmodule works with bindings.
- * 
+ *
  * @author sameb@google.com (Sam Berlin)
  */
 public class ExtensionSpiTest extends TestCase {
-  
+
   private DummyFilterImpl dummyFilter1 = new DummyFilterImpl();
   private DummyFilterImpl dummyFilter2 = new DummyFilterImpl();
   private DummyFilterImpl dummyFilter3 = new DummyFilterImpl();
   private DummyFilterImpl dummyFilter4 = new DummyFilterImpl();
-  
+
   private DummyServlet dummyServlet1 = new DummyServlet();
   private DummyServlet dummyServlet2 = new DummyServlet();
   private DummyServlet dummyServlet3 = new DummyServlet();
   private DummyServlet dummyServlet4 = new DummyServlet();
-  
-  public final void testSpiOnElements() {    
+
+  public final void testSpiOnElements() {
     ServletSpiVisitor visitor = new ServletSpiVisitor(false);
     int count = 0;
     for(Element element : Elements.getElements(new Module())) {
@@ -62,7 +62,7 @@
     }
     validateVisitor(visitor);
   }
-  
+
   public final void testSpiOnInjector() {
     ServletSpiVisitor visitor = new ServletSpiVisitor(true);
     int count = 0;
@@ -72,10 +72,10 @@
     }
     validateVisitor(visitor);
   }
-  
+
   private void validateVisitor(ServletSpiVisitor visitor) {
     assertEquals(48, visitor.currentCount - visitor.otherCount);
-    
+
     // This is the expected param list, in order..
     List<Params> expected = ImmutableList.of(
         new Params("/class", Key.get(DummyFilterImpl.class), ImmutableMap.of(), SERVLET),
@@ -90,7 +90,7 @@
         new Params("/key/keyvalues/2", Key.get(DummyFilterImpl.class, Names.named("foo")), ImmutableMap.of("key", "value"), SERVLET),
         new Params("/instance/keyvalues", dummyFilter2, ImmutableMap.of("key", "value"), SERVLET),
         new Params("/instance/keyvalues/2", dummyFilter2, ImmutableMap.of("key", "value"), SERVLET),
-        
+
         new Params("/class[0-9]", Key.get(DummyFilterImpl.class), ImmutableMap.of(), REGEX),
         new Params("/class[0-9]/2", Key.get(DummyFilterImpl.class), ImmutableMap.of(), REGEX),
         new Params("/key[0-9]", Key.get(DummyFilterImpl.class, Names.named("foo")), ImmutableMap.of(), REGEX),
@@ -103,7 +103,7 @@
         new Params("/key[0-9]/keyvalues/2", Key.get(DummyFilterImpl.class, Names.named("foo")), ImmutableMap.of("key", "value"), REGEX),
         new Params("/instance[0-9]/keyvalues", dummyFilter4, ImmutableMap.of("key", "value"), REGEX),
         new Params("/instance[0-9]/keyvalues/2", dummyFilter4, ImmutableMap.of("key", "value"), REGEX),
-        
+
         new Params("/class", Key.get(DummyServlet.class), ImmutableMap.of(), SERVLET),
         new Params("/class/2", Key.get(DummyServlet.class), ImmutableMap.of(), SERVLET),
         new Params("/key", Key.get(DummyServlet.class, Names.named("foo")), ImmutableMap.of(), SERVLET),
@@ -116,7 +116,7 @@
         new Params("/key/keyvalues/2", Key.get(DummyServlet.class, Names.named("foo")), ImmutableMap.of("key", "value"), SERVLET),
         new Params("/instance/keyvalues", dummyServlet2, ImmutableMap.of("key", "value"), SERVLET),
         new Params("/instance/keyvalues/2", dummyServlet2, ImmutableMap.of("key", "value"), SERVLET),
-        
+
         new Params("/class[0-9]", Key.get(DummyServlet.class), ImmutableMap.of(), REGEX),
         new Params("/class[0-9]/2", Key.get(DummyServlet.class), ImmutableMap.of(), REGEX),
         new Params("/key[0-9]", Key.get(DummyServlet.class, Names.named("foo")), ImmutableMap.of(), REGEX),
@@ -130,7 +130,7 @@
         new Params("/instance[0-9]/keyvalues", dummyServlet4, ImmutableMap.of("key", "value"), REGEX),
         new Params("/instance[0-9]/keyvalues/2", dummyServlet4, ImmutableMap.of("key", "value"), REGEX)
     );
-    
+
     assertEquals(expected.size(), visitor.actual.size());
     Iterator<Params> actualIterator = visitor.actual.iterator();
     int i = 0;
@@ -142,6 +142,8 @@
   private class Module extends ServletModule {
     @Override
     protected void configureServlets() {
+      binder().requireExplicitBindings();
+
       filter("/class", "/class/2").through(DummyFilterImpl.class);
       filter("/key", "/key/2").through(
           Key.get(DummyFilterImpl.class, Names.named("foo")));
@@ -186,6 +188,5 @@
       serveRegex("/instance[0-9]/keyvalues", "/instance[0-9]/keyvalues/2").with(
           dummyServlet4, ImmutableMap.of("key", "value"));
     }
-  };
-  
+  }
 }
diff --git a/extensions/servlet/test/com/google/inject/servlet/ServletSpiVisitor.java b/extensions/servlet/test/com/google/inject/servlet/ServletSpiVisitor.java
index c155cf3..cddb85d 100644
--- a/extensions/servlet/test/com/google/inject/servlet/ServletSpiVisitor.java
+++ b/extensions/servlet/test/com/google/inject/servlet/ServletSpiVisitor.java
@@ -42,49 +42,50 @@
 
 /**
  * A visitor for testing the servlet SPI extension.
- * 
+ *
  * @author sameb@google.com (Sam Berlin)
  */
 class ServletSpiVisitor
     extends DefaultBindingTargetVisitor<Object, Integer>
     implements ServletModuleTargetVisitor<Object, Integer> {
-  
+
   int otherCount = 0;
   int currentCount = 0;
   List<Params> actual = Lists.newArrayList();
-  
+
   /* The set of classes that are allowed to be "other" bindings. */
   Set<Class> allowedClasses;
-  
+
   ServletSpiVisitor(boolean forInjector) {
     ImmutableSet.Builder<Class> builder = ImmutableSet.builder();
     // always ignore these things...
     builder.add(ServletRequest.class,
         ServletResponse.class, ManagedFilterPipeline.class, ManagedServletPipeline.class,
         FilterPipeline.class, ServletContext.class, HttpServletRequest.class, Filter.class,
-        HttpServletResponse.class, HttpSession.class, Map.class, HttpServlet.class);
+        HttpServletResponse.class, HttpSession.class, Map.class, HttpServlet.class,
+        InternalServletModule.BackwardsCompatibleServletContextProvider.class);
     if(forInjector) {
       // only ignore these if this is for the live injector, any other time it'd be an error!
       builder.add(Injector.class, Stage.class, Logger.class);
     }
     this.allowedClasses = builder.build();
   }
-  
+
   public Integer visit(InstanceFilterBinding binding) {
     actual.add(new Params(binding, binding.getFilterInstance()));
     return currentCount++;
   }
-  
+
   public Integer visit(InstanceServletBinding binding) {
     actual.add(new Params(binding, binding.getServletInstance()));
     return currentCount++;
   }
-  
+
   public Integer visit(LinkedFilterBinding binding) {
     actual.add(new Params(binding, binding.getLinkedKey()));
     return currentCount++;
   }
-  
+
   public Integer visit(LinkedServletBinding binding) {
     actual.add(new Params(binding, binding.getLinkedKey()));
     return currentCount++;
@@ -98,27 +99,27 @@
     otherCount++;
     return currentCount++;
   }
-  
+
   static class Params {
     private final String pattern;
     private final Object keyOrInstance;
     private final Map<String, String> params;
     private final UriPatternType patternType;
-    
+
     Params(ServletModuleBinding binding, Object keyOrInstance) {
       this.pattern = binding.getPattern();
       this.keyOrInstance = keyOrInstance;
       this.params = binding.getInitParams();
       this.patternType = binding.getUriPatternType();
     }
-    
+
     Params(String pattern, Object keyOrInstance, Map params, UriPatternType patternType) {
       this.pattern = pattern;
       this.keyOrInstance = keyOrInstance;
       this.params = params;
       this.patternType = patternType;
     }
-    
+
     @Override
     public boolean equals(Object obj) {
       if(obj instanceof Params) {
@@ -136,7 +137,7 @@
     public int hashCode() {
       return Objects.hashCode(pattern, keyOrInstance, params, patternType);
     }
-    
+
     @Override
     public String toString() {
       return Objects.toStringHelper(Params.class)