1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 }