Add a ServletContext ThreadLocal to RequestFactoryServlet.
http://gwt-code-reviews.appspot.com/1448804/
Patch by: larsenje
Review by: bobv


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@10212 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/web/bindery/requestfactory/server/RequestFactoryServlet.java b/user/src/com/google/web/bindery/requestfactory/server/RequestFactoryServlet.java
index 9d45633..fca199e 100644
--- a/user/src/com/google/web/bindery/requestfactory/server/RequestFactoryServlet.java
+++ b/user/src/com/google/web/bindery/requestfactory/server/RequestFactoryServlet.java
@@ -23,6 +23,7 @@
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
+import javax.servlet.ServletContext;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
@@ -43,6 +44,7 @@
    * These ThreadLocals are used to allow service objects to obtain access to
    * the HTTP transaction.
    */
+  private static final ThreadLocal<ServletContext> perThreadContext = new ThreadLocal<ServletContext>();
   private static final ThreadLocal<HttpServletRequest> perThreadRequest = new ThreadLocal<HttpServletRequest>();
   private static final ThreadLocal<HttpServletResponse> perThreadResponse = new ThreadLocal<HttpServletResponse>();
 
@@ -64,6 +66,15 @@
     return perThreadResponse.get();
   }
 
+  /**
+   * Returns the thread-local {@link ServletContext}
+   * 
+   * @return the {@link ServletContext} associated with this servlet
+   */
+  public static ServletContext getThreadLocalServletContext() {
+    return perThreadContext.get();
+  }
+
   private final SimpleRequestProcessor processor;
 
   /**
@@ -102,6 +113,7 @@
   protected void doPost(HttpServletRequest request, HttpServletResponse response)
       throws IOException, ServletException {
 
+    perThreadContext.set(getServletContext());
     perThreadRequest.set(request);
     perThreadResponse.set(response);
 
@@ -130,6 +142,7 @@
         log.log(Level.SEVERE, "Unexpected error", e);
       }
     } finally {
+      perThreadContext.set(null);
       perThreadRequest.set(null);
       perThreadResponse.set(null);
     }