View Javadoc

1   package org.codehaus.xfire.aegis.type.java5;
2   
3   import java.beans.PropertyDescriptor;
4   
5   import javax.xml.namespace.QName;
6   
7   import org.codehaus.xfire.aegis.type.TypeMapping;
8   import org.codehaus.xfire.aegis.type.basic.BeanTypeInfo;
9   import org.codehaus.xfire.util.NamespaceHelper;
10  
11  public class AnnotatedTypeInfo
12      extends BeanTypeInfo
13  {
14      public AnnotatedTypeInfo(TypeMapping tm, Class typeClass)
15      {
16          super(typeClass);
17          setTypeMapping(tm);
18          
19          initialize();
20      }
21  
22      protected boolean isAttribute(PropertyDescriptor desc)
23      {
24          return desc.getReadMethod().isAnnotationPresent(XmlAttribute.class);
25      }
26  
27      protected boolean isElement(PropertyDescriptor desc)
28      {
29          return !isAttribute(desc);
30      }
31  
32      protected boolean isAnnotatedElement(PropertyDescriptor desc)
33      {
34          return desc.getReadMethod().isAnnotationPresent(XmlElement.class);
35      }
36          
37      @Override
38      protected String createMappedName(PropertyDescriptor desc)
39      {
40          return createQName(desc).getLocalPart();
41      }
42  
43      protected QName createQName(PropertyDescriptor desc)
44      {
45          String name = null;
46          String ns = null;
47          
48          XmlType xtype = (XmlType) getTypeClass().getAnnotation(XmlType.class);
49          if (xtype != null)
50          {
51              ns = xtype.namespace();
52          }
53  
54          if (isAttribute(desc))
55          {
56              XmlAttribute att = desc.getReadMethod().getAnnotation(XmlAttribute.class);
57              name = att.name();
58              if (att.namespace().length() > 0) ns = att.namespace();
59          }
60          else if (isAnnotatedElement(desc))
61          {
62              XmlElement att = desc.getReadMethod().getAnnotation(XmlElement.class);
63              name = att.name();
64              if (att.namespace().length() > 0) ns = att.namespace();
65          }
66          
67          if (name == null || name.length() == 0)
68              name = desc.getName();
69          
70          if (ns == null || ns.length() == 0)
71              ns = NamespaceHelper.makeNamespaceFromClassName( getTypeClass().getName(), "http");
72          
73          return new QName(ns, name);
74      }
75  
76      public boolean isNillable(String name)
77      {
78          PropertyDescriptor desc = getPropertyDescriptorFromMappedName(name);
79          
80          if (isAnnotatedElement(desc))
81          {
82              XmlElement att = desc.getReadMethod().getAnnotation(XmlElement.class);
83              return att.nillable();
84          }
85          else
86          {
87              return super.isNillable(name);
88          }
89      }
90  }