1 20 package org.apache.beehive.wsm.databinding.xmlbeans; 21 22 import java.lang.reflect.Method ; 23 24 import javax.xml.namespace.QName ; 25 26 import org.apache.beehive.wsm.databinding.BindingLookupService; 27 import org.apache.log4j.Logger; 28 import org.apache.xmlbeans.SchemaField; 29 import org.apache.xmlbeans.SchemaType; 30 import org.apache.xmlbeans.SchemaTypeLoader; 31 import org.apache.xmlbeans.XmlBeans; 32 import org.apache.xmlbeans.XmlObject; 33 34 35 36 public class XmlBeanTypeLookup implements BindingLookupService { 37 static Logger logger = Logger.getLogger(XmlBeanTypeLookup.class); 38 static XmlBeanTypeLookup theLookup = new XmlBeanTypeLookup(); 39 40 public QName class2qname( Class cls) { 41 if (XmlObject.class.isAssignableFrom(cls)) { 42 return XmlBeans.typeForClass(cls).getName(); 43 } 44 return null; 45 } 46 47 public QName class2qname(Class cls, String defaultnamespace) { 48 QName res = class2qname(cls); 49 return res; 51 } 52 53 56 public Class qname2class(QName qname) { 57 logger.debug("Get XMLBeans class for Qname: " + qname); 58 SchemaTypeLoader stl = XmlBeans.getContextTypeLoader(); 59 SchemaType st = stl.findType(qname); 60 if (st == null) { 61 SchemaField sf = stl.findElement(qname); 62 if (sf != null) { 63 st = sf.getType(); 64 } 65 } 66 67 if (st != null) { 68 Class xmlClass = st.getJavaClass(); 69 70 if (st.isBuiltinType()) { 72 Method [] declared = xmlClass.getDeclaredMethods(); 73 Class natural = 74 scanDeclaredMethodsForViableReturnType(declared); 75 if (natural != null) { 76 return natural; 77 } 78 else { 79 82 if (xmlClass.isInterface()) { 83 for (Class cl : xmlClass.getInterfaces()) { 84 natural = scanDeclaredMethodsForViableReturnType 85 (cl.getDeclaredMethods()); 86 if (natural != null) { 87 return natural; 88 } 89 } 90 } 91 else { 92 declared = xmlClass.getSuperclass().getDeclaredMethods(); 93 natural = scanDeclaredMethodsForViableReturnType 94 (declared); 95 if (natural != null) { 96 return natural; 97 } 98 } 99 } 100 } 101 return xmlClass; 102 } 103 else { 104 return null; 108 } 109 } 110 111 private Class scanDeclaredMethodsForViableReturnType 112 (Method [] declared) { 113 116 for (Method meth : declared) { 117 118 Class returnType = meth.getReturnType(); 119 if (!returnType.equals(Void.TYPE)) { 121 128 if (returnType.isArray() 129 || returnType.isPrimitive() 130 || returnType.equals(String .class) 131 || returnType.equals(QName .class) 132 || returnType.equals(java.util.Calendar .class) 133 || returnType.equals(java.math.BigDecimal .class) 134 || returnType.equals(java.math.BigInteger .class)) { 135 136 return returnType; 137 } 138 } 139 } 140 return null; 141 } 142 143 147 public static Class q2Class(QName q) { 148 return theLookup.qname2class(q); 149 } 150 151 } 152 | Popular Tags |