1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package javax.faces.event;
21
22 import javax.el.ELContext;
23 import javax.el.ELException;
24 import javax.el.ExpressionFactory;
25 import javax.el.MethodExpression;
26 import javax.el.MethodNotFoundException;
27 import javax.faces.component.StateHolder;
28 import javax.faces.context.FacesContext;
29
30
31
32
33
34
35 public class MethodExpressionActionListener implements ActionListener, StateHolder
36 {
37
38 private static final Class<?>[] EMPTY_CLASS_ARRAY = new Class<?>[0];
39 private static final Object[] EMPTY_PARAMS = new Object[0];
40
41 private MethodExpression methodExpressionOneArg;
42 private MethodExpression methodExpressionZeroArg;
43 private boolean isTransient = false;
44
45
46 public MethodExpressionActionListener()
47 {
48
49 }
50
51 public MethodExpressionActionListener(MethodExpression methodExpressionOneArg)
52 {
53 this.methodExpressionOneArg = methodExpressionOneArg;
54
55 _createZeroArgsMethodExpression(methodExpressionOneArg);
56 }
57
58 public MethodExpressionActionListener(MethodExpression methodExpressionOneArg, MethodExpression methodExpressionZeroArg)
59 {
60 this.methodExpressionOneArg = methodExpressionOneArg;
61 if (methodExpressionZeroArg != null)
62 {
63 this.methodExpressionZeroArg = methodExpressionZeroArg;
64 }
65 else
66 {
67 _createZeroArgsMethodExpression(methodExpressionOneArg);
68 }
69 }
70
71 public void processAction(ActionEvent actionEvent) throws AbortProcessingException
72 {
73 try
74 {
75 try
76 {
77
78 Object[] params = new Object[] { actionEvent };
79 methodExpressionOneArg.invoke(getElContext(), params);
80 }
81 catch (MethodNotFoundException mnfe)
82 {
83
84 methodExpressionZeroArg.invoke(getElContext(), EMPTY_PARAMS);
85 }
86 }
87 catch (ELException e)
88 {
89
90
91
92
93
94
95
96 Throwable cause = e.getCause();
97 AbortProcessingException ape = null;
98 if (cause != null)
99 {
100 do
101 {
102 if (cause != null && cause instanceof AbortProcessingException)
103 {
104 ape = (AbortProcessingException) cause;
105 break;
106 }
107 cause = cause.getCause();
108 }
109 while (cause != null);
110 }
111
112 if (ape != null)
113 {
114
115
116
117
118 throw ape;
119 }
120 throw e;
121
122
123
124
125
126
127
128
129
130
131
132
133
134 }
135 }
136
137 public void restoreState(FacesContext context, Object state)
138 {
139 methodExpressionOneArg = (MethodExpression) ((Object[]) state)[0];
140 methodExpressionZeroArg = (MethodExpression) ((Object[]) state)[1];
141 }
142
143 public Object saveState(FacesContext context)
144 {
145 return new Object[] {methodExpressionOneArg, methodExpressionZeroArg};
146 }
147
148 public void setTransient(boolean newTransientValue)
149 {
150 isTransient = newTransientValue;
151 }
152
153 public boolean isTransient()
154 {
155 return isTransient;
156 }
157
158 private ELContext getElContext()
159 {
160 return getFacesContext().getELContext();
161 }
162
163 private FacesContext getFacesContext()
164 {
165 return FacesContext.getCurrentInstance();
166 }
167
168
169
170
171
172
173
174
175 private void _createZeroArgsMethodExpression(MethodExpression methodExpression)
176 {
177 ExpressionFactory expressionFactory = getFacesContext().getApplication().getExpressionFactory();
178
179 this.methodExpressionZeroArg = expressionFactory.createMethodExpression(getElContext(),
180 methodExpression.getExpressionString(), Void.class, EMPTY_CLASS_ARRAY);
181 }
182
183 }