1 package org.codehaus.xfire.aegis.type.java5;
2
3 import java.beans.PropertyDescriptor;
4 import java.lang.reflect.Method;
5 import java.lang.reflect.ParameterizedType;
6
7 import javax.xml.namespace.QName;
8
9 import org.codehaus.xfire.aegis.type.AbstractTypeCreator;
10 import org.codehaus.xfire.aegis.type.Type;
11 import org.codehaus.xfire.aegis.type.basic.BeanType;
12 import org.codehaus.xfire.util.NamespaceHelper;
13 import org.codehaus.xfire.util.ServiceUtils;
14
15 public class Java5TypeCreator
16 extends AbstractTypeCreator
17 {
18
19 @Override
20 public TypeClassInfo createClassInfo(Method m, int index)
21 {
22 if (index >= 0)
23 {
24 TypeClassInfo info;
25 java.lang.reflect.Type genericType = m.getGenericParameterTypes()[index];
26 if(genericType instanceof Class)
27 {
28 info = nextCreator.createClassInfo(m, index);
29 }
30 else
31 {
32 info = new TypeClassInfo();
33 info.setGenericType(genericType);
34 }
35 info.setTypeClass(m.getParameterTypes()[index]);
36 if(m.getParameterAnnotations()[index].length > 0)
37 info.setAnnotations(m.getParameterAnnotations()[index]);
38 return info;
39 }
40 else
41 {
42 java.lang.reflect.Type genericReturnType = m.getGenericReturnType();
43 TypeClassInfo info;
44 if(genericReturnType instanceof Class)
45 {
46 info = nextCreator.createClassInfo(m, index);
47 }
48 else
49 {
50 info = new TypeClassInfo();
51 info.setGenericType(genericReturnType);
52 }
53 info.setTypeClass(m.getReturnType());
54 if(m.getAnnotations().length > 0)
55 info.setAnnotations(m.getAnnotations());
56 return info;
57 }
58 }
59
60 @Override
61 public TypeClassInfo createClassInfo(PropertyDescriptor pd)
62 {
63 TypeClassInfo info = createBasicClassInfo(pd.getPropertyType());
64 info.setGenericType(pd.getReadMethod().getGenericReturnType());
65 info.setAnnotations(pd.getReadMethod().getAnnotations());
66
67 XmlElement el = pd.getReadMethod().getAnnotation(XmlElement.class);
68 if (el != null && !el.type().equals(Type.class))
69 {
70 info.setType(el.type());
71 }
72
73 XmlAttribute att = pd.getReadMethod().getAnnotation(XmlAttribute.class);
74 if (att != null && !att.type().equals(Type.class))
75 {
76 info.setType(att.type());
77 }
78
79 return info;
80 }
81
82 @Override
83 public Type createCollectionType(TypeClassInfo info)
84 {
85 Object genericType = info.getGenericType();
86 Class paramClass = Object.class;
87 if (genericType instanceof ParameterizedType)
88 {
89 ParameterizedType type = (ParameterizedType) genericType;
90
91 if (type.getActualTypeArguments()[0] instanceof Class)
92 {
93 paramClass = (Class) type.getActualTypeArguments()[0];
94 }
95 }
96
97 return super.createCollectionType(info, paramClass);
98 }
99
100 @Override
101 public Type createDefaultType(TypeClassInfo info)
102 {
103 BeanType type = new BeanType(new AnnotatedTypeInfo(getTypeMapping(), info.getTypeClass()));
104 type.setTypeMapping(getTypeMapping());
105 type.setSchemaType(createQName(info.getTypeClass()));
106
107 return type;
108 }
109
110 @Override
111 public Type createEnumType(TypeClassInfo info)
112 {
113 EnumType type = new EnumType();
114
115 type.setSchemaType(createQName(info.getTypeClass()));
116 type.setTypeClass(info.getTypeClass());
117 type.setTypeMapping(getTypeMapping());
118
119 return type;
120 }
121
122 @Override
123 public QName createQName(Class typeClass)
124 {
125 String name = null;
126 String ns = null;
127
128 XmlType xtype = (XmlType) typeClass.getAnnotation(XmlType.class);
129 if (xtype != null)
130 {
131 name = xtype.name();
132 ns = xtype.namespace();
133 }
134
135 String clsName = typeClass.getName();
136 if (name == null || name.length() == 0)
137 name = ServiceUtils.makeServiceNameFromClassName(typeClass);
138
139 if (ns == null || ns.length() == 0)
140 ns = NamespaceHelper.makeNamespaceFromClassName(clsName, "http");
141
142 return new QName(ns, name);
143 }
144
145 @Override
146 protected boolean isEnum(Class javaType)
147 {
148 return javaType.isEnum();
149 }
150 }