View Javadoc

1   /**
2    *
3    *  Licensed to the Apache Software Foundation (ASF) under one or more
4    *  contributor license agreements.  See the NOTICE file distributed with
5    *  this work for additional information regarding copyright ownership.
6    *  The ASF licenses this file to You under the Apache License, Version 2.0
7    *  (the "License"); you may not use this file except in compliance with
8    *  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, software
13   *  distributed under the License is distributed on an "AS IS" BASIS,
14   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   *  See the License for the specific language governing permissions and
16   *  limitations under the License.
17   */
18  package org.apache.geronimo.deployment.service;
19  
20  import java.beans.BeanInfo;
21  import java.beans.IntrospectionException;
22  import java.beans.Introspector;
23  import java.beans.PropertyDescriptor;
24  import java.beans.PropertyEditor;
25  import java.lang.reflect.Method;
26  
27  import org.apache.geronimo.common.DeploymentException;
28  import org.apache.geronimo.common.propertyeditor.PropertyEditors;
29  import org.apache.geronimo.deployment.javabean.xbeans.JavabeanType;
30  import org.apache.geronimo.deployment.javabean.xbeans.PropertyType;
31  import org.apache.geronimo.deployment.javabean.xbeans.BeanPropertyType;
32  import org.apache.geronimo.gbean.GBeanInfo;
33  import org.apache.geronimo.gbean.GBeanInfoBuilder;
34  import org.apache.xmlbeans.XmlObject;
35  
36  /**
37   * @version $Rev: 470597 $ $Date: 2006-11-02 15:30:55 -0800 (Thu, 02 Nov 2006) $
38   */
39  public class JavaBeanXmlAttributeBuilder implements XmlAttributeBuilder {
40  
41      private static final String NAMESPACE = "http://geronimo.apache.org/xml/ns/deployment/javabean-1.0";
42  
43      public String getNamespace() {
44          return NAMESPACE;
45      }
46  
47      public Object getValue(XmlObject xmlObject, String type, ClassLoader cl) throws DeploymentException {
48          JavabeanType javabean = (JavabeanType) xmlObject.copy().changeType(JavabeanType.type);
49          return getValue(javabean, type, cl);
50      }
51  
52      private Object getValue(JavabeanType javabean, String className, ClassLoader cl) throws DeploymentException {
53          Class clazz = null;
54          try {
55              clazz = cl.loadClass(className);
56          } catch (ClassNotFoundException e) {
57              throw new DeploymentException("Could not load alleged javabean class " + className, e);
58          }
59          Object instance = null;
60          try {
61              instance = clazz.newInstance();
62          } catch (Exception e) {
63              throw new DeploymentException("Could not create java bean instance", e);
64          }
65          PropertyDescriptor[] propertyDescriptors;
66          try {
67              BeanInfo beanInfo = Introspector.getBeanInfo(clazz);
68              propertyDescriptors = beanInfo.getPropertyDescriptors();
69          } catch (IntrospectionException e) {
70              throw new DeploymentException("Could not analyze java bean class", e);
71          }
72  
73          PropertyType[] properties = javabean.getPropertyArray();
74          for (int i = 0; i < properties.length; i++) {
75              PropertyType property = properties[i];
76              String propertyName = Introspector.decapitalize(property.getName());
77              String propertyString = property.getStringValue().trim();
78              for (int j = 0; j < propertyDescriptors.length; j++) {
79                  PropertyDescriptor propertyDescriptor = propertyDescriptors[j];
80                  if (propertyName.equals(propertyDescriptor.getName())) {
81                      String type = propertyDescriptor.getPropertyType().getName();
82                      PropertyEditor propertyEditor = null;
83                      try {
84                          propertyEditor = PropertyEditors.findEditor(type, cl);
85                      } catch (ClassNotFoundException e) {
86                          throw new DeploymentException("Could not load editor for type " + type, e);
87                      }
88                      if (propertyEditor == null) {
89                          throw new DeploymentException("Unable to find PropertyEditor for " + type);
90                      }
91                      propertyEditor.setAsText(propertyString);
92                      Object value = propertyEditor.getValue();
93                      Method m = propertyDescriptor.getWriteMethod();
94                      try {
95                          m.invoke(instance, new Object[] {value});
96                      } catch (Exception e) {
97                          throw new DeploymentException("Could not set property value for property named " + propertyName, e);
98                      }
99                      break;
100                 }
101             }
102         }
103 
104         BeanPropertyType[] beanProperties = javabean.getBeanPropertyArray();
105         for (int i = 0; i < beanProperties.length; i++) {
106             BeanPropertyType beanProperty = beanProperties[i];
107             String propertyName = Introspector.decapitalize(beanProperty.getName().trim());
108             JavabeanType innerBean = beanProperty.getJavabean();
109             for (int j = 0; j < propertyDescriptors.length; j++) {
110                 PropertyDescriptor propertyDescriptor = propertyDescriptors[j];
111                 if (propertyName.equals(propertyDescriptor.getName())) {
112                     String propertyType = propertyDescriptor.getPropertyType().getName();
113                     Object value = getValue(innerBean, propertyType, cl);
114                     Method m = propertyDescriptor.getWriteMethod();
115                     try {
116                         m.invoke(instance, new Object[] {value});
117                     } catch (Exception e) {
118                         throw new DeploymentException("Could not set property value for property named " + propertyName, e);
119                     }
120                     break;
121                 }
122             }
123         }
124         return instance;
125     }
126 
127     public static final GBeanInfo GBEAN_INFO;
128 
129     static {
130         GBeanInfoBuilder infoBuilder = GBeanInfoBuilder.createStatic(JavaBeanXmlAttributeBuilder.class, "XmlAttributeBuilder");
131         infoBuilder.addInterface(XmlAttributeBuilder.class);
132         GBEAN_INFO = infoBuilder.getBeanInfo();
133     }
134 
135     public static GBeanInfo getGBeanInfo() {
136         return GBEAN_INFO;
137     }
138 }