1 package org.codehaus.xfire.xmlbeans; 2 3 import java.beans.PropertyDescriptor; 4 import java.lang.reflect.Field; 5 import java.lang.reflect.Method; 6 7 import org.apache.xmlbeans.XmlObject; 8 import org.codehaus.xfire.aegis.type.Type; 9 import org.codehaus.xfire.aegis.type.TypeCreator; 10 import org.codehaus.xfire.aegis.type.TypeMapping; 11 12 public class XmlBeansTypeCreator 13 implements TypeCreator 14 { 15 private TypeCreator nextCreator; 16 private TypeMapping typeMapping; 17 18 public XmlBeansTypeCreator(TypeCreator nextCreator) 19 { 20 this.nextCreator = nextCreator; 21 } 22 23 public TypeMapping getTypeMapping() 24 { 25 return typeMapping; 26 } 27 28 public Type createType(Method m, int index) 29 { 30 Class clazz = null; 31 if (index > -1) 32 { 33 clazz = m.getParameterTypes()[index]; 34 } 35 else 36 { 37 clazz = m.getReturnType(); 38 } 39 40 if (isXmlBean(clazz)) 41 { 42 return createXmlBeanType(clazz); 43 } 44 else 45 { 46 System.out.println(nextCreator); 47 return nextCreator.createType(m, index); 48 } 49 } 50 51 protected Type createXmlBeanType(Class clazz) 52 { 53 return new XmlBeansType(clazz); 54 } 55 56 private boolean isXmlBean(Class clazz) 57 { 58 return XmlObject.class.isAssignableFrom(clazz); 59 } 60 61 public Type createType(PropertyDescriptor pd) 62 { 63 Class clazz = pd.getPropertyType(); 64 if (isXmlBean(clazz)) 65 { 66 return createXmlBeanType(clazz); 67 } 68 else 69 { 70 return nextCreator.createType(pd); 71 } 72 } 73 74 public Type createType(Field f) 75 { 76 Class clazz = f.getType(); 77 if (isXmlBean(clazz)) 78 { 79 return createXmlBeanType(clazz); 80 } 81 else 82 { 83 return nextCreator.createType(f); 84 } 85 } 86 87 public Type createType(Class clazz) 88 { 89 if (isXmlBean(clazz)) 90 { 91 return createXmlBeanType(clazz); 92 } 93 else 94 { 95 return nextCreator.createType(clazz); 96 } 97 } 98 99 public void setTypeMapping(TypeMapping typeMapping) 100 { 101 this.typeMapping = typeMapping; 102 103 nextCreator.setTypeMapping(typeMapping); 104 } 105 }