1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.myfaces.webapp;
20
21 import java.util.Enumeration;
22 import javax.faces.context.ExceptionHandler;
23 import javax.faces.context.ExternalContext;
24 import javax.faces.context.FacesContext;
25
26 import javax.servlet.ServletContext;
27 import javax.servlet.ServletContextAttributeEvent;
28 import javax.servlet.ServletContextAttributeListener;
29 import javax.servlet.ServletContextEvent;
30 import javax.servlet.ServletContextListener;
31 import javax.servlet.ServletRequest;
32 import javax.servlet.ServletRequestAttributeEvent;
33 import javax.servlet.ServletRequestAttributeListener;
34 import javax.servlet.ServletRequestEvent;
35 import javax.servlet.ServletRequestListener;
36 import javax.servlet.http.HttpSessionAttributeListener;
37 import javax.servlet.http.HttpSessionBindingEvent;
38 import javax.servlet.http.HttpSessionEvent;
39 import javax.servlet.http.HttpSessionListener;
40
41 import org.apache.myfaces.config.ManagedBeanDestroyer;
42 import org.apache.myfaces.context.ReleaseableExternalContext;
43 import org.apache.myfaces.context.servlet.StartupFacesContextImpl;
44 import org.apache.myfaces.context.servlet.StartupServletExternalContextImpl;
45 import org.apache.myfaces.shared.context.ExceptionHandlerImpl;
46 import org.apache.myfaces.spi.ViewScopeProvider;
47
48
49
50
51
52
53
54
55
56
57
58
59
60 public class ManagedBeanDestroyerListener implements
61 HttpSessionAttributeListener, HttpSessionListener,
62 ServletContextListener, ServletContextAttributeListener,
63 ServletRequestListener, ServletRequestAttributeListener
64 {
65
66
67
68
69 public static final String APPLICATION_MAP_KEY = ManagedBeanDestroyerListener.class.getName();
70
71 private ManagedBeanDestroyer _destroyer = null;
72 private ViewScopeProvider _viewScopeHandler = null;
73
74 @Override
75 public void contextInitialized(ServletContextEvent event)
76 {
77
78 }
79
80 @Override
81 public void contextDestroyed(ServletContextEvent event)
82 {
83 if (_destroyer != null)
84 {
85 ServletContext ctx = event.getServletContext();
86 Enumeration<String> attributes = ctx.getAttributeNames();
87 if (!attributes.hasMoreElements())
88 {
89
90 return;
91 }
92
93 while (attributes.hasMoreElements())
94 {
95 String name = attributes.nextElement();
96 Object value = ctx.getAttribute(name);
97 _destroyer.destroy(name, value);
98 }
99 }
100 }
101
102
103
104
105
106
107 public void setManagedBeanDestroyer(ManagedBeanDestroyer destroyer)
108 {
109 _destroyer = destroyer;
110 }
111
112 public void setViewScopeHandler(ViewScopeProvider listener)
113 {
114 _viewScopeHandler = listener;
115 }
116
117
118 @Override
119 public void attributeAdded(HttpSessionBindingEvent event)
120 {
121
122 }
123
124 @Override
125 public void attributeRemoved(HttpSessionBindingEvent event)
126 {
127 if (_destroyer != null)
128 {
129 _destroyer.destroy(event.getName(), event.getValue());
130 }
131 }
132
133 @Override
134 public void attributeReplaced(HttpSessionBindingEvent event)
135 {
136 if (_destroyer != null)
137 {
138 _destroyer.destroy(event.getName(), event.getValue());
139 }
140 }
141
142 @Override
143 public void sessionCreated(HttpSessionEvent event)
144 {
145
146 }
147
148 @Override
149 public void sessionDestroyed(HttpSessionEvent event)
150 {
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181 if (_viewScopeHandler != null)
182 {
183 FacesContext facesContext = FacesContext.getCurrentInstance();
184 if (facesContext != null)
185 {
186 _viewScopeHandler.onSessionDestroyed();
187 }
188 else
189 {
190
191
192
193 try
194 {
195 ServletContext servletContext = event.getSession().getServletContext();
196 ExternalContext externalContext = new StartupServletExternalContextImpl(servletContext, false);
197 ((StartupServletExternalContextImpl)externalContext).setSession(event.getSession());
198 ExceptionHandler exceptionHandler = new ExceptionHandlerImpl();
199 facesContext = new StartupFacesContextImpl(externalContext,
200 (ReleaseableExternalContext) externalContext, exceptionHandler, false);
201 _viewScopeHandler.onSessionDestroyed();
202 }
203 finally
204 {
205 facesContext.release();
206 }
207 }
208 }
209 }
210
211
212 @Override
213 public void attributeAdded(ServletContextAttributeEvent event)
214 {
215
216 }
217
218 @Override
219 public void attributeRemoved(ServletContextAttributeEvent event)
220 {
221 if (_destroyer != null)
222 {
223 _destroyer.destroy(event.getName(), event.getValue());
224 }
225 }
226
227 @Override
228 public void attributeReplaced(ServletContextAttributeEvent event)
229 {
230 if (_destroyer != null)
231 {
232 _destroyer.destroy(event.getName(), event.getValue());
233 }
234 }
235
236
237 @Override
238 public void attributeAdded(ServletRequestAttributeEvent event)
239 {
240
241 }
242
243 @Override
244 public void attributeRemoved(ServletRequestAttributeEvent event)
245 {
246 if (_destroyer != null)
247 {
248 _destroyer.destroy(event.getName(), event.getValue());
249 }
250 }
251
252 @Override
253 public void attributeReplaced(ServletRequestAttributeEvent event)
254 {
255 if (_destroyer != null)
256 {
257 _destroyer.destroy(event.getName(), event.getValue());
258 }
259 }
260
261 @Override
262 public void requestInitialized(ServletRequestEvent event)
263 {
264
265 }
266
267 @Override
268 public void requestDestroyed(ServletRequestEvent event)
269 {
270 if (_destroyer != null)
271 {
272 ServletRequest request = event.getServletRequest();
273 Enumeration<String> attributes = request.getAttributeNames();
274 if (!attributes.hasMoreElements())
275 {
276
277 return;
278 }
279
280 while (attributes.hasMoreElements())
281 {
282 String name = attributes.nextElement();
283 Object value = request.getAttribute(name);
284 _destroyer.destroy(name, value);
285 }
286 }
287 }
288
289 }