1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package javax.faces.component;
20
21 import java.util.ArrayList;
22 import java.util.ConcurrentModificationException;
23 import java.util.List;
24 import java.util.ListIterator;
25 import java.util.Locale;
26 import javax.faces.context.ExternalContext;
27
28 import javax.faces.context.FacesContext;
29 import javax.faces.el.ValueBinding;
30 import javax.faces.event.AbortProcessingException;
31 import javax.faces.event.FacesEvent;
32 import javax.faces.event.PhaseId;
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 public class UIViewRoot extends UIComponentBase
53 {
54 public static final String COMPONENT_TYPE = "javax.faces.ViewRoot";
55 public static final String COMPONENT_FAMILY = "javax.faces.ViewRoot";
56
57 public static final String UNIQUE_ID_PREFIX = "_id";
58
59 private static final int ANY_PHASE_ORDINAL = PhaseId.ANY_PHASE.getOrdinal();
60
61
62
63
64
65
66 private long _uniqueIdCounter = 0;
67
68 private String _renderKitId = null;
69 private String _viewId = null;
70 private Locale _locale = null;
71 private List _events = null;
72
73 public String getViewId()
74 {
75 return _viewId;
76 }
77
78 public void setViewId(String viewId)
79 {
80
81
82
83 _viewId = viewId;
84 }
85
86 public void queueEvent(FacesEvent event)
87 {
88 if (event == null)
89 {
90 throw new NullPointerException("event");
91 }
92 if (_events == null)
93 {
94 _events = new ArrayList();
95 }
96 _events.add(event);
97 }
98
99 private void _broadcastForPhase(PhaseId phaseId)
100 {
101 if (_events == null) return;
102
103 boolean abort = false;
104
105 int phaseIdOrdinal = phaseId.getOrdinal();
106 for (ListIterator listiterator = _events.listIterator(); listiterator.hasNext();)
107 {
108 FacesEvent event = (FacesEvent) listiterator.next();
109 int ordinal = event.getPhaseId().getOrdinal();
110 if (ordinal == ANY_PHASE_ORDINAL || ordinal == phaseIdOrdinal)
111 {
112 UIComponent source = event.getComponent();
113 try
114 {
115 source.broadcast(event);
116 }
117 catch (AbortProcessingException e)
118 {
119
120
121
122 abort = true;
123 break;
124 }
125 finally
126 {
127 try
128 {
129 listiterator.remove();
130 }
131 catch(ConcurrentModificationException cme)
132 {
133 int eventIndex = listiterator.previousIndex();
134 _events.remove(eventIndex);
135 listiterator = _events.listIterator();
136 }
137 }
138 }
139 }
140
141 if (abort)
142 {
143
144 clearEvents();
145 }
146 }
147
148
149 private void clearEvents()
150 {
151 _events = null;
152 }
153
154
155 public void processDecodes(FacesContext context)
156 {
157 if (context == null) throw new NullPointerException("context");
158 super.processDecodes(context);
159 _broadcastForPhase(PhaseId.APPLY_REQUEST_VALUES);
160 if (context.getRenderResponse() || context.getResponseComplete())
161 {
162 clearEvents();
163 }
164 }
165
166 public void processValidators(FacesContext context)
167 {
168 if (context == null) throw new NullPointerException("context");
169 super.processValidators(context);
170 _broadcastForPhase(PhaseId.PROCESS_VALIDATIONS);
171 if (context.getRenderResponse() || context.getResponseComplete())
172 {
173 clearEvents();
174 }
175 }
176
177 public void processUpdates(FacesContext context)
178 {
179 if (context == null) throw new NullPointerException("context");
180 super.processUpdates(context);
181 _broadcastForPhase(PhaseId.UPDATE_MODEL_VALUES);
182 if (context.getRenderResponse() || context.getResponseComplete())
183 {
184 clearEvents();
185 }
186 }
187
188 public void processApplication(FacesContext context)
189 {
190 if (context == null) throw new NullPointerException("context");
191 _broadcastForPhase(PhaseId.INVOKE_APPLICATION);
192 if (context.getRenderResponse() || context.getResponseComplete())
193 {
194 clearEvents();
195 }
196 }
197
198 public void encodeBegin(FacesContext context)
199 throws java.io.IOException
200 {
201 clearEvents();
202 super.encodeBegin(context);
203 }
204
205
206
207
208 public String createUniqueId()
209 {
210 ExternalContext extCtx = getFacesContext().getExternalContext();
211 return extCtx.encodeNamespace(UNIQUE_ID_PREFIX + _uniqueIdCounter++);
212 }
213
214
215
216
217
218
219 public Locale getLocale()
220 {
221 if (_locale != null) return _locale;
222 ValueBinding vb = getValueBinding("locale");
223 FacesContext facesContext = getFacesContext();
224 if (vb == null)
225 {
226 return facesContext.getApplication().getViewHandler().calculateLocale(facesContext);
227 }
228 Object locale = vb.getValue(facesContext);
229 if (locale == null)
230 {
231 return facesContext.getApplication().getViewHandler().calculateLocale(facesContext);
232 }
233 if (locale instanceof Locale)
234 {
235 return (Locale)locale;
236 }
237 else if (locale instanceof String)
238 {
239 return getLocale((String)locale);
240 }
241 else
242 {
243 throw new IllegalArgumentException("locale binding");
244 }
245 }
246
247 public void setLocale(Locale locale)
248 {
249 _locale = locale;
250 }
251
252
253
254
255
256
257
258
259
260 private static Locale getLocale(String locale){
261 int cnt = 0;
262 int pos = 0;
263 int prev = 0;
264
265
266
267
268
269
270 String[] lv = new String[3];
271 Locale l=null;
272
273 while((pos=locale.indexOf('_',prev))!=-1){
274 lv[cnt++] = locale.substring(prev,pos);
275 prev = pos + 1;
276 }
277
278 lv[cnt++] = locale.substring(prev,locale.length());
279
280 switch(cnt){
281 case 1:
282
283 l = new Locale(lv[0]);
284 break;
285 case 2:
286
287 l = new Locale(lv[0],lv[1]);
288 break;
289 case 3:
290
291 l = new Locale(lv[0], lv[1], lv[2]);
292 break;
293 }
294 return l;
295 }
296
297 public String getFamily()
298 {
299 return COMPONENT_FAMILY;
300 }
301
302
303
304
305
306
307
308 public String getRenderKitId()
309 {
310 if (_renderKitId != null) return _renderKitId;
311 ValueBinding vb = getValueBinding("renderKitId");
312 return vb != null ? _ComponentUtils.getStringValue(getFacesContext(), vb) : null;
313 }
314
315 public void setRenderKitId(String renderKitId)
316 {
317 _renderKitId = renderKitId;
318 }
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334 public void setRendered(boolean state)
335 {
336 super.setRendered(state);
337 }
338
339 public boolean isRendered()
340 {
341
342 return super.isRendered();
343 }
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361 public void setId(String id)
362 {
363
364
365
366
367 super.setId(id);
368 }
369
370 public String getId()
371 {
372
373 return super.getId();
374 }
375
376
377
378
379
380
381
382
383
384
385 public String getClientId(FacesContext context)
386 {
387
388 return super.getClientId(context);
389 }
390
391 public Object saveState(FacesContext context)
392 {
393 Object values[] = new Object[5];
394 values[0] = super.saveState(context);
395 values[1] = _locale;
396 values[2] = _renderKitId;
397 values[3] = _viewId;
398 values[4] = new Long(_uniqueIdCounter);
399 return values;
400 }
401
402 public void restoreState(FacesContext context, Object state)
403 {
404 Object values[] = (Object[])state;
405 super.restoreState(context, values[0]);
406 _locale = (Locale)values[1];
407 _renderKitId = (String)values[2];
408 _viewId = (String)values[3];
409 _uniqueIdCounter = values[4]==null?0:((Long)values[4]).longValue();
410 }
411 }