1 package org.codehaus.xfire.aegis.type.basic;
2
3 import java.beans.PropertyDescriptor;
4
5 import javax.xml.namespace.QName;
6
7 import org.apache.commons.logging.Log;
8 import org.apache.commons.logging.LogFactory;
9 import org.codehaus.xfire.XFireRuntimeException;
10 import org.codehaus.xfire.aegis.type.Type;
11 import org.codehaus.xfire.aegis.type.TypeMapping;
12 import org.codehaus.xfire.util.ClassLoaderUtils;
13 import org.codehaus.yom.Element;
14 import org.codehaus.yom.Elements;
15
16 public class XMLBeanTypeInfo
17 extends BeanTypeInfo
18 {
19 private static final Log logger = LogFactory.getLog(XMLBeanTypeInfo.class);
20 private String encodingUri;
21 private Element mapping;
22 private QName name;
23
24 public XMLBeanTypeInfo(TypeMapping tm,
25 Class typeClass,
26 Element mapping)
27 {
28 super(typeClass, tm.getEncodingStyleURI());
29
30 this.mapping = mapping;
31 setTypeMapping(tm);
32 }
33
34 public QName getSchemaType()
35 {
36 if (name == null)
37 {
38 name = createQName(mapping, mapping.getAttributeValue("name"));
39 }
40
41 return name;
42 }
43
44 protected void mapProperty(PropertyDescriptor pd)
45 {
46 Element e = getPropertyElement(mapping, pd.getName());
47 String style = null;
48 QName name = null;
49
50 if (e != null)
51 {
52 String ignore = e.getAttributeValue("ignore");
53 if (ignore != null && ignore.equals("true"))
54 return;
55
56 logger.debug("Found mapping for property " + pd.getName());
57
58 style = e.getAttributeValue("style");
59 name = createQName(e, e.getAttributeValue("mappedName"));
60 }
61
62 if (style == null) style = "element";
63 if (name == null) name = createQName(pd);
64
65 try
66 {
67 Type type = getTypeMapping().getTypeCreator().createType(pd);
68
69 getTypeMapping().register(type);
70
71 if (style.equals("element"))
72 mapElement(pd.getName(), name);
73 else if (style.equals("attribute"))
74 mapAttribute(pd.getName(), name);
75 else
76 throw new XFireRuntimeException("Invalid style: " + style);
77 }
78 catch(XFireRuntimeException ex)
79 {
80 ex.prepend("Couldn't create type for property " + pd.getName()
81 + " on " + getTypeClass());
82
83 throw ex;
84 }
85 }
86
87 private Element getPropertyElement(Element mapping2, String name2)
88 {
89 Elements elements = mapping2.getChildElements("property");
90 for (int i = 0; i < elements.size(); i++)
91 {
92 Element e = elements.get(i);
93 String name = e.getAttributeValue("name");
94
95 if (name != null && name.equals(name2))
96 {
97 return e;
98 }
99 }
100
101 return null;
102 }
103
104 private Class loadClass(String componentType)
105 {
106 try
107 {
108 return ClassLoaderUtils.loadClass(componentType, getClass());
109 }
110 catch (ClassNotFoundException e)
111 {
112 throw new XFireRuntimeException("Couldn't find component type: " + componentType, e);
113 }
114 }
115
116 protected QName createQName(Element e, String value)
117 {
118 if (value == null) return null;
119
120 int index = value.indexOf(":");
121
122 if (index == -1)
123 throw new XFireRuntimeException("Invalid QName in mapping: " + value);
124
125 String prefix = value.substring(0, index);
126 String localName = value.substring(index+1);
127 String ns = e.getNamespaceURI(prefix);
128
129 if (ns == null || localName == null)
130 throw new XFireRuntimeException("Invalid QName in mapping: " + value);
131
132 return new QName(ns, localName, prefix);
133 }
134 }