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.