Revision: 1592
Author:   [email protected]
Date:     Sun Oct 16 15:35:11 2011
Log:
Allow creation of a GuiceFilter that scopes, but does not dispatch to
ServletModule-bound servlets / filters.

@ScopingOnly GuiceFilter


Revision created by MOE tool push_codebase.
MOE_MIGRATION=3476

http://code.google.com/p/google-guice/source/detail?r=1592

Added:
 /trunk/extensions/servlet/src/com/google/inject/servlet/ScopingOnly.java
Modified:
/trunk/extensions/servlet/src/com/google/inject/servlet/DefaultFilterPipeline.java
 /trunk/extensions/servlet/src/com/google/inject/servlet/GuiceFilter.java
/trunk/extensions/servlet/src/com/google/inject/servlet/InternalServletModule.java /trunk/extensions/servlet/test/com/google/inject/servlet/ServletSpiVisitor.java
 /trunk/extensions/servlet/test/com/google/inject/servlet/ServletTest.java

=======================================
--- /dev/null
+++ /trunk/extensions/servlet/src/com/google/inject/servlet/ScopingOnly.java Sun Oct 16 15:35:11 2011
@@ -0,0 +1,36 @@
+/**
+ * Copyright (C) 2011 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 static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.inject.BindingAnnotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+/**
+ * Annotates a {@link GuiceFilter} that provides scope functionality, but
+ * doesn't dispatch to {@link ServletModule} bound servlets or filters.
+ *
+ * @author [email protected] (Isaac Shum)
+ */
+@Retention(RUNTIME)
+@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
+@BindingAnnotation
+public @interface ScopingOnly {}
=======================================
--- /trunk/extensions/servlet/src/com/google/inject/servlet/DefaultFilterPipeline.java Thu Jul 7 17:34:16 2011 +++ /trunk/extensions/servlet/src/com/google/inject/servlet/DefaultFilterPipeline.java Sun Oct 16 15:35:11 2011
@@ -15,8 +15,6 @@
  */
 package com.google.inject.servlet;

-import com.google.inject.Singleton;
-
 import java.io.IOException;

 import javax.servlet.FilterChain;
@@ -31,7 +29,6 @@
  * @author [email protected] (Dhanji R. Prasanna)
* @see com.google.inject.servlet.ManagedFilterPipeline See Also ManagedFilterPipeline.
  */
-@Singleton
 class DefaultFilterPipeline implements FilterPipeline {
   public void initPipeline(ServletContext context) {
   }
=======================================
--- /trunk/extensions/servlet/src/com/google/inject/servlet/GuiceFilter.java Sun Oct 16 15:34:21 2011 +++ /trunk/extensions/servlet/src/com/google/inject/servlet/GuiceFilter.java Sun Oct 16 15:35:11 2011
@@ -64,8 +64,7 @@
   /**
* We allow both the static and dynamic versions of the pipeline to exist.
    */
-  @Inject
-  private final FilterPipeline injectedPipeline = null;
+  private final FilterPipeline injectedPipeline;

   /** Used to inject the servlets configured via {@link ServletModule} */
   static volatile WeakReference<ServletContext> servletContext =
@@ -79,6 +78,15 @@
       + "ignore this message. If this is NOT deliberate however, "
       + "your application may not work as expected.";

+  public GuiceFilter() {
+    // Use the static FilterPipeline
+    this(null);
+  }
+
+  @Inject GuiceFilter(FilterPipeline filterPipeline) {
+    injectedPipeline = filterPipeline;
+  }
+
   //VisibleForTesting
   @Inject
   static void setPipeline(FilterPipeline pipeline) {
@@ -103,8 +111,7 @@
       ServletResponse servletResponse, FilterChain filterChain)
       throws IOException, ServletException {

- // Prefer the injected pipeline, but fall back on the static one for web.xml users. - FilterPipeline filterPipeline = null != injectedPipeline ? injectedPipeline : pipeline;
+    FilterPipeline filterPipeline = getFilterPipeline();

     Context previous = GuiceFilter.localContext.get();
     HttpServletRequest request = (HttpServletRequest) servletRequest;
@@ -181,7 +188,7 @@
     // In the default pipeline, this is a noop. However, if replaced
     // by a managed pipeline, a lazy init will be triggered the first time
     // dispatch occurs.
- FilterPipeline filterPipeline = null != injectedPipeline ? injectedPipeline : pipeline;
+    FilterPipeline filterPipeline = getFilterPipeline();
     filterPipeline.initPipeline(servletContext);
   }

@@ -189,7 +196,7 @@

     try {
       // Destroy all registered filters & servlets in that order
- FilterPipeline filterPipeline = null != injectedPipeline ? injectedPipeline : pipeline;
+      FilterPipeline filterPipeline = getFilterPipeline();
       filterPipeline.destroyPipeline();

     } finally {
@@ -197,4 +204,9 @@
       servletContext.clear();
     }
   }
