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.myfaces.orchestra.viewController.ViewControllerManager;
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 public class ViewControllerPhaseListener implements PhaseListener
52 {
53 private static final long serialVersionUID = -3975277433747722402L;
54
55
56
57
58 public static class ViewControllerPhaseListenerState
59 {
60 private Set initedViews = new TreeSet();
61
62 protected ViewControllerPhaseListenerState()
63 {
64 }
65 }
66
67 public void beforePhase(PhaseEvent event)
68 {
69 if (PhaseId.RESTORE_VIEW.equals(event.getPhaseId()) ||
70 PhaseId.RENDER_RESPONSE.equals(event.getPhaseId()))
71 {
72 assertConversationState(event.getFacesContext());
73 if (event.getFacesContext().getResponseComplete())
74 {
75
76 return;
77 }
78 }
79
80
81
82 executeInitView(event.getFacesContext());
83
84 if (PhaseId.RENDER_RESPONSE.equals(event.getPhaseId()))
85 {
86 preRenderResponse(event.getFacesContext());
87 }
88
89 if (PhaseId.INVOKE_APPLICATION.equals(event.getPhaseId()))
90 {
91 preInvokeApplication(event.getFacesContext());
92 }
93 }
94
95 public void afterPhase(PhaseEvent event)
96 {
97 if (PhaseId.RESTORE_VIEW.equals(event.getPhaseId()))
98 {
99 assertConversationState(event.getFacesContext());
100 if (event.getFacesContext().getResponseComplete())
101 {
102
103 return;
104 }
105 }
106
107 executeInitView(event.getFacesContext());
108 }
109
110 public PhaseId getPhaseId()
111 {
112 return PhaseId.ANY_PHASE;
113 }
114
115 protected String getViewId(FacesContext facesContext)
116 {
117 UIViewRoot viewRoot = facesContext.getViewRoot();
118 if (viewRoot == null)
119 {
120 return null;
121 }
122 return viewRoot.getViewId();
123 }
124
125
126
127
128
129
130
131 protected void assertConversationState(FacesContext facesContext)
132 {
133 ViewControllerManager manager = ViewControllerVariableResolver.getViewControllerManager(facesContext);
134 if (manager == null)
135 {
136 return;
137 }
138
139 String viewId = getViewId(facesContext);
140 if (viewId == null)
141 {
142 return;
143 }
144
145 manager.assertConversationState(viewId);
146 }
147
148
149
150
151 protected void preRenderResponse(FacesContext facesContext)
152 {
153 ViewControllerManager manager = ViewControllerVariableResolver.getViewControllerManager(facesContext);
154 if (manager == null)
155 {
156 return;
157 }
158
159 String viewId = getViewId(facesContext);
160 if (viewId == null)
161 {
162 return;
163 }
164
165 manager.executePreRenderView(viewId);
166 }
167
168
169
170
171
172 protected void executeInitView(FacesContext facesContext)
173 {
174 postRestoreView(facesContext);
175 }
176
177
178
179
180 protected void postRestoreView(FacesContext facesContext)
181 {
182 ViewControllerManager manager = ViewControllerVariableResolver.getViewControllerManager(facesContext);
183 if (manager == null)
184 {
185 return;
186 }
187
188 String viewId = getViewId(facesContext);
189 if (viewId == null)
190 {
191 return;
192 }
193
194 ViewControllerPhaseListenerState state = getState(facesContext);
195
196 if (state.initedViews.contains(viewId))
197 {
198
199 return;
200 }
201 state.initedViews.add(viewId);
202
203 manager.executeInitView(viewId);
204 }
205
206 protected ViewControllerPhaseListenerState getState(FacesContext facesContext)
207 {
208 ViewControllerPhaseListenerState state = (ViewControllerPhaseListenerState)
209 facesContext.getExternalContext().getRequestMap()
210 .get(ViewControllerPhaseListenerState.class.getName());
211 if (state == null)
212 {
213 state = new ViewControllerPhaseListenerState();
214 facesContext.getExternalContext().getRequestMap().put(
215 ViewControllerPhaseListenerState.class.getName(), state);
216 }
217 return state;
218 }
219
220
221
222
223 protected void preInvokeApplication(FacesContext facesContext)
224 {
225 ViewControllerManager manager = ViewControllerVariableResolver.getViewControllerManager(facesContext);
226 if (manager == null)
227 {
228 return;
229 }
230
231 String viewId = getViewId(facesContext);
232 if (viewId == null)
233 {
234 return;
235 }
236
237 manager.executePreProcess(viewId);
238 }
239 }