KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > icesoft > faces > facelets > TabChangeListenerHandler


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.facelets;
35
36 import com.sun.facelets.FaceletContext;
37 import com.sun.facelets.tag.TagAttribute;
38 import com.sun.facelets.tag.TagAttributeException;
39 import com.sun.facelets.tag.TagConfig;
40 import com.sun.facelets.tag.TagException;
41 import com.sun.facelets.tag.TagHandler;
42 import com.sun.facelets.tag.jsf.ComponentSupport;
43
44 import javax.el.ELException;
45 import javax.faces.FacesException;
46 import javax.faces.component.UIComponent;
47 import java.io.IOException JavaDoc;
48 import java.lang.reflect.Method JavaDoc;
49
50 /**
51  * @author Mark Collette
52  * @since 1.1
53  */

54 public class TabChangeListenerHandler extends TagHandler {
55     private static Class JavaDoc panelTabSetClass;
56     private static Class JavaDoc tabChangeListenerClass;
57     private static Method JavaDoc addTabChangeListenerMethod;
58     private static boolean triedGettingICEfacesComponentClasses;
59
60     private static synchronized boolean isICEfacesComponentClassesPresent() {
61         if( !triedGettingICEfacesComponentClasses ) {
62             try {
63                 panelTabSetClass = Class.forName(
64                         "com.icesoft.faces.component.paneltabset.PanelTabSet");
65                 tabChangeListenerClass = Class.forName(
66                         "com.icesoft.faces.component.paneltabset.TabChangeListener");
67                 addTabChangeListenerMethod = panelTabSetClass.getMethod(
68                         "addTabChangeListener", new Class JavaDoc[]{tabChangeListenerClass});
69             }
70             catch (Exception JavaDoc e) {
71             }
72             triedGettingICEfacesComponentClasses = true;
73         }
74         return (panelTabSetClass != null &&
75                 tabChangeListenerClass != null &&
76                 addTabChangeListenerMethod != null);
77     }
78
79
80     private final TagAttribute typeTagAttribute;
81
82     /**
83      * @param config
84      */

85     public TabChangeListenerHandler(TagConfig config) {
86         super(config);
87
88         typeTagAttribute = getRequiredAttribute("type");
89     }
90
91     /**
92      * Threadsafe Method for controlling evaluation of its child tags,
93      * represented by "nextHandler"
94      */

95     public void apply(FaceletContext ctx, UIComponent parent)
96             throws IOException JavaDoc, FacesException, ELException {
97         if( !isICEfacesComponentClassesPresent() ) {
98             throw new TagException(
99                     tag,
100                     "ICEfaces components classes not found, can not use this tag");
101         }
102         if( parent == null ) {
103             throw new TagException(tag, "Parent UIComponent was null");
104         }
105         if( !panelTabSetClass.isAssignableFrom(parent.getClass()) ) {
106             throw new TagException(
107                     tag,
108                     "Parent UIComponent must be a "+
109                     "com.icesoft.faces.component.paneltabset.PanelTabSet");
110         }
111         if( !typeTagAttribute.isLiteral() ) {
112             throw new TagAttributeException(
113                     tag, typeTagAttribute,
114                     "The class, as given by tabChangeListener tag's type " +
115                     "attribute, must be literal, and not a value expression: " +
116                     typeTagAttribute.getValue());
117         }
118         String JavaDoc listenerClassName = typeTagAttribute.getValue(ctx);
119         try {
120             Class JavaDoc listenerClass = Class.forName( listenerClassName );
121             if( !tabChangeListenerClass.isAssignableFrom(listenerClass) ) {
122                 throw new TagAttributeException(
123                         tag, typeTagAttribute,
124                         "The class, as given by tabChangeListener tag's type " +
125                         "attribute, must implement TabChangeListener: " +
126                         listenerClassName);
127             }
128
129             if( ComponentSupport.isNew(parent) ) {
130                 // TabChangeListener instance
131
Object JavaDoc listenerObject = listenerClass.newInstance();
132                 addTabChangeListenerMethod.invoke(
133                         parent, new Object JavaDoc[]{listenerObject} );
134             }
135         }
136         catch(Exception JavaDoc e) {
137             throw new TagAttributeException(
138                     tag, typeTagAttribute,
139                     "Could not either find, or instantiate, or add as a " +
140                     "listener, the class described by tabChangeListener " +
141                     "tag's type attribute: " + listenerClassName, e);
142         }
143
144         //TODO Use nextHandler? ice:tabChangeListener can't have children
145
}
146 }
147
Popular Tags