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.