Revision: 1273
Author: sberlin
Date: Sun Sep 26 15:04:09 2010
Log: fix issue 544 -- allow ServletModules to be reused w/o reconstructing new ones. also fixes a bug where a ServletModule that contained only filters would have run each filter twice if the module was being reused (or three times if it was being used a third time, etc..). thanks to mathiue.carbou for pointing out the problem.
http://code.google.com/p/google-guice/source/detail?r=1273

Added:
/trunk/extensions/servlet/test/com/google/inject/servlet/ServletModuleTest.java
Modified:
 /trunk/extensions/servlet/src/com/google/inject/servlet/ServletModule.java
 /trunk/extensions/servlet/test/com/google/inject/servlet/AllTests.java

=======================================
--- /dev/null
+++ /trunk/extensions/servlet/test/com/google/inject/servlet/ServletModuleTest.java Sun Sep 26 15:04:09 2010
@@ -0,0 +1,93 @@
+/**
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.inject.servlet;
+
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import com.google.inject.Binding;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.internal.util.Lists;
+import com.google.inject.spi.DefaultBindingTargetVisitor;
+import com.google.inject.spi.Elements;
+
+/**
+ * Tests for ServletModule, to ensure it captures bindings correctly.
+ *
+ * @author [email protected] (Sam Berlin)
+ */
+public class ServletModuleTest extends TestCase {
+
+  public void testServletModuleReuse() {
+    Module module = new Module();
+ Elements.getElements(module); // use the module once (to, say, introspect bindings)
+    Injector injector = Guice.createInjector(module);  // use it again.
+
+    Visitor visitor = new Visitor();
+ // Validate only a single servlet binding & a single filter binding exist.
+    for(Binding<?> binding : injector.getAllBindings().values()) {
+      binding.acceptTargetVisitor(visitor);
+    }
+    assertEquals("wrong linked servlets: " + visitor.linkedServlets,
+        0, visitor.linkedServlets.size());
+    assertEquals("wrong linked filters: " + visitor.linkedFilters,
+        0, visitor.linkedFilters.size());
+    assertEquals("wrong instance servlets: " + visitor.instanceServlets,
+        1, visitor.instanceServlets.size());
+    assertEquals("wrong instance filters: " + visitor.instanceFilters,
+        1, visitor.instanceFilters.size());
+  }
+
+  private static class Module extends ServletModule {
+    @Override
+    protected void configureServlets() {
+      serve("/sam/*").with(new DummyServlet());
+      filter("/tara/*").through(new DummyFilterImpl());
+    }
+  }
+
+ private static class Visitor extends DefaultBindingTargetVisitor<Object, Void> implements
+      ServletModuleTargetVisitor<Object, Void> {
+    List<LinkedFilterBinding> linkedFilters = Lists.newArrayList();
+    List<LinkedServletBinding> linkedServlets = Lists.newArrayList();
+    List<InstanceFilterBinding> instanceFilters = Lists.newArrayList();
+    List<InstanceServletBinding> instanceServlets = Lists.newArrayList();
+
+    public Void visit(LinkedFilterBinding binding) {
+      linkedFilters.add(binding);
+      return null;
+    }
+
+    public Void visit(InstanceFilterBinding binding) {
+      instanceFilters.add(binding);
+      return null;
+    }
+
+    public Void visit(LinkedServletBinding binding) {
+      linkedServlets.add(binding);
+      return null;
+    }
+
+    public Void visit(InstanceServletBinding binding) {
+      instanceServlets.add(binding);
+      return null;
+    }
+  }
+
+}
=======================================
--- /trunk/extensions/servlet/src/com/google/inject/servlet/ServletModule.java Sun Aug 22 16:08:21 2010 +++ /trunk/extensions/servlet/src/com/google/inject/servlet/ServletModule.java Sun Sep 26 15:04:09 2010
@@ -16,6 +16,8 @@

 package com.google.inject.servlet;

+import static com.google.inject.internal.util.Preconditions.checkState;
+
 import com.google.inject.AbstractModule;
 import com.google.inject.Key;
 import com.google.inject.internal.util.Lists;
@@ -39,13 +41,22 @@

   @Override
   protected final void configure() {
-    // Install common bindings (skipped if already installed).
-    install(new InternalServletModule());
-
-    // Install local filter and servlet bindings.
-    configureServlets();
-    install(filtersModuleBuilder);
-    install(servletsModuleBuilder);
+    checkState(filtersModuleBuilder == null, "Re-entry is not allowed.");
+    checkState(servletsModuleBuilder == null, "Re-entry is not allowed.");
+    filtersModuleBuilder = new FiltersModuleBuilder();
+    servletsModuleBuilder = new ServletsModuleBuilder();
+    try {
+      // Install common bindings (skipped if already installed).
+      install(new InternalServletModule());
+
+      // Install local filter and servlet bindings.
+      configureServlets();
+      install(filtersModuleBuilder);
+      install(servletsModuleBuilder);
+    } finally {
+      filtersModuleBuilder = null;
+      servletsModuleBuilder = null;
+    }
   }

   /**
@@ -219,8 +230,8 @@
   }


- private final FiltersModuleBuilder filtersModuleBuilder = new FiltersModuleBuilder(); - private final ServletsModuleBuilder servletsModuleBuilder = new ServletsModuleBuilder();
+  private FiltersModuleBuilder filtersModuleBuilder;
+  private ServletsModuleBuilder servletsModuleBuilder;

   /**
* @param urlPattern Any Servlet-style pattern. examples: /*, /html/*, *.html, etc.
=======================================
--- /trunk/extensions/servlet/test/com/google/inject/servlet/AllTests.java Sun Aug 22 11:48:23 2010 +++ /trunk/extensions/servlet/test/com/google/inject/servlet/AllTests.java Sun Sep 26 15:04:09 2010
@@ -34,6 +34,7 @@
     suite.addTestSuite(FilterPipelineTest.class);

     // Servlet + integration tests.
+    suite.addTestSuite(ServletModuleTest.class);
     suite.addTestSuite(ServletTest.class);
     suite.addTestSuite(ServletDefinitionTest.class);
     suite.addTestSuite(ServletDefinitionPathsTest.class);

--
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.

Reply via email to