KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > sun > facelets > tag > jsf > core > ValueChangeListenerHandler


1 /**
2  * Licensed under the Common Development and Distribution License,
3  * you may not use this file except in compliance with the License.
4  * You may obtain a copy of the License at
5  *
6  * http://www.sun.com/cddl/
7  *
8  * Unless required by applicable law or agreed to in writing, software
9  * distributed under the License is distributed on an "AS IS" BASIS,
10  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
11  * implied. See the License for the specific language governing
12  * permissions and limitations under the License.
13  */

14
15 package com.sun.facelets.tag.jsf.core;
16
17 import java.io.IOException JavaDoc;
18
19 import javax.el.ELException;
20 import javax.el.ValueExpression;
21 import javax.faces.FacesException;
22 import javax.faces.component.EditableValueHolder;
23 import javax.faces.component.UIComponent;
24 import javax.faces.event.ValueChangeListener;
25
26 import com.sun.facelets.FaceletContext;
27 import com.sun.facelets.FaceletException;
28 import com.sun.facelets.tag.TagAttribute;
29 import com.sun.facelets.tag.TagAttributeException;
30 import com.sun.facelets.tag.TagConfig;
31 import com.sun.facelets.tag.TagException;
32 import com.sun.facelets.tag.TagHandler;
33
34 /**
35  * Register an ValueChangeListener instance on the UIComponent associated with
36  * the closest parent UIComponent custom action.<p/> See <a target="_new"
37  * HREF="http://java.sun.com/j2ee/javaserverfaces/1.1_01/docs/tlddocs/f/valueChangeListener.html">tag
38  * documentation</a>.
39  *
40  * @author Jacob Hookom
41  * @version $Id: ValueChangeListenerHandler.java,v 1.2 2005/08/24 04:38:50 jhook Exp $
42  */

43 public final class ValueChangeListenerHandler extends TagHandler {
44
45     private Class JavaDoc listenerType;
46
47     private final TagAttribute type;
48
49     private final TagAttribute binding;
50
51     public ValueChangeListenerHandler(TagConfig config) {
52         super(config);
53         this.binding = this.getAttribute("binding");
54         this.type = this.getAttribute("type");
55         if (type != null) {
56             try {
57                 this.listenerType = Class.forName(type.getValue());
58             } catch (Exception JavaDoc e) {
59                 throw new TagAttributeException(this.tag, this.type, e);
60             }
61         }
62     }
63
64     /**
65      * See taglib documentation.
66      *
67      * @see com.sun.facelets.FaceletHandler#apply(com.sun.facelets.FaceletContext,
68      * javax.faces.component.UIComponent)
69      */

70     public void apply(FaceletContext ctx, UIComponent parent)
71             throws IOException JavaDoc, FacesException, FaceletException, ELException {
72         if (parent instanceof EditableValueHolder) {
73             // only process if parent was just created
74
if (parent.getParent() == null) {
75                 EditableValueHolder evh = (EditableValueHolder) parent;
76                 ValueChangeListener listener = null;
77                 ValueExpression ve = null;
78                 if (this.binding != null) {
79                     ve = this.binding.getValueExpression(ctx,
80                             ValueChangeListener.class);
81                     listener = (ValueChangeListener) ve.getValue(ctx);
82                 }
83                 if (listener == null && this.listenerType != null) {
84                     try {
85                         listener = (ValueChangeListener) listenerType
86                                 .newInstance();
87                     } catch (Exception JavaDoc e) {
88                         throw new TagAttributeException(this.tag, this.type, e);
89                     }
90                     if (ve != null) {
91                         ve.setValue(ctx, ve);
92                     }
93                 } else {
94                     throw new TagAttributeException(this.tag, this.binding,
95                             "Binding evaluated to null, and there wasn't a 'type' Attribute Specified");
96                 }
97                 evh.addValueChangeListener(listener);
98             }
99         } else {
100             throw new TagException(this.tag,
101                     "Parent is not of type EditableValueHolder, type is: "
102                             + parent);
103         }
104     }
105
106 }
107
Popular Tags