1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.myfaces.lifecycle;
21
22 import java.util.HashMap;
23 import java.util.Map;
24 import javax.faces.context.FacesContext;
25 import javax.faces.event.ExceptionQueuedEvent;
26 import javax.faces.event.ExceptionQueuedEventContext;
27 import javax.faces.event.PhaseEvent;
28 import javax.faces.event.PhaseId;
29 import javax.faces.event.PhaseListener;
30 import javax.faces.lifecycle.Lifecycle;
31
32
33
34
35
36
37
38 class PhaseListenerManager
39 {
40 private Lifecycle lifecycle;
41 private FacesContext facesContext;
42 private PhaseListener[] phaseListeners;
43
44
45
46
47 private Map<PhaseId, boolean[]> listenerSuccessMap = new HashMap<PhaseId, boolean[]>();
48
49
50 PhaseListenerManager(Lifecycle lifecycle, FacesContext facesContext, PhaseListener[] phaseListeners)
51 {
52 this.lifecycle = lifecycle;
53 this.facesContext = facesContext;
54 this.phaseListeners = phaseListeners;
55 }
56
57 private boolean isListenerForThisPhase(PhaseListener phaseListener, PhaseId phaseId)
58 {
59 int listenerPhaseId = phaseListener.getPhaseId().getOrdinal();
60 return (listenerPhaseId == PhaseId.ANY_PHASE.getOrdinal() || listenerPhaseId == phaseId.getOrdinal());
61 }
62
63 void informPhaseListenersBefore(PhaseId phaseId)
64 {
65 boolean[] beforePhaseSuccess = new boolean[phaseListeners.length];
66 listenerSuccessMap.put(phaseId, beforePhaseSuccess);
67
68 PhaseEvent event = new PhaseEvent(facesContext, phaseId, lifecycle);
69
70 for (int i = 0; i < phaseListeners.length; i++)
71 {
72 PhaseListener phaseListener = phaseListeners[i];
73 if (isListenerForThisPhase(phaseListener, phaseId))
74 {
75 try
76 {
77 phaseListener.beforePhase(event);
78 beforePhaseSuccess[i] = true;
79 }
80 catch (Throwable e)
81 {
82 beforePhaseSuccess[i] = false;
83
84
85
86 publishException (e, phaseId, ExceptionQueuedEventContext.IN_BEFORE_PHASE_KEY);
87
88 return;
89 }
90 }
91 }
92 }
93
94 void informPhaseListenersAfter(PhaseId phaseId)
95 {
96 boolean[] beforePhaseSuccess = listenerSuccessMap.get(phaseId);
97
98 if (beforePhaseSuccess == null)
99 {
100
101 return;
102 }
103
104 PhaseEvent event = null;
105
106 for (int i = phaseListeners.length - 1; i >= 0; i--)
107 {
108 PhaseListener phaseListener = phaseListeners[i];
109 if (isListenerForThisPhase(phaseListener, phaseId) && beforePhaseSuccess[i])
110 {
111 if (event == null)
112 {
113 event = new PhaseEvent(facesContext, phaseId, lifecycle);
114 }
115 try
116 {
117 phaseListener.afterPhase(event);
118 }
119 catch (Throwable e)
120 {
121
122
123 publishException (e, phaseId, ExceptionQueuedEventContext.IN_AFTER_PHASE_KEY);
124 }
125 }
126 }
127
128 }
129
130 private void publishException (Throwable e, PhaseId phaseId, String key)
131 {
132 ExceptionQueuedEventContext context = new ExceptionQueuedEventContext (facesContext, e, null, phaseId);
133
134 context.getAttributes().put (key, Boolean.TRUE);
135
136 facesContext.getApplication().publishEvent (facesContext, ExceptionQueuedEvent.class, context);
137 }
138 }