View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  
20  package org.apache.myfaces.custom.conversation;
21  
22  import java.io.IOException;
23  
24  import javax.servlet.Filter;
25  import javax.servlet.FilterChain;
26  import javax.servlet.FilterConfig;
27  import javax.servlet.ServletException;
28  import javax.servlet.ServletRequest;
29  import javax.servlet.ServletResponse;
30  import javax.servlet.ServletContext;
31  import javax.servlet.http.HttpServletRequest;
32  import javax.servlet.http.HttpSession;
33  
34  public class ConversationServletFilter implements Filter
35  {
36      public final static String CONVERSATION_FILTER_CALLED = "org.apache.myfaces.conversation.ConversationServletFilter.CALLED";
37  
38      private final static ThreadLocal externalContextTL = new ThreadLocal();
39      private final static ThreadLocal conversationManagerTL = new ThreadLocal();
40  
41      private ServletContext servletContext;
42  
43      public void init(FilterConfig arg0) throws ServletException
44      {
45          servletContext = arg0.getServletContext();
46      }
47  
48      public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
49      {
50          ConversationManager conversationManager = null;
51  
52          if (!Boolean.TRUE.equals(request.getAttribute(CONVERSATION_FILTER_CALLED)))
53          {
54              if (request instanceof HttpServletRequest)
55              {
56                  HttpServletRequest httpRequest = (HttpServletRequest) request;
57                  externalContextTL.set(ConversationExternalContext.create(servletContext, httpRequest));
58  
59                  HttpSession httpSession = httpRequest.getSession(false);
60                  if (httpSession != null)
61                  {
62                      conversationManager = ConversationManager.getInstance(httpSession);
63                      if (conversationManager != null)
64                      {
65                          conversationManagerTL.set(conversationManager);
66  
67                          conversationManager.attachPersistence();
68                      }
69                  }
70              }
71  
72              request.setAttribute(CONVERSATION_FILTER_CALLED, Boolean.TRUE);
73          }
74  
75          boolean ok = false;
76          try
77          {
78              chain.doFilter(request, response);
79              ok = true;
80          }
81          finally
82          {
83              if (conversationManager != null)
84              {
85                  try
86                  {
87                      if (!ok)
88                      {
89                          conversationManager.purgePersistence();
90                      }
91                      else
92                      {
93                          conversationManager.detachPersistence();
94                      }
95                  }
96                  finally
97                  {
98                      externalContextTL.set(null);
99                      conversationManagerTL.set(null);
100                 }
101             }
102         }
103     }
104 
105     public void destroy()
106     {
107     }
108 
109     static ConversationExternalContext getConversationExternalContext()
110     {
111         return (ConversationExternalContext) externalContextTL.get();
112     }
113 
114     static ConversationManager getConversationManager()
115     {
116         return (ConversationManager) conversationManagerTL.get();
117     }
118 }