View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  
20  package javax.faces.event;
21  
22  import javax.el.ELContext;
23  import javax.el.ELException;
24  import javax.el.MethodExpression;
25  import javax.faces.component.StateHolder;
26  import javax.faces.context.FacesContext;
27  
28  /**
29   * See Javadoc of <a href="http://java.sun.com/javaee/javaserverfaces/1.2/docs/api/index.html">JSF Specification</a>
30   *
31   * @author Stan Silvert
32   */
33  public class MethodExpressionActionListener implements ActionListener, StateHolder {
34      
35      private MethodExpression methodExpression;
36      
37      private boolean isTransient = false;
38      
39      /** Creates a new instance of MethodExpressionActionListener */
40      public MethodExpressionActionListener() {
41      }
42      
43      public MethodExpressionActionListener(MethodExpression methodExpression) {
44          this.methodExpression = methodExpression;
45      }
46  
47      public void processAction(ActionEvent actionEvent) throws AbortProcessingException {
48          try
49          {
50              Object[] params = new Object[]{actionEvent};
51              methodExpression.invoke(elContext(), params);
52          }
53          catch (ELException e)
54          {
55              Throwable cause = e.getCause();
56              if (cause != null && cause instanceof AbortProcessingException)
57              {
58                  throw (AbortProcessingException)cause;
59              }
60              else
61              {
62                  throw e;
63              }
64          }
65      }
66      
67      private ELContext elContext() {
68          return FacesContext.getCurrentInstance().getELContext();
69      }
70      
71      public void restoreState(FacesContext context, Object state) {
72          methodExpression = (MethodExpression)state;
73      }
74  
75      public Object saveState(FacesContext context) {
76          return methodExpression;
77      }
78  
79      public void setTransient(boolean newTransientValue) {
80          isTransient = newTransientValue;
81      }
82  
83      public boolean isTransient() {
84          return isTransient;
85      }
86      
87  }