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.util.NamespaceHelper;
12
13 public class Java5TypeCreator
14 extends AbstractTypeCreator
15 {
16
17 @Override
18 public TypeClassInfo createClassInfo(Method m, int index)
19 {
20 if (index >= 0)
21 {
22 TypeClassInfo info;
23 java.lang.reflect.Type genericType = m.getGenericParameterTypes()[index];
24 if(genericType instanceof Class)
25 {
26 info = nextCreator.createClassInfo(m, index);
27 }
28 else
29 {
30 info = new TypeClassInfo();
31 info.setGenericType(genericType);
32 }
33 info.setTypeClass(m.getParameterTypes()[index]);
34 if(m.getParameterAnnotations()[index].length > 0)
35 info.setAnnotations(m.getParameterAnnotations()[index]);
36 return info;
37 }
38 else
39 {
40 java.lang.reflect.Type genericReturnType = m.getGenericReturnType();
41 TypeClassInfo info;
42 if(genericReturnType instanceof Class)
43 {
44 info = nextCreator.createClassInfo(m, index);
45 }
46 else
47 {
48 info = new TypeClassInfo();
49 info.setGenericType(genericReturnType);
50 }
51 info.setTypeClass(m.getReturnType());
52 if(m.getAnnotations().length > 0)
53 info.setAnnotations(m.getAnnotations());
54 return info;
55 }
56 }
57
58 @Override
59 public TypeClassInfo createClassInfo(PropertyDescriptor pd)
60 {
61 TypeClassInfo info = createBasicClassInfo(pd.getPropertyType());
62 info.setGenericType(pd.getReadMethod().getGenericReturnType());
63 info.setAnnotations(pd.getReadMethod().getAnnotations());
64
65 return info;
66 }
67
68 @Override
69 public Type createCollectionType(TypeClassInfo info)
70 {
71 Object genericType = info.getGenericType();
72 Class paramClass = Object.class;
73 if (genericType instanceof ParameterizedType)
74 {
75 ParameterizedType type = (ParameterizedType) genericType;
76
77 if (type.getActualTypeArguments()[0] instanceof Class)
78 {
79 paramClass = (Class) type.getActualTypeArguments()[0];
80 }
81 }
82
83 return super.createCollectionType(info, paramClass);
84 }
85
86 @Override
87 public Type createDefaultType(TypeClassInfo info)
88 {
89 AnnotatedType type = new AnnotatedType(info.getTypeClass());
90 type.setTypeMapping(getTypeMapping());
91
92 return type;
93 }
94
95 @Override
96 public Type createEnumType(TypeClassInfo info)
97 {
98 EnumType type = new EnumType();
99
100 String name = info.getTypeClass().getSimpleName();
101 String ns = NamespaceHelper.makeNamespaceFromClassName(info.getTypeClass().getName(), "http");
102
103 type.setSchemaType(new QName(ns, name));
104 type.setTypeClass(info.getTypeClass());
105 type.setTypeMapping(getTypeMapping());
106
107 return type;
108 }
109
110 @Override
111 protected boolean isEnum(Class javaType)
112 {
113 return javaType.isEnum();
114 }
115 }