View Javadoc

1   package org.codehaus.xfire.xmlbeans;
2   
3   import java.lang.reflect.Field;
4   import java.lang.reflect.Method;
5   
6   import javax.xml.namespace.QName;
7   
8   import org.apache.xmlbeans.SchemaType;
9   import org.apache.xmlbeans.XmlObject;
10  import org.codehaus.xfire.XFire;
11  import org.codehaus.xfire.XFireRuntimeException;
12  import org.codehaus.xfire.service.object.DefaultObjectService;
13  import org.codehaus.xfire.service.object.ObjectServiceBuilder;
14  import org.codehaus.xfire.service.object.Operation;
15  import org.codehaus.xfire.service.object.Parameter;
16  import org.codehaus.xfire.soap.SoapConstants;
17  import org.codehaus.xfire.type.TypeMappingRegistry;
18  
19  /***
20   * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
21   */
22  public class XMLBeansServiceBuilder
23      extends ObjectServiceBuilder
24  {
25      public XMLBeansServiceBuilder()
26      {
27          super();
28      }
29  
30      public XMLBeansServiceBuilder(XFire xfire)
31      {
32          super(xfire);
33      }
34  
35      public XMLBeansServiceBuilder(XFire xfire, TypeMappingRegistry typeMappingRegistry)
36      {
37          super(xfire, typeMappingRegistry);
38      }
39  
40      protected void addOperation(DefaultObjectService service, Method method)
41      {
42          final Operation op = new Operation( method );
43          
44          service.addOperation(op);
45          
46          Class[] paramClasses = method.getParameterTypes();
47          
48          boolean isDoc = service.getStyle().equals(SoapConstants.STYLE_DOCUMENT);
49          
50          Parameter p = null;
51          
52          for ( int j = 0; j < paramClasses.length; j++ )
53          {
54              if ( XmlObject.class.isAssignableFrom(paramClasses[j]) )
55              {
56                  SchemaType st = getSchemaType(paramClasses[j]);
57  
58                  p = new Parameter(st.getDocumentElementName(), paramClasses[j]);
59                  service.getTypeMapping().register(paramClasses[j], st.getDocumentElementName(), new XMLBeansType());
60              }
61              else
62              {
63                  String paramName = "";
64                  if (isDoc)
65                      paramName = method.getName();
66  
67                  paramName = paramName + "in" + j;
68  
69                  final QName q = new QName(service.getDefaultNamespace(), paramName);
70                  p = new Parameter(q, paramClasses[j]);
71              }
72              
73              op.addInParameter( p );
74          }
75  
76          Parameter outP = null;
77          
78          Class outClass = op.getMethod().getReturnType();
79          if (!outClass.isAssignableFrom(void.class))
80          {
81              if ( XmlObject.class.isAssignableFrom(op.getMethod().getReturnType()) )
82              {
83                  SchemaType st = getSchemaType(outClass);
84      
85                  outP = new Parameter(st.getDocumentElementName(), outClass);
86                  service.getTypeMapping().register(outClass, st.getDocumentElementName(), new XMLBeansType());
87              }
88              else
89              {
90                  String outName = "";
91                  if ( isDoc )
92                      outName = method.getName();
93                  
94                  final QName q = new QName(service.getDefaultNamespace(), outName + "out");
95                  outP = new Parameter(q, method.getReturnType());
96              }
97              
98              op.addOutParameter(outP);
99          }
100     }
101     
102     /***
103      * Introspect to find the SchemaType for a particular XMLBeans class.
104      */
105     protected SchemaType getSchemaType(Class clazz)
106     {
107         try
108         {
109             Field f = clazz.getDeclaredField("type");
110     
111             return (SchemaType) f.get(null);
112         }
113         catch (NoSuchFieldException e)
114         {
115             throw new XFireRuntimeException("Couldn't find type field!", e);
116         } 
117         catch (IllegalArgumentException e)
118         {
119             throw new XFireRuntimeException("Couldn't get type field!", e);
120         }
121         catch (IllegalAccessException e)
122         {
123             throw new XFireRuntimeException("Couldn't get type field!", e);
124         }
125     }
126 }