-}
+
+  private FilterPipeline getFilterPipeline() {
+ // Prefer the injected pipeline, but fall back on the static one for web.xml users.
+    return (null != injectedPipeline) ? injectedPipeline : pipeline;
+  }
+}
=======================================
--- /trunk/extensions/servlet/src/com/google/inject/servlet/InternalServletModule.java Fri Sep 9 14:22:45 2011 +++ /trunk/extensions/servlet/src/com/google/inject/servlet/InternalServletModule.java Sun Oct 16 15:35:11 2011
@@ -93,6 +93,10 @@
bind(ServletContext.class).toProvider(BackwardsCompatibleServletContextProvider.class);
     bind(BackwardsCompatibleServletContextProvider.class);
   }
+
+ @Provides @Singleton @ScopingOnly GuiceFilter provideScopingOnlyGuiceFilter() {
+    return new GuiceFilter(new DefaultFilterPipeline());
+  }

   @Provides @RequestScoped HttpServletRequest provideHttpServletRequest() {
     return GuiceFilter.getRequest();
=======================================
--- /trunk/extensions/servlet/test/com/google/inject/servlet/ServletSpiVisitor.java Fri Sep 9 14:22:45 2011 +++ /trunk/extensions/servlet/test/com/google/inject/servlet/ServletSpiVisitor.java Sun Oct 16 15:35:11 2011
@@ -63,7 +63,8 @@
ServletResponse.class, ManagedFilterPipeline.class, ManagedServletPipeline.class, FilterPipeline.class, ServletContext.class, HttpServletRequest.class, Filter.class, HttpServletResponse.class, HttpSession.class, Map.class, HttpServlet.class, - InternalServletModule.BackwardsCompatibleServletContextProvider.class); + InternalServletModule.BackwardsCompatibleServletContextProvider.class,
+        GuiceFilter.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);
=======================================
--- /trunk/extensions/servlet/test/com/google/inject/servlet/ServletTest.java Tue Sep 27 08:36:19 2011 +++ /trunk/extensions/servlet/test/com/google/inject/servlet/ServletTest.java Sun Oct 16 15:35:11 2011
@@ -370,6 +370,47 @@
assertTrue(deserializedSession.getAttribute(inSessionKey) instanceof InSession); assertEquals(NullObject.INSTANCE, deserializedSession.getAttribute(inSessionNullKey));
   }
+
+  public void testGuiceFilterConstructors() throws Exception {
+    final RuntimeException servletException = new RuntimeException();
+    final RuntimeException chainException = new RuntimeException();
+    final Injector injector = createInjector(new ServletModule() {
+      @Override protected void configureServlets() {
+        serve("/*").with(new HttpServlet() {
+ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
+            throw servletException;
+          }
+        });
+      }
+    });
+    final HttpServletRequest request = newFakeHttpServletRequest();
+    FilterChain filterChain = new FilterChain() {
+      public void doFilter(ServletRequest servletRequest,
+          ServletResponse servletResponse) {
+        throw chainException;
+      }
+    };
+
+    try {
+      new GuiceFilter().doFilter(request, null, filterChain);
+      fail();
+    } catch (RuntimeException e) {
+      assertSame(servletException, e);
+    }
+    try {
+ injector.getInstance(GuiceFilter.class).doFilter(request, null, filterChain);
+      fail();
+    } catch (RuntimeException e) {
+      assertSame(servletException, e);
+    }
+    try {
+      injector.getInstance(Key.get(GuiceFilter.class, ScopingOnly.class))
+          .doFilter(request, null, filterChain);
+      fail();
+    } catch (RuntimeException e) {
+      assertSame(chainException, e);
+    }
+  }

private static class ThrowingInvocationHandler implements InvocationHandler { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

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