KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > nextapp > echo2 > app > componentxml > propertypeer > LayoutDataPeer


1 /*
2  * This file is part of the Echo Web Application Framework (hereinafter "Echo").
3  * Copyright (C) 2002-2005 NextApp, Inc.
4  *
5  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
6  *
7  * The contents of this file are subject to the Mozilla Public License Version
8  * 1.1 (the "License"); you may not use this file except in compliance with
9  * the License. You may obtain a copy of the License at
10  * http://www.mozilla.org/MPL/
11  *
12  * Software distributed under the License is distributed on an "AS IS" basis,
13  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
14  * for the specific language governing rights and limitations under the
15  * License.
16  *
17  * Alternatively, the contents of this file may be used under the terms of
18  * either the GNU General Public License Version 2 or later (the "GPL"), or
19  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
20  * in which case the provisions of the GPL or the LGPL are applicable instead
21  * of those above. If you wish to allow use of your version of this file only
22  * under the terms of either the GPL or the LGPL, and not to allow others to
23  * use your version of this file under the terms of the MPL, indicate your
24  * decision by deleting the provisions above and replace them with the notice
25  * and other provisions required by the GPL or the LGPL. If you do not delete
26  * the provisions above, a recipient may use your version of this file under
27  * the terms of any one of the MPL, the GPL or the LGPL.
28  */

29
30 package nextapp.echo2.app.componentxml.propertypeer;
31
32 import java.lang.reflect.InvocationTargetException JavaDoc;
33 import java.lang.reflect.Method JavaDoc;
34 import java.util.Iterator JavaDoc;
35
36 import nextapp.echo2.app.LayoutData;
37 import nextapp.echo2.app.Style;
38 import nextapp.echo2.app.componentxml.ComponentIntrospector;
39 import nextapp.echo2.app.componentxml.ComponentXmlException;
40 import nextapp.echo2.app.componentxml.InvalidPropertyException;
41 import nextapp.echo2.app.componentxml.PropertyLoader;
42 import nextapp.echo2.app.componentxml.PropertyXmlPeer;
43 import nextapp.echo2.app.util.DomUtil;
44
45 import org.w3c.dom.Element JavaDoc;
46
47 /**
48  * <code>PropertyXmlPeer</code> implementation for
49  * <code>nextapp.echo2.app.LayoutData</code>-derived properties.
50  * <p>
51  * This peer will load properties for arbitrary <code>LayoutData</code>
52  * implementations using class introspection and reflection. The
53  * implementation does not currently support the setting of indexed
54  * properties.
55  */

56 public class LayoutDataPeer
57 implements PropertyXmlPeer {
58     
59     /**
60      * @see nextapp.echo2.app.componentxml.PropertyXmlPeer#getValue(java.lang.ClassLoader,
61      * java.lang.Class, org.w3c.dom.Element)
62      */

63     public Object JavaDoc getValue(ClassLoader JavaDoc classLoader, Class JavaDoc objectClass, Element JavaDoc propertyElement)
64     throws InvalidPropertyException {
65         try {
66             Element JavaDoc layoutDataElement = DomUtil.getChildElementByTagName(propertyElement, "layout-data");
67             String JavaDoc type = layoutDataElement.getAttribute("type");
68
69             // Load properties from XML into Style.
70
PropertyLoader propertyLoader = PropertyLoader.forClassLoader(classLoader);
71             Element JavaDoc propertiesElement = DomUtil.getChildElementByTagName(layoutDataElement, "properties");
72             Style propertyStyle = propertyLoader.createStyle(propertiesElement, type);
73             
74             // Instantiate LayoutData instance.
75
Class JavaDoc propertyClass = Class.forName(type, true, classLoader);
76             LayoutData layoutData = (LayoutData) propertyClass.newInstance();
77             
78             // Create introspector to analyze LayoutData class.
79
ComponentIntrospector ci = ComponentIntrospector.forName(type, classLoader);
80             
81             // Set property values of LayoutData instance.
82
Iterator JavaDoc it = propertyStyle.getPropertyNames();
83             while (it.hasNext()) {
84                 String JavaDoc propertyName = (String JavaDoc) it.next();
85                 Method JavaDoc writeMethod = ci.getWriteMethod(propertyName);
86                 writeMethod.invoke(layoutData, new Object JavaDoc[]{propertyStyle.getProperty(propertyName)});
87             }
88             
89             return layoutData;
90         } catch (ClassNotFoundException JavaDoc ex) {
91             throw new InvalidPropertyException("Unable to process properties.", ex);
92         } catch (ComponentXmlException ex) {
93             throw new InvalidPropertyException("Unable to process properties.", ex);
94         } catch (InstantiationException JavaDoc ex) {
95             throw new InvalidPropertyException("Unable to process properties.", ex);
96         } catch (IllegalAccessException JavaDoc ex) {
97             throw new InvalidPropertyException("Unable to process properties.", ex);
98         } catch (IllegalArgumentException JavaDoc ex) {
99             throw new InvalidPropertyException("Unable to process properties.", ex);
100         } catch (InvocationTargetException JavaDoc ex) {
101             throw new InvalidPropertyException("Unable to process properties.", ex);
102         }
103     }
104 }
105
Popular Tags