KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > icesoft > faces > webapp > parser > ELSetPropertiesRule


1 /*
2  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3  *
4  * "The contents of this file are subject to the Mozilla Public License
5  * Version 1.1 (the "License"); you may not use this file except in
6  * compliance with the License. You may obtain a copy of the License at
7  * http://www.mozilla.org/MPL/
8  *
9  * Software distributed under the License is distributed on an "AS IS"
10  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
11  * License for the specific language governing rights and limitations under
12  * the License.
13  *
14  * The Original Code is ICEfaces 1.5 open source software code, released
15  * November 5, 2006. The Initial Developer of the Original Code is ICEsoft
16  * Technologies Canada, Corp. Portions created by ICEsoft are Copyright (C)
17  * 2004-2006 ICEsoft Technologies Canada, Corp. All Rights Reserved.
18  *
19  * Contributor(s): _____________________.
20  *
21  * Alternatively, the contents of this file may be used under the terms of
22  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"
23  * License), in which case the provisions of the LGPL License are
24  * applicable instead of those above. If you wish to allow use of your
25  * version of this file only under the terms of the LGPL License and not to
26  * allow others to use your version of this file under the MPL, indicate
27  * your decision by deleting the provisions above and replace them with
28  * the notice and other provisions required by the LGPL License. If you do
29  * not delete the provisions above, a recipient may use your version of
30  * this file under either the MPL or the LGPL License."
31  *
32  */

33
34 package com.icesoft.faces.webapp.parser;
35
36 import org.apache.commons.beanutils.BeanUtils;
37 import org.apache.commons.digester.Rule;
38 import org.xml.sax.Attributes JavaDoc;
39
40 import javax.el.MethodExpression;
41 import javax.el.ValueExpression;
42 import javax.faces.context.FacesContext;
43 import javax.faces.webapp.UIComponentTag;
44 import javax.faces.webapp.UIComponentELTag;
45 import javax.faces.event.ActionEvent;
46 import java.util.HashMap JavaDoc;
47
48
49 public class ELSetPropertiesRule extends Rule {
50     //marker class to detect JSF 1.2 JSP tags
51
static Class JavaDoc elTagClass = UIComponentELTag.class;
52
53     public void begin(Attributes JavaDoc attributes) throws Exception JavaDoc {
54         FacesContext facesContext = FacesContext.getCurrentInstance();
55         HashMap JavaDoc values = new HashMap JavaDoc();
56         Object JavaDoc top = digester.peek();
57
58         for (int i = 0; i < attributes.getLength(); i++) {
59             String JavaDoc name = attributes.getLocalName(i);
60             if ("".equals(name)) {
61                 name = attributes.getQName(i);
62             }
63             String JavaDoc value = attributes.getValue(i);
64
65             //take a guess at the types of the JSF 1.2 tag members
66
//we are probably better off doing this reflectively
67
if (name != null) {
68                 values.put(name, value);
69                 if (("id".equals(name)) ||
70                     ("name".equals(name)) ||
71                     ("var".equals(name))) {
72                     values.put(name, value);
73                 } else if (top instanceof UIComponentTag) {
74                     //must be a JSF 1.1 tag
75
values.put(name, value);
76                 } else if ("action".equals(name)) {
77                     values.put(name,
78                             getMethodExpression( facesContext, name, value,
79                                     null ));
80                 } else if ("actionListener".equals(name)) {
81                     values.put(name,
82                             getMethodExpression(facesContext, name, value,
83                                     ActionEvent.class));
84                 } else {
85                     values.put(name,
86                             getValueExpression(facesContext, name, value));
87                 }
88                 if (top instanceof javax.faces.webapp.UIComponentELTag) {
89                     //special case for
90
//com.sun.faces.taglib.jsf_core.ParameterTag
91
//and potentially others
92
if ("name".equals(name)) {
93                         values.put(name,
94                                 getValueExpression(facesContext, name, value));
95                     }
96                 }
97
98             }
99         }
100
101
102         BeanUtils.populate(top, values);
103     }
104
105     private ValueExpression getValueExpression(FacesContext facesContext,
106                                                String JavaDoc name, String JavaDoc value) {
107
108         Class JavaDoc argType = Object JavaDoc.class;
109         try {
110             if ( value.equalsIgnoreCase("true") ||
111                         value.equalsIgnoreCase("false") ) {
112                 argType = Boolean JavaDoc.class;
113             } else if (null != Integer.valueOf(value)) {
114                 //attempt to coerce to Integer type for standard JSF components
115
argType = Integer JavaDoc.class;
116             }
117         } catch (NumberFormatException JavaDoc e) {
118         }
119
120         
121         ValueExpression valueExpression =
122                 facesContext.getApplication().getExpressionFactory()
123                         .createValueExpression(
124                                 facesContext.getELContext(),
125                                 value, argType );
126
127         return valueExpression;
128     }
129
130     private MethodExpression getMethodExpression(FacesContext facesContext,
131                                                  String JavaDoc name, String JavaDoc value,
132                                                  Class JavaDoc argType) {
133         Class JavaDoc[] argTypes = new Class JavaDoc[]{};
134         if (null != argType) {
135             argTypes = new Class JavaDoc[]{argType};
136         }
137
138         MethodExpression methodExpression =
139                 facesContext.getApplication().getExpressionFactory()
140                         .createMethodExpression(
141                                                 facesContext.getELContext(),
142                                                 value, String JavaDoc.class,
143                                                 argTypes);
144         return methodExpression;
145     }
146     
147 }
148
Popular Tags