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 return info;
68 }
69
70 @Override
71 public Type createCollectionType(TypeClassInfo info)
72 {
73 Object genericType = info.getGenericType();
74 Class paramClass = Object.class;
75 if (genericType instanceof ParameterizedType)
76 {
77 ParameterizedType type = (ParameterizedType) genericType;
78
79 if (type.getActualTypeArguments()[0] instanceof Class)
80 {
81 paramClass = (Class) type.getActualTypeArguments()[0];
82 }
83 }
84
85 return super.createCollectionType(info, paramClass);
86 }
87
88 @Override
89 public Type createDefaultType(TypeClassInfo info)
90 {
91 BeanType type = new BeanType(new AnnotatedTypeInfo(getTypeMapping(), info.getTypeClass()));
92 type.setTypeMapping(getTypeMapping());
93 type.setSchemaType(createQName(info.getTypeClass()));
94
95 return type;
96 }
97
98 @Override
99 public Type createEnumType(TypeClassInfo info)
100 {
101 EnumType type = new EnumType();
102
103 type.setSchemaType(createQName(info.getTypeClass()));
104 type.setTypeClass(info.getTypeClass());
105 type.setTypeMapping(getTypeMapping());
106
107 return type;
108 }
109
110 @Override
111 public QName createQName(Class typeClass)
112 {
113 String name = null;
114 String ns = null;
115
116 XmlType xtype = (XmlType) typeClass.getAnnotation(XmlType.class);
117 if (xtype != null)
118 {
119 name = xtype.name();
120 ns = xtype.namespace();
121 }
122
123 String clsName = typeClass.getName();
124 if (name == null || name.length() == 0)
125 name = ServiceUtils.makeServiceNameFromClassName(typeClass);
126
127 if (ns == null || ns.length() == 0)
128 ns = NamespaceHelper.makeNamespaceFromClassName(clsName, "http");
129
130 return new QName(ns, name);
131 }
132
133 @Override
134 protected boolean isEnum(Class javaType)
135 {
136 return javaType.isEnum();
137 }
138 }