Author: aadamchik
Date: Sun Sep 17 10:14:51 2006
New Revision: 447099

URL: http://svn.apache.org/viewvc?view=rev&rev=447099
Log:
CAY-654 - rewriting context filter

Modified:
    
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/conf/WebApplicationContextFilter.java

Modified: 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/conf/WebApplicationContextFilter.java
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/conf/WebApplicationContextFilter.java?view=diff&rev=447099&r1=447098&r2=447099
==============================================================================
--- 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/conf/WebApplicationContextFilter.java
 (original)
+++ 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/conf/WebApplicationContextFilter.java
 Sun Sep 17 10:14:51 2006
@@ -17,7 +17,6 @@
  *  under the License.
  ****************************************************************/
 
-
 package org.apache.cayenne.conf;
 
 import java.io.IOException;
@@ -34,106 +33,67 @@
 import org.apache.cayenne.access.DataContext;
 
 /**
- * <p>
- * <code>WebApplicationContextFilter</code> is another helper class to help 
integrate
- * Cayenne with web applications. The implementation is similar to
- * <code>org.apache.cayenne.conf.WebApplicationContextProvider</code> however 
it
- * allows for integration with containers that support version 2.3 of the 
servlet
- * specification for example Tomcat 4.x. via the usage of filers.
- * </p>
- * <p>
- * Whenever this filter is processed it attempts bind a 
<code>DataContext</code> to the
- * thread. It retrieves the <code>DataContext</code> via the
- * <code>BasicServletConfiguration.getDefaultDataContext()</code> and binds it 
to the
- * thread using <code>DataContext.bindThreadDataContext()</code> method. If 
the session
- * has not been created this filter will also create a new session.
- * </p>
- * <p>
- * During initialization (init() method) this filter initializes the
- * <code>BasicServletConfiguration</code> with the servlet context via the
- * initializeConfiguration() method
- * </p>
- * <p>
- * This filter can be installed in the web container as a &quot;filter&quot; 
as follows:
- * 
- * <pre>
- *          &lt;filter&gt;
- *              
&lt;filter-name&gt;WebApplicationContextFilter&lt;/filter-name&gt;
- *              
&lt;filter-class&gt;org.apache.cayenne.conf.WebApplicationContextFilter&lt;/filter-class&gt;
- *         &lt;/filter&gt;
- * </pre>
- * 
- * Then the mapping needs to be created to direct all or some requests to be 
processed by
- * the filter as follows:
+ * A Servlet Filter that binds session DataContext to the current request 
thread. During
+ * the request application code without any knowledge of the servlet 
environment can
+ * access DataContext via [EMAIL PROTECTED] 
DataContext#getThreadDataContext()} method. <p/> To
+ * enable the filter add XML similar to this in the <code>web.xml</code> 
descriptor of a
+ * web application:
  * 
  * <pre>
- *         &lt;filter-mapping&gt;
- *              
&lt;filter-name&gt;WebApplicationContextFilter&lt;/filter-name&gt;
- *              &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
- *          &lt;/filter-mapping&gt;
+ *  &lt;filter&gt;
+ *   &lt;filter-name&gt;CayenneFilter&lt;/filter-name&gt;
+ *   
&lt;filter-class&gt;org.apache.cayenne.conf.WebApplicationContextFilter&lt;/filter-class&gt;
+ *   &lt;/filter&gt;
+ *   &lt;filter-mapping&gt;
+ *   &lt;filter-name&gt;CayenneFilter&lt;/filter-name&gt;
+ *   &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
+ *   &lt;/filter-mapping&gt;
  * </pre>
  * 
- * The above example the filter would be applied to all the servlets and 
static content
- * pages in the Web application, because every request URI matches the '/*' 
URL pattern.
- * The problem with this mapping however is the fact that this filter will run 
for every
- * request made, whether for images and/or static content and dynamic content 
request.
- * This maybe detrimental to performance. Hence the mapping url patter should 
be set
- * accordingly.
- * </p>
- * 
- * @author Gary Jarrel
+ * @author Andrus Adamchik
+ * @since 1.2
  */
 public class WebApplicationContextFilter implements Filter {
 
-    /**
-     * Does nothing. As per the servlet specification, gets called by the 
container when
-     * the filter is taken out of service.
-     */
-    public void destroy() {
-        // empty
+    public void init(FilterConfig filterConfig) throws ServletException {
+        
ServletUtil.initializeSharedConfiguration(filterConfig.getServletContext());
     }
 
     /**
-     * Initializes the <code>BasicServletConfiguration</code> via the
-     * initializeConfiguration() method. Also saves the FilterConfing to a 
private local
-     * variable for possible later access. This method is part of the 
<code>Filter</code>
-     * interface and is called by the container when the filter is placed into 
service.
+     * Cleanup callback method that does nothing, as the filter doesn't store 
any state.
      */
-    public synchronized void init(FilterConfig config) throws ServletException 
{
-        ServletUtil.initializeSharedConfiguration(config.getServletContext());
+    // TODO: andrus 9/17/2006 - should we shut down Cayenne stack? I.e. should 
it be
+    // complimentary to "init"?
+    public void destroy() {
+        // noop
     }
 
     /**
-     * Retrieves the <code>DataContext</code> bound to the 
<code>HttpSession</code>
-     * via <code>BasicServletConfiguration.
-
-     * getDefaultContext()</code>, and binds it to
-     * the current thread.
+     * The main worker method that binds a DataContext to the current thread 
on entry and
+     * unbinds it on exit (regardless of whether any exceptions occured in the 
request).
      */
     public void doFilter(
             ServletRequest request,
             ServletResponse response,
             FilterChain chain) throws IOException, ServletException {
 
-    
-        if (request instanceof HttpServletRequest) {
-            HttpSession session = ((HttpServletRequest) 
request).getSession(true);
-            DataContext dataContext = ServletUtil.getSessionContext(session);
+        boolean reset = false;
 
-            if (dataContext == null) {
-               
-                throw new ServletException("DataContext was null and could "
-                        + "not be bound to thread.");
-            }
+        if (request instanceof HttpServletRequest) {
+            reset = true;
 
-            DataContext.bindThreadDataContext(dataContext);
+            HttpSession session = ((HttpServletRequest) 
request).getSession(true);
+            DataContext context = ServletUtil.getSessionContext(session);
+            DataContext.bindThreadDataContext(context);
         }
-        
+
         try {
             chain.doFilter(request, response);
         }
         finally {
-            DataContext.bindThreadDataContext(null);
+            if (reset) {
+                DataContext.bindThreadDataContext(null);
+            }
         }
     }
 }


Reply via email to