1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.myfaces.orchestra.viewController.jsf;
21
22 import java.util.Set;
23 import java.util.TreeSet;
24
25 import javax.faces.component.UIViewRoot;
26 import javax.faces.context.FacesContext;
27 import javax.faces.event.PhaseEvent;
28 import javax.faces.event.PhaseId;
29 import javax.faces.event.PhaseListener;
30
31 import org.apache.commons.logging.Log;
32 import org.apache.commons.logging.LogFactory;
33 import org.apache.myfaces.orchestra.viewController.ViewControllerManager;
34 import org.apache.myfaces.orchestra.viewController.ViewControllerManagerFactory;
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 public class ViewControllerPhaseListener implements PhaseListener
56 {
57 private static final long serialVersionUID = -3975277433747722402L;
58 private final Log log = LogFactory.getLog(ViewControllerPhaseListener.class);
59
60
61
62
63 public static class ViewControllerPhaseListenerState
64 {
65 private Set initedViews = new TreeSet();
66
67 protected ViewControllerPhaseListenerState()
68 {
69 }
70 }
71
72 public void beforePhase(PhaseEvent event)
73 {
74 if (PhaseId.RESTORE_VIEW.equals(event.getPhaseId()) ||
75 PhaseId.RENDER_RESPONSE.equals(event.getPhaseId()))
76 {
77 assertConversationState(event.getFacesContext());
78 if (event.getFacesContext().getResponseComplete())
79 {
80
81 return;
82 }
83 }
84
85
86
87
88 executeInitView(event.getFacesContext());
89
90 if (PhaseId.RENDER_RESPONSE.equals(event.getPhaseId()))
91 {
92 preRenderResponse(event.getFacesContext());
93 }
94
95 if (PhaseId.INVOKE_APPLICATION.equals(event.getPhaseId()))
96 {
97 preInvokeApplication(event.getFacesContext());
98 }
99 }
100
101 public void afterPhase(PhaseEvent event)
102 {
103 if (PhaseId.RESTORE_VIEW.equals(event.getPhaseId()))
104 {
105 assertConversationState(event.getFacesContext());
106 if (event.getFacesContext().getResponseComplete())
107 {
108
109 return;
110 }
111 }
112
113 executeInitView(event.getFacesContext());
114 }
115
116 public PhaseId getPhaseId()
117 {
118 return PhaseId.ANY_PHASE;
119 }
120
121 protected String getViewId(FacesContext facesContext)
122 {
123 UIViewRoot viewRoot = facesContext.getViewRoot();
124 if (viewRoot == null)
125 {
126 return null;
127 }
128 return viewRoot.getViewId();
129 }
130
131
132
133
134
135
136
137 protected void assertConversationState(FacesContext facesContext)
138 {
139 ViewControllerManager manager = ViewControllerManagerFactory.getInstance();
140 if (manager == null)
141 {
142 return;
143 }
144
145 String viewId = getViewId(facesContext);
146 if (viewId == null)
147 {
148 return;
149 }
150
151 manager.assertConversationState(viewId);
152 }
153
154
155
156
157 protected void preRenderResponse(FacesContext facesContext)
158 {
159 ViewControllerManager manager = ViewControllerManagerFactory.getInstance();
160 if (manager == null)
161 {
162 return;
163 }
164
165 String viewId = getViewId(facesContext);
166 if (viewId == null)
167 {
168 return;
169 }
170
171 manager.executePreRenderView(viewId);
172 }
173
174
175
176
177
178 protected void executeInitView(FacesContext facesContext)
179 {
180 postRestoreView(facesContext);
181 }
182
183
184
185
186 protected void postRestoreView(FacesContext facesContext)
187 {
188 ViewControllerManager manager = ViewControllerManagerFactory.getInstance();
189 if (manager == null)
190 {
191 return;
192 }
193
194 UIViewRoot viewRoot = facesContext.getViewRoot();
195 if (viewRoot == null)
196 {
197 return;
198 }
199
200 String viewId = viewRoot.getViewId();
201 if (viewId == null)
202 {
203 return;
204 }
205
206
207
208
209
210
211
212
213 String viewKey = String.valueOf(System.identityHashCode(viewRoot));
214 ViewControllerPhaseListenerState state = getState(facesContext);
215 if (state.initedViews.contains(viewKey))
216 {
217
218 if (log.isDebugEnabled())
219 {
220 log.debug("Skipping already-initialized viewcontroller bean " + viewKey + " for view " + viewId);
221 }
222 return;
223 }
224
225 if (log.isDebugEnabled())
226 {
227 log.debug("Initializing viewcontroller bean " + viewKey + " for view " + viewId);
228 }
229
230 state.initedViews.add(viewKey);
231 manager.executeInitView(viewId);
232 }
233
234 protected ViewControllerPhaseListenerState getState(FacesContext facesContext)
235 {
236 ViewControllerPhaseListenerState state = (ViewControllerPhaseListenerState)
237 facesContext.getExternalContext().getRequestMap()
238 .get(ViewControllerPhaseListenerState.class.getName());
239 if (state == null)
240 {
241 state = new ViewControllerPhaseListenerState();
242 facesContext.getExternalContext().getRequestMap().put(
243 ViewControllerPhaseListenerState.class.getName(), state);
244 }
245 return state;
246 }
247
248
249
250
251 protected void preInvokeApplication(FacesContext facesContext)
252 {
253 ViewControllerManager manager = ViewControllerManagerFactory.getInstance();
254 if (manager == null)
255 {
256 return;
257 }
258
259 String viewId = getViewId(facesContext);
260 if (viewId == null)
261 {
262 return;
263 }
264
265 manager.executePreProcess(viewId);
266 }
267 }