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.io.IOException;
22 import java.util.ArrayList;
23 import java.util.Arrays;
24 import java.util.Collection;
25 import java.util.Collections;
26 import java.util.HashMap;
27 import java.util.Iterator;
28 import java.util.LinkedList;
29 import java.util.List;
30 import java.util.Locale;
31 import java.util.Map;
32 import java.util.logging.Level;
33 import java.util.logging.Logger;
34
35 import javax.el.MethodExpression;
36 import javax.el.ValueExpression;
37 import javax.faces.FactoryFinder;
38 import javax.faces.application.ProjectStage;
39 import javax.faces.context.FacesContext;
40 import javax.faces.context.PartialViewContext;
41 import javax.faces.event.AbortProcessingException;
42 import javax.faces.event.ExceptionQueuedEvent;
43 import javax.faces.event.ExceptionQueuedEventContext;
44 import javax.faces.event.FacesEvent;
45 import javax.faces.event.PhaseEvent;
46 import javax.faces.event.PhaseId;
47 import javax.faces.event.PhaseListener;
48 import javax.faces.event.PostConstructViewMapEvent;
49 import javax.faces.event.PreDestroyViewMapEvent;
50 import javax.faces.event.SystemEvent;
51 import javax.faces.event.SystemEventListener;
52 import javax.faces.lifecycle.Lifecycle;
53 import javax.faces.lifecycle.LifecycleFactory;
54 import javax.faces.view.ViewDeclarationLanguage;
55 import javax.faces.view.ViewMetadata;
56 import javax.faces.webapp.FacesServlet;
57
58 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFComponent;
59 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFJspProperty;
60 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFProperty;
61
62
63
64
65
66
67
68
69
70
71
72 @JSFComponent(name = "f:view", bodyContent = "JSP", tagClass = "org.apache.myfaces.taglib.core.ViewTag")
73 @JSFJspProperty(name = "binding", returnType = "java.lang.String", tagExcluded = true)
74 public class UIViewRoot extends UIComponentBase implements UniqueIdVendor
75 {
76 public static final String COMPONENT_FAMILY = "javax.faces.ViewRoot";
77 public static final String COMPONENT_TYPE = "javax.faces.ViewRoot";
78 public static final String METADATA_FACET_NAME = "javax_faces_metadata";
79 public static final String UNIQUE_ID_PREFIX = "j_id";
80 public static final String VIEW_PARAMETERS_KEY = "javax.faces.component.VIEW_PARAMETERS_KEY";
81
82 private transient Logger logger = null;
83
84 private static final PhaseProcessor APPLY_REQUEST_VALUES_PROCESSOR = new ApplyRequestValuesPhaseProcessor();
85 private static final PhaseProcessor PROCESS_VALIDATORS_PROCESSOR = new ProcessValidatorPhaseProcessor();
86 private static final PhaseProcessor UPDATE_MODEL_PROCESSOR = new UpdateModelPhaseProcessor();
87
88
89
90
91
92
93
94
95 private List<FacesEvent> _events;
96
97
98
99
100
101
102
103 private Map<String, Object> _viewScope;
104
105 private transient Lifecycle _lifecycle = null;
106
107 private HashMap<Class<? extends SystemEvent>, List<SystemEventListener>> _systemEventListeners;
108
109
110
111
112 private transient Map<PhaseId, boolean[]> listenerSuccessMap;
113
114 private static final String JAVAX_FACES_LOCATION_PREFIX = "javax_faces_location_";
115 private static final String JAVAX_FACES_LOCATION_HEAD = "javax_faces_location_head";
116 private static final String JAVAX_FACES_LOCATION_BODY = "javax_faces_location_body";
117 private static final String JAVAX_FACES_LOCATION_FORM = "javax_faces_location_form";
118
119
120
121
122 public UIViewRoot()
123 {
124 setRendererType(null);
125 }
126
127
128
129
130 public void addComponentResource(FacesContext context, UIComponent componentResource)
131 {
132 addComponentResource(context, componentResource, null);
133 }
134
135
136
137
138 public void addComponentResource(FacesContext context, UIComponent componentResource, String target)
139 {
140
141 if (target == null)
142 {
143
144 target = (String)componentResource.getAttributes().get("target");
145
146
147 if (target == null)
148 {
149 target = "head";
150 }
151 }
152
153
154 List<UIComponent> componentResources = _getComponentResources(context, target);
155
156
157
158 String componentId = componentResource.getId();
159
160 if (componentId == null)
161 {
162
163
164 componentId = createUniqueId(context, null);
165 componentResource.setId(componentId);
166 }
167
168
169
170
171
172
173
174
175
176 boolean alreadyAdded = false;
177
178
179 if (componentResource.isInView())
180 {
181 if (componentResource.getParent() != null &&
182 componentResource.getParent().getId() != null &&
183 componentResource.getParent().getId().equals(JAVAX_FACES_LOCATION_PREFIX + target))
184 {
185
186
187
188 alreadyAdded = true;
189 }
190 else if (componentId != null)
191 {
192 for(Iterator<UIComponent> it = componentResources.iterator(); it.hasNext();)
193 {
194 UIComponent component = it.next();
195 if(componentId.equals(component.getId()) && componentResource != component)
196 {
197 it.remove();
198 }
199 else if (componentResource == component)
200 {
201 alreadyAdded = true;
202 }
203 }
204 }
205 }
206 else if (componentId != null)
207 {
208 for(Iterator<UIComponent> it = componentResources.iterator(); it.hasNext();)
209 {
210 UIComponent component = it.next();
211 if(componentId.equals(component.getId()) && componentResource != component)
212 {
213 it.remove();
214 }
215 else if (componentResource == component)
216 {
217 alreadyAdded = true;
218 }
219 }
220 }
221
222
223 if (!alreadyAdded)
224 {
225 componentResources.add(componentResource);
226 }
227 }
228
229
230
231
232 public void addPhaseListener(PhaseListener phaseListener)
233 {
234 if (phaseListener == null)
235 {
236 throw new NullPointerException("phaseListener");
237 }
238
239 getStateHelper().add(PropertyKeys.phaseListeners, phaseListener);
240 }
241
242
243
244
245 public void broadcastEvents(FacesContext context, PhaseId phaseId)
246 {
247 if (_events == null)
248 {
249 return;
250 }
251
252 Events events = _getEvents(phaseId);
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269 int loops = 0;
270 int maxLoops = 15;
271 Collection<FacesEvent> eventsAborted = new LinkedList<FacesEvent>();
272 do
273 {
274
275 boolean noUnexpectedException = _broadcastAll(context, events.getAnyPhase(), eventsAborted);
276 if (!noUnexpectedException)
277 {
278 return;
279 }
280 List<FacesEvent> eventsOnPhase = events.getOnPhase();
281 if (!eventsAborted.isEmpty())
282 {
283 eventsOnPhase.removeAll(eventsAborted);
284 eventsAborted.clear();
285 }
286 noUnexpectedException = _broadcastAll(context, eventsOnPhase, eventsAborted);
287 if (!noUnexpectedException)
288 {
289 return;
290 }
291
292 events = _getEvents(phaseId);
293 loops++;
294
295 } while (events.hasMoreEvents() && loops < maxLoops);
296
297 if (loops == maxLoops && events.hasMoreEvents())
298 {
299
300 boolean production = getFacesContext().isProjectStage(ProjectStage.Production);
301 Level level = production ? Level.FINE : Level.WARNING;
302 if (_getLogger().isLoggable(level))
303 {
304 List<String> name = new ArrayList<String>(events.getAnyPhase().size() + events.getOnPhase().size());
305 for (FacesEvent facesEvent : events.getAnyPhase())
306 {
307 String clientId = facesEvent.getComponent().getClientId(getFacesContext());
308 name.add(clientId);
309 }
310 for (FacesEvent facesEvent : events.getOnPhase())
311 {
312 String clientId = facesEvent.getComponent().getClientId(getFacesContext());
313 name.add(clientId);
314 }
315 _getLogger().log(level,
316 "Event broadcating for PhaseId {0} at UIViewRoot {1} reaches maximal limit, please check " +
317 "listeners for infinite recursion. Component id: {2}",
318 new Object [] {phaseId, getViewId(), name});
319 }
320 }
321 }
322
323
324
325
326
327 public String createUniqueId()
328 {
329 return createUniqueId(getFacesContext(), null);
330 }
331
332
333
334
335
336
337
338 public String createUniqueId(FacesContext context, String seed)
339 {
340 StringBuilder bld = _getSharedStringBuilder(context);
341
342
343
344 if(seed==null)
345 {
346 Long uniqueIdCounter = (Long) getStateHelper().get(PropertyKeys.uniqueIdCounter);
347 uniqueIdCounter = (uniqueIdCounter == null) ? 0 : uniqueIdCounter;
348 getStateHelper().put(PropertyKeys.uniqueIdCounter, (uniqueIdCounter+1L));
349 return bld.append(UNIQUE_ID_PREFIX).append(uniqueIdCounter).toString();
350 }
351
352
353 else
354 {
355 return bld.append(UNIQUE_ID_PREFIX).append(seed).toString();
356 }
357 }
358
359 @Override
360 public void encodeBegin(FacesContext context) throws IOException
361 {
362 checkNull(context, "context");
363
364 boolean skipPhase = false;
365
366 try
367 {
368 skipPhase = notifyListeners(context, PhaseId.RENDER_RESPONSE, getBeforePhaseListener(), true);
369 }
370 catch (Exception e)
371 {
372
373 _getLogger().log(Level.SEVERE, "Exception while processing phase listener: " + e.getMessage(), e);
374 }
375
376 if (!skipPhase)
377 {
378
379
380
381
382
383 super.encodeBegin(context);
384 }
385 else
386 {
387 pushComponentToEL(context, this);
388 }
389 }
390
391
392
393
394 @Override
395 public void encodeChildren(FacesContext context) throws IOException
396 {
397 if (context.getResponseComplete())
398 {
399 return;
400 }
401 PartialViewContext pContext = context.getPartialViewContext();
402
403
404 if (pContext.isAjaxRequest())
405 {
406
407
408 pContext.processPartial(PhaseId.RENDER_RESPONSE);
409 }
410 else
411 {
412
413
414 super.encodeChildren(context);
415 }
416 }
417
418 @Override
419 public void encodeEnd(FacesContext context) throws IOException
420 {
421 checkNull(context, "context");
422
423 if (!context.getResponseComplete())
424 {
425 super.encodeEnd(context);
426
427
428
429
430
431 PartialViewContext partialContext = context.getPartialViewContext();
432 if (!partialContext.isAjaxRequest())
433 {
434 ViewDeclarationLanguage vdl
435 = context.getApplication().getViewHandler().getViewDeclarationLanguage(context, getViewId());
436 if (vdl != null)
437 {
438
439
440
441 ViewMetadata metadata = null;
442 try
443 {
444 metadata = vdl.getViewMetadata(context, getViewId());
445 }
446 catch(UnsupportedOperationException e)
447 {
448 _getLogger().log(Level.SEVERE, "Exception while obtaining the view metadata: " +
449 e.getMessage(), e);
450 }
451
452 if (metadata != null)
453 {
454 try
455 {
456 Collection<UIViewParameter> viewParams = ViewMetadata.getViewParameters(this);
457 if(!viewParams.isEmpty())
458 {
459
460 for(UIViewParameter param : viewParams)
461 {
462 param.encodeAll(context);
463 }
464 }
465 }
466 catch(UnsupportedOperationException e)
467 {
468
469
470 }
471 }
472 }
473 }
474 }
475
476 try
477 {
478 notifyListeners(context, PhaseId.RENDER_RESPONSE, getAfterPhaseListener(), false);
479 }
480 catch (Exception e)
481 {
482
483 _getLogger().log(Level.SEVERE, "Exception while processing phase listener: " + e.getMessage(), e);
484 }
485 }
486
487
488
489
490
491
492
493 @JSFProperty(returnSignature = "void", methodSignature = "javax.faces.event.PhaseEvent",
494 jspName = "afterPhase", stateHolder=true)
495 public MethodExpression getAfterPhaseListener()
496 {
497 return (MethodExpression) getStateHelper().eval(PropertyKeys.afterPhaseListener);
498 }
499
500
501
502
503
504
505
506 @JSFProperty(returnSignature = "void", methodSignature = "javax.faces.event.PhaseEvent",
507 jspName = "beforePhase", stateHolder=true)
508 public MethodExpression getBeforePhaseListener()
509 {
510 return (MethodExpression) getStateHelper().eval(PropertyKeys.beforePhaseListener);
511 }
512
513
514
515
516
517
518 @Override
519 public String getClientId(FacesContext context)
520 {
521 return super.getClientId(context);
522
523
524 }
525
526
527
528
529 public List<UIComponent> getComponentResources(FacesContext context, String target)
530 {
531
532 UIComponent facet = getFacet(target);
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556 if (facet != null)
557 {
558 if (facet.getChildCount() > 0)
559 {
560 return Collections.unmodifiableList(facet.getChildren());
561 }
562 else
563 {
564 return Collections.<UIComponent>emptyList();
565 }
566 }
567 return Collections.<UIComponent>emptyList();
568 }
569
570 private List<UIComponent> _getComponentResources(FacesContext context, String target)
571 {
572
573 UIComponent facet = getFacet(target);
574
575
576 if (facet == null)
577 {
578
579
580 facet = context.getApplication().createComponent("javax.faces.ComponentResourceContainer");
581
582
583 if (target.equals("head"))
584 {
585 facet.setId(JAVAX_FACES_LOCATION_HEAD);
586 }
587 else if (target.equals("body"))
588 {
589 facet.setId(JAVAX_FACES_LOCATION_BODY);
590 }
591 else if (target.equals("form"))
592 {
593 facet.setId(JAVAX_FACES_LOCATION_FORM);
594 }
595 else
596 {
597 facet.setId(JAVAX_FACES_LOCATION_PREFIX + target);
598 }
599
600
601
602
603
604
605
606
607
608
609
610 getFacets().put(target, facet);
611 }
612 return facet.getChildren();
613 }
614
615 @Override
616 public String getFamily()
617 {
618 return COMPONENT_FAMILY;
619 }
620
621
622
623
624
625
626
627 @JSFProperty
628 public Locale getLocale()
629 {
630 Object locale = getStateHelper().get(PropertyKeys.locale);
631 if (locale != null)
632 {
633 return (Locale)locale;
634 }
635 ValueExpression expression = getValueExpression(PropertyKeys.locale.toString());
636 if (expression != null)
637 {
638 Object veLocale = expression.getValue(getFacesContext().getELContext());
639 if (veLocale instanceof Locale)
640 {
641 return (Locale) veLocale;
642 }
643 else
644 {
645 return (Locale) _LocaleUtils.toLocale(veLocale.toString());
646 }
647 }
648 else
649 {
650 locale = getFacesContext().getApplication().getViewHandler().calculateLocale(getFacesContext());
651
652 if (locale instanceof Locale)
653 {
654 return (Locale)locale;
655 }
656 else if (locale instanceof String)
657 {
658 return _LocaleUtils.toLocale((String)locale);
659 }
660 }
661
662 return getFacesContext().getApplication().getViewHandler().calculateLocale(getFacesContext());
663 }
664
665
666
667
668 public List<PhaseListener> getPhaseListeners()
669 {
670 List<PhaseListener> listeners = (List<PhaseListener>) getStateHelper().get(PropertyKeys.phaseListeners);
671 if (listeners == null)
672 {
673 listeners = Collections.emptyList();
674 }
675 else
676 {
677 listeners = Collections.unmodifiableList(listeners);
678 }
679
680 return listeners;
681 }
682
683
684
685
686 @JSFProperty
687 public String getRenderKitId()
688 {
689 return (String) getStateHelper().eval(PropertyKeys.renderKitId);
690 }
691
692
693
694
695 @Override
696 public boolean getRendersChildren()
697 {
698
699
700 PartialViewContext context = getFacesContext().getPartialViewContext();
701
702 return (context.isAjaxRequest()) ? true : super.getRendersChildren();
703 }
704
705
706
707
708
709
710
711 @JSFProperty(tagExcluded = true)
712 public String getViewId()
713 {
714 return (String) getStateHelper().get(PropertyKeys.viewId);
715 }
716
717
718
719
720 public Map<String, Object> getViewMap()
721 {
722 return this.getViewMap(true);
723 }
724
725
726
727
728 public Map<String, Object> getViewMap(boolean create)
729 {
730 if (_viewScope == null && create)
731 {
732 _viewScope = new ViewScope();
733 FacesContext facesContext = getFacesContext();
734 facesContext.getApplication().publishEvent(facesContext, PostConstructViewMapEvent.class, this);
735 }
736
737 return _viewScope;
738 }
739
740
741
742
743 @Override
744 public boolean isInView()
745 {
746 return true;
747 }
748
749 public void processApplication(final FacesContext context)
750 {
751 checkNull(context, "context");
752 _process(context, PhaseId.INVOKE_APPLICATION, null);
753 }
754
755 @Override
756 public void processDecodes(FacesContext context)
757 {
758 checkNull(context, "context");
759 _process(context, PhaseId.APPLY_REQUEST_VALUES, APPLY_REQUEST_VALUES_PROCESSOR);
760 }
761
762
763
764
765 @Override
766 public void processRestoreState(FacesContext context, Object state)
767 {
768
769
770 try
771 {
772 super.processRestoreState(context, state);
773 }
774 finally
775 {
776
777 broadcastEvents(context, PhaseId.RESTORE_VIEW);
778
779
780 }
781 }
782
783 @Override
784 public void queueEvent(FacesEvent event)
785 {
786 checkNull(event, "event");
787 if (_events == null)
788 {
789 _events = new ArrayList<FacesEvent>();
790 }
791
792 _events.add(event);
793 }
794
795 @Override
796 public void processValidators(FacesContext context)
797 {
798 checkNull(context, "context");
799 _process(context, PhaseId.PROCESS_VALIDATIONS, PROCESS_VALIDATORS_PROCESSOR);
800 }
801
802 @Override
803 public void processUpdates(FacesContext context)
804 {
805 checkNull(context, "context");
806 _process(context, PhaseId.UPDATE_MODEL_VALUES, UPDATE_MODEL_PROCESSOR);
807 }
808
809 public void setLocale(Locale locale)
810 {
811 getStateHelper().put(PropertyKeys.locale, locale );
812 }
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830 private boolean notifyListeners(FacesContext context, PhaseId phaseId, MethodExpression listener,
831 boolean beforePhase)
832 {
833 List<PhaseListener> phaseListeners = (List<PhaseListener>) getStateHelper().get(PropertyKeys.phaseListeners);
834 if (listener != null || (phaseListeners != null && !phaseListeners.isEmpty()))
835 {
836
837
838 int listenerCount = (phaseListeners != null ? phaseListeners.size() + 1 : 1);
839
840 boolean[] beforePhaseSuccess;
841 if (beforePhase)
842 {
843 beforePhaseSuccess = new boolean[listenerCount];
844 _getListenerSuccessMap().put(phaseId, beforePhaseSuccess);
845 }
846 else
847 {
848
849 beforePhaseSuccess = _getListenerSuccessMap().get(phaseId);
850 if (beforePhaseSuccess == null)
851 {
852
853 beforePhaseSuccess = new boolean[listenerCount];
854 Arrays.fill(beforePhaseSuccess, true);
855 }
856 }
857
858 PhaseEvent event = createEvent(context, phaseId);
859
860
861
862 if (listener != null && (beforePhase || beforePhaseSuccess[0]))
863 {
864 try
865 {
866 listener.invoke(context.getELContext(), new Object[] { event });
867 beforePhaseSuccess[0] = true;
868 }
869 catch (Throwable t)
870 {
871 beforePhaseSuccess[0] = false;
872 _getLogger().log(Level.SEVERE, "An Exception occured while processing " +
873 listener.getExpressionString() +
874 " in Phase " + phaseId, t);
875 if (beforePhase)
876 {
877 return context.getResponseComplete() ||
878 (context.getRenderResponse() && !PhaseId.RENDER_RESPONSE.equals(phaseId));
879 }
880 }
881 }
882 else if (beforePhase)
883 {
884
885 beforePhaseSuccess[0] = true;
886 }
887
888 if (phaseListeners != null && !phaseListeners.isEmpty())
889 {
890 if (beforePhase)
891 {
892
893 for (int i = 0; i < beforePhaseSuccess.length - 1; i++)
894 {
895 PhaseListener phaseListener;
896 try
897 {
898 phaseListener = phaseListeners.get(i);
899 }
900 catch (IndexOutOfBoundsException e)
901 {
902
903
904 throw new IllegalStateException("A PhaseListener must not remove " +
905 "PhaseListeners from UIViewRoot.");
906 }
907 PhaseId listenerPhaseId = phaseListener.getPhaseId();
908 if (phaseId.equals(listenerPhaseId) || PhaseId.ANY_PHASE.equals(listenerPhaseId))
909 {
910 try
911 {
912 phaseListener.beforePhase(event);
913 beforePhaseSuccess[i + 1] = true;
914 }
915 catch (Throwable t)
916 {
917 beforePhaseSuccess[i + 1] = false;
918 _getLogger().log(Level.SEVERE, "An Exception occured while processing the " +
919 "beforePhase method of PhaseListener " + phaseListener +
920 " in Phase " + phaseId, t);
921 return context.getResponseComplete() ||
922 (context.getRenderResponse() && !PhaseId.RENDER_RESPONSE.equals(phaseId));
923 }
924 }
925 }
926 }
927 else
928 {
929
930
931 for (int i = beforePhaseSuccess.length - 1; i > 0; i--)
932 {
933 PhaseListener phaseListener;
934 try
935 {
936 phaseListener = phaseListeners.get(i - 1);
937 }
938 catch (IndexOutOfBoundsException e)
939 {
940
941
942 throw new IllegalStateException("A PhaseListener must not remove " +
943 "PhaseListeners from UIViewRoot.");
944 }
945 PhaseId listenerPhaseId = phaseListener.getPhaseId();
946 if ((phaseId.equals(listenerPhaseId) || PhaseId.ANY_PHASE.equals(listenerPhaseId))
947 && beforePhaseSuccess[i])
948 {
949 try
950 {
951 phaseListener.afterPhase(event);
952 }
953 catch (Throwable t)
954 {
955 logger.log(Level.SEVERE, "An Exception occured while processing the " +
956 "afterPhase method of PhaseListener " + phaseListener +
957 " in Phase " + phaseId, t);
958 }
959 }
960 }
961 }
962 }
963 }
964
965 if (beforePhase)
966 {
967 return context.getResponseComplete() ||
968 (context.getRenderResponse() && !PhaseId.RENDER_RESPONSE.equals(phaseId));
969 }
970 else
971 {
972 return context.getResponseComplete() || context.getRenderResponse();
973 }
974 }
975
976 private PhaseEvent createEvent(FacesContext context, PhaseId phaseId)
977 {
978 if (_lifecycle == null)
979 {
980 LifecycleFactory factory = (LifecycleFactory)FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
981 String id = context.getExternalContext().getInitParameter(FacesServlet.LIFECYCLE_ID_ATTR);
982 if (id == null)
983 {
984 id = LifecycleFactory.DEFAULT_LIFECYCLE;
985 }
986 _lifecycle = factory.getLifecycle(id);
987 }
988 return new PhaseEvent(context, phaseId, _lifecycle);
989 }
990
991
992
993
994
995
996
997
998
999
1000
1001
1002 private boolean _broadcastAll(FacesContext context,
1003 List<? extends FacesEvent> events,
1004 Collection<FacesEvent> eventsAborted)
1005 {
1006 assert events != null;
1007
1008 for (int i = 0; i < events.size(); i++)
1009 {
1010 FacesEvent event = events.get(i);
1011 UIComponent source = event.getComponent();
1012 UIComponent compositeParent = UIComponent.getCompositeComponentParent(source);
1013 if (compositeParent != null)
1014 {
1015 pushComponentToEL(context, compositeParent);
1016 }
1017
1018 pushComponentToEL(context, source);
1019
1020 try
1021 {
1022
1023 if (!source.isCachedFacesContext())
1024 {
1025 try
1026 {
1027 source.setCachedFacesContext(context);
1028 source.broadcast(event);
1029 }
1030 finally
1031 {
1032 source.setCachedFacesContext(null);
1033 }
1034 }
1035 else
1036 {
1037 source.broadcast(event);
1038 }
1039 }
1040 catch (Exception e)
1041 {
1042
1043 Throwable cause = e;
1044 AbortProcessingException ape = null;
1045 do
1046 {
1047 if (cause != null && cause instanceof AbortProcessingException)
1048 {
1049 ape = (AbortProcessingException) cause;
1050 break;
1051 }
1052 cause = cause.getCause();
1053 }
1054 while (cause != null);
1055
1056
1057
1058
1059
1060 if (ape != null)
1061 {
1062 e = ape;
1063 }
1064 ExceptionQueuedEventContext exceptionContext
1065 = new ExceptionQueuedEventContext(context, e, source, context.getCurrentPhaseId());
1066 context.getApplication().publishEvent(context, ExceptionQueuedEvent.class, exceptionContext);
1067
1068
1069 if (ape != null)
1070 {
1071
1072 eventsAborted.add(event);
1073 }
1074 else
1075 {
1076
1077 return false;
1078 }
1079 }
1080 finally
1081 {
1082
1083 source.popComponentFromEL(context);
1084 if (compositeParent != null)
1085 {
1086 compositeParent.popComponentFromEL(context);
1087 }
1088 }
1089 }
1090 return true;
1091 }
1092
1093 private void clearEvents()
1094 {
1095 _events = null;
1096 }
1097
1098 private void checkNull(Object value, String valueLabel)
1099 {
1100 if (value == null)
1101 {
1102 throw new NullPointerException(valueLabel + " is null");
1103 }
1104 }
1105
1106 public void setRenderKitId(String renderKitId)
1107 {
1108 getStateHelper().put(PropertyKeys.renderKitId, renderKitId );
1109 }
1110
1111
1112
1113
1114
1115
1116
1117
1118 @Override
1119 @JSFProperty(tagExcluded = true)
1120 public void setRendered(boolean state)
1121 {
1122
1123 super.setRendered(state);
1124
1125 }
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140 @Override
1141 public void setId(String id)
1142 {
1143
1144
1145
1146
1147 super.setId(id);
1148 }
1149
1150
1151
1152
1153 @Override
1154 public void setInView(boolean isInView)
1155 {
1156
1157 }
1158
1159 public void removeComponentResource(FacesContext context, UIComponent componentResource)
1160 {
1161 removeComponentResource(context, componentResource, null);
1162 }
1163
1164 public void removeComponentResource(FacesContext context, UIComponent componentResource, String target)
1165 {
1166
1167 if (target == null)
1168 {
1169
1170 target = (String)componentResource.getAttributes().get("target");
1171
1172
1173 if (target == null)
1174 {
1175
1176 target = "head";
1177 }
1178 }
1179
1180
1181
1182
1183 UIComponent facet = getFacet(target);
1184 if (facet != null)
1185 {
1186
1187
1188
1189
1190 facet.getChildren().remove(componentResource);
1191 }
1192 }
1193
1194 public void setViewId(String viewId)
1195 {
1196
1197
1198
1199 getStateHelper().put(PropertyKeys.viewId, viewId );
1200 }
1201
1202
1203
1204
1205 public void removePhaseListener(PhaseListener phaseListener)
1206 {
1207 if (phaseListener == null)
1208 {
1209 return;
1210 }
1211
1212 getStateHelper().remove(PropertyKeys.phaseListeners, phaseListener);
1213 }
1214
1215
1216
1217
1218
1219
1220
1221 public void setBeforePhaseListener(MethodExpression beforePhaseListener)
1222 {
1223 getStateHelper().put(PropertyKeys.beforePhaseListener, beforePhaseListener);
1224 }
1225
1226
1227
1228
1229
1230
1231
1232 public void setAfterPhaseListener(MethodExpression afterPhaseListener)
1233 {
1234 getStateHelper().put(PropertyKeys.afterPhaseListener, afterPhaseListener);
1235 }
1236
1237 enum PropertyKeys
1238 {
1239 afterPhaseListener
1240 , beforePhaseListener
1241 , phaseListeners
1242 , locale
1243 , renderKitId
1244 , viewId
1245 , uniqueIdCounter
1246 }
1247
1248 @Override
1249 public Object saveState(FacesContext facesContext)
1250 {
1251 if (initialStateMarked())
1252 {
1253 Object parentSaved = super.saveState(facesContext);
1254 if (parentSaved == null && _viewScope == null)
1255 {
1256
1257 return null;
1258 }
1259 else if (parentSaved == null && _viewScope != null && _viewScope.size() == 0)
1260 {
1261
1262 return null;
1263 }
1264
1265 Object[] values = new Object[2];
1266 values[0] = parentSaved;
1267 values[1] = saveAttachedState(facesContext,_viewScope);
1268 return values;
1269 }
1270 else
1271 {
1272 Object[] values = new Object[2];
1273 values[0] = super.saveState(facesContext);
1274 values[1] = saveAttachedState(facesContext,_viewScope);
1275 return values;
1276 }
1277 }
1278
1279 @SuppressWarnings("unchecked")
1280 @Override
1281 public void restoreState(FacesContext facesContext, Object state)
1282 {
1283 if (state == null)
1284 {
1285 return;
1286 }
1287
1288 Object[] values = (Object[])state;
1289 super.restoreState(facesContext,values[0]);
1290 _viewScope = (Map<String, Object>) restoreAttachedState(facesContext, values[1]);
1291 }
1292
1293 public List<SystemEventListener> getViewListenersForEventClass(Class<? extends SystemEvent> systemEvent)
1294 {
1295 checkNull (systemEvent, "systemEvent");
1296 if (_systemEventListeners == null)
1297 {
1298 return null;
1299 }
1300 return _systemEventListeners.get (systemEvent);
1301 }
1302
1303 public void subscribeToViewEvent(Class<? extends SystemEvent> systemEvent,
1304 SystemEventListener listener)
1305 {
1306 List<SystemEventListener> listeners;
1307
1308 checkNull (systemEvent, "systemEvent");
1309 checkNull (listener, "listener");
1310
1311 if (_systemEventListeners == null)
1312 {
1313 _systemEventListeners = new HashMap<Class<? extends SystemEvent>, List<SystemEventListener>>();
1314 }
1315
1316 listeners = _systemEventListeners.get (systemEvent);
1317
1318 if (listeners == null)
1319 {
1320 listeners = new ArrayList<SystemEventListener>();
1321
1322 _systemEventListeners.put (systemEvent, listeners);
1323 }
1324
1325 listeners.add (listener);
1326 }
1327
1328 public void unsubscribeFromViewEvent(Class<? extends SystemEvent> systemEvent,
1329 SystemEventListener listener)
1330 {
1331 List<SystemEventListener> listeners;
1332
1333 checkNull (systemEvent, "systemEvent");
1334 checkNull (listener, "listener");
1335
1336 if (_systemEventListeners == null)
1337 {
1338 return;
1339 }
1340
1341 listeners = _systemEventListeners.get (systemEvent);
1342
1343 if (listeners != null)
1344 {
1345 listeners.remove (listener);
1346 }
1347 }
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361 private boolean _process(FacesContext context, PhaseId phaseId, PhaseProcessor processor)
1362 {
1363 RuntimeException processingException = null;
1364 try
1365 {
1366 if (!notifyListeners(context, phaseId, getBeforePhaseListener(), true))
1367 {
1368 try
1369 {
1370 if (processor != null)
1371 {
1372 processor.process(context, this);
1373 }
1374
1375 broadcastEvents(context, phaseId);
1376 }
1377 catch (RuntimeException re)
1378 {
1379
1380
1381 processingException = re;
1382 }
1383 }
1384 }
1385 finally
1386 {
1387 if (context.getRenderResponse() || context.getResponseComplete())
1388 {
1389 clearEvents();
1390 }
1391 }
1392
1393 boolean retVal = notifyListeners(context, phaseId, getAfterPhaseListener(), false);
1394 if (processingException == null)
1395 {
1396 return retVal;
1397 }
1398 else
1399 {
1400 throw processingException;
1401 }
1402 }
1403
1404 private void _processDecodesDefault(FacesContext context)
1405 {
1406 super.processDecodes(context);
1407 }
1408
1409 private void _processUpdatesDefault(FacesContext context)
1410 {
1411 super.processUpdates(context);
1412 }
1413
1414 private void _processValidatorsDefault(FacesContext context)
1415 {
1416 super.processValidators(context);
1417 }
1418
1419
1420
1421
1422
1423 private Events _getEvents(PhaseId phaseId)
1424 {
1425
1426 int size = _events.size();
1427 List<FacesEvent> anyPhase = new ArrayList<FacesEvent>(size);
1428 List<FacesEvent> onPhase = new ArrayList<FacesEvent>(size);
1429
1430 for (int i = 0; i < size; i++)
1431 {
1432 FacesEvent event = _events.get(i);
1433 if (event.getPhaseId().equals(PhaseId.ANY_PHASE))
1434 {
1435 anyPhase.add(event);
1436 _events.remove(i);
1437 size--;
1438 i--;
1439 }
1440 else if (event.getPhaseId().equals(phaseId))
1441 {
1442 onPhase.add(event);
1443 _events.remove(i);
1444 size--;
1445 i--;
1446 }
1447 }
1448
1449 return new Events(anyPhase, onPhase);
1450 }
1451
1452 private Logger _getLogger()
1453 {
1454 if (logger == null)
1455 {
1456 logger = Logger.getLogger(UIViewRoot.class.getName());
1457 }
1458 return logger;
1459 }
1460
1461 private Map<PhaseId, boolean[]> _getListenerSuccessMap()
1462 {
1463
1464 if (listenerSuccessMap == null)
1465 {
1466 listenerSuccessMap = new HashMap<PhaseId, boolean[]>();
1467 }
1468 return listenerSuccessMap;
1469 }
1470
1471 private static interface PhaseProcessor
1472 {
1473 public void process(FacesContext context, UIViewRoot root);
1474 }
1475
1476 private static class ApplyRequestValuesPhaseProcessor implements PhaseProcessor
1477 {
1478 public void process(FacesContext context, UIViewRoot root)
1479 {
1480 PartialViewContext pvc = context.getPartialViewContext();
1481
1482
1483
1484
1485
1486 if (pvc.isPartialRequest() && !pvc.isExecuteAll())
1487 {
1488 pvc.processPartial(PhaseId.APPLY_REQUEST_VALUES);
1489 }
1490
1491
1492
1493
1494
1495 else
1496 {
1497 root._processDecodesDefault(context);
1498 }
1499 }
1500 }
1501
1502 private static class ProcessValidatorPhaseProcessor implements PhaseProcessor
1503 {
1504 public void process(FacesContext context, UIViewRoot root)
1505 {
1506 PartialViewContext pvc = context.getPartialViewContext();
1507
1508
1509
1510
1511
1512 if (pvc.isPartialRequest() && !pvc.isExecuteAll())
1513 {
1514 pvc.processPartial(PhaseId.PROCESS_VALIDATIONS);
1515 }
1516
1517
1518
1519
1520
1521 else
1522 {
1523 root._processValidatorsDefault(context);
1524 }
1525 }
1526 }
1527
1528 private static class UpdateModelPhaseProcessor implements PhaseProcessor
1529 {
1530 public void process(FacesContext context, UIViewRoot root)
1531 {
1532 PartialViewContext pvc = context.getPartialViewContext();
1533
1534
1535
1536
1537
1538 if (pvc.isPartialRequest() && !pvc.isExecuteAll())
1539 {
1540 pvc.processPartial(PhaseId.UPDATE_MODEL_VALUES);
1541 }
1542
1543
1544
1545
1546
1547 else
1548 {
1549 root._processUpdatesDefault(context);
1550 }
1551 }
1552 }
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582 private static class ViewScope extends HashMap<String, Object>
1583 {
1584
1585 private static final long serialVersionUID = -1088893802269478164L;
1586
1587 @Override
1588 public void clear()
1589 {
1590
1591
1592
1593
1594
1595 FacesContext facesContext = FacesContext.getCurrentInstance();
1596 facesContext.getApplication().publishEvent(facesContext,
1597 PreDestroyViewMapEvent.class, facesContext.getViewRoot());
1598
1599 super.clear();
1600 }
1601
1602 }
1603
1604
1605
1606
1607 private class Events
1608 {
1609
1610 private final List<FacesEvent> _anyPhase;
1611
1612 private final List<FacesEvent> _onPhase;
1613
1614 public Events(List<FacesEvent> anyPhase, List<FacesEvent> onPhase)
1615 {
1616 super();
1617 this._anyPhase = anyPhase;
1618 this._onPhase = onPhase;
1619 }
1620
1621 public boolean hasMoreEvents()
1622 {
1623 return (_anyPhase != null && _anyPhase.size() > 0) || (_onPhase != null && _onPhase.size() > 0);
1624 }
1625
1626 public List<FacesEvent> getAnyPhase()
1627 {
1628 return _anyPhase;
1629 }
1630
1631 public List<FacesEvent> getOnPhase()
1632 {
1633 return _onPhase;
1634 }
1635 }
1636 }