View Javadoc

1   package org.codehaus.xfire.java.wsdl;
2   
3   import java.util.Iterator;
4   import java.util.Set;
5   
6   import javax.wsdl.Message;
7   import javax.wsdl.Part;
8   import javax.wsdl.WSDLException;
9   import javax.xml.namespace.QName;
10  
11  import org.codehaus.xfire.java.JavaService;
12  import org.codehaus.xfire.java.Operation;
13  import org.codehaus.xfire.java.type.Type;
14  import org.dom4j.Element;
15  import org.dom4j.Namespace;
16  
17  
18  /***
19   * Creates Document style WSDL documents for JavaServices.
20   * 
21   * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
22   */
23  public class WrappedWSDL
24      extends DocumentWSDL
25  {    
26  
27      public WrappedWSDL( JavaService service, Set transports ) throws WSDLException
28      {
29          super( service, transports );
30      }
31  
32      private QName createResponseDocumentType(Operation op, Part part, Type type)
33      {
34          JavaService service = (JavaService) getService();
35          
36          String opName = op.getName() + "Response";
37          QName responseType = new QName( service.getDefaultNamespace(), opName );
38  
39          Element schemaType = createSchemaType( service.getDefaultNamespace() );
40          Element element = schemaType.addElement( elementQ );
41          element.addAttribute( "name", opName );
42  
43          org.dom4j.QName complexQ = new org.dom4j.QName("complexType", xsdNs);
44          Element complex = element.addElement( complexQ );
45  
46          if ( op.getOutParameterClass().isAssignableFrom( Void.class ) )
47              return responseType;
48          
49          Element sequence = createSequence( complex );
50              
51          Class paramClass = op.getOutParameterClass();
52          Type paramType = service.getTypeMapping().getType( paramClass );
53          Namespace typeNS = getNamespace( paramType.getSchemaType().getNamespaceURI() );
54          
55          org.dom4j.QName outElementQ = new org.dom4j.QName("element", xsdNs);
56          Element outElement = sequence.addElement( outElementQ );
57          
58          outElement.addAttribute("name", op.getOutParameterName());
59          outElement.addAttribute("type", typeNS.getPrefix() + ":" + type.getSchemaType().getName() );
60  
61          outElement.addAttribute("minOccurs", "1");
62          outElement.addAttribute("maxOccurs", "1");
63  
64          return responseType;
65      }
66  
67      private QName createRequestDocumentType(Operation op, Part part)
68      {
69          JavaService service = (JavaService) getService();
70          
71          String opName = op.getName();// + "Request";
72  
73          Element schemaType = createSchemaType( service.getDefaultNamespace() );
74          Element element = schemaType.addElement( elementQ );
75          element.addAttribute( "name", opName );
76          
77          org.dom4j.QName complexQ = new org.dom4j.QName("complexType", xsdNs);
78          Element complex = element.addElement( complexQ );
79          
80          if ( op.getParameters().size() > 0 )
81          {
82              Element sequence = createSequence( complex );
83      
84              for ( Iterator itr = op.getParameters().iterator(); itr.hasNext(); )
85              {
86                  String paramName = (String) itr.next();
87                  
88                  Class paramClass = op.getParameterClass( paramName );
89                  Type type = service.getTypeMapping().getType( paramClass );
90                  
91                  addDependency(type);
92                  
93                  Namespace typeNS = getNamespace( type.getSchemaType().getNamespaceURI() );
94                  
95                  org.dom4j.QName outElementQ = new org.dom4j.QName("element", xsdNs);
96                  Element outElement = sequence.addElement( outElementQ );
97  
98                  outElement.addAttribute("name", paramName );
99                  outElement.addAttribute("type", typeNS.getPrefix() + ":" + type.getSchemaType().getName() );
100 
101                 outElement.addAttribute("minOccurs", "1");
102                 outElement.addAttribute("maxOccurs", "1");
103             }
104         }
105 
106         return new QName( getService().getDefaultNamespace(), opName );
107     }
108 
109     private Element createSequence( Element complex )
110     {
111         org.dom4j.QName sequenceQ = new org.dom4j.QName("sequence", xsdNs);
112         return complex.addElement( sequenceQ );
113     }
114 
115 	/***
116 	 * @see org.codehaus.xfire.java.wsdl.AbstractWSDL#createInputParts(javax.wsdl.Message, org.codehaus.xfire.java.Operation)
117 	 */
118 	protected void createInputParts( Message req, Operation op )
119 	{
120         Part part = getDefinition().createPart();
121             
122         QName typeQName = createRequestDocumentType(op, part);
123         
124         part.setName( "parameters" );
125         part.setElementName( typeQName );
126         
127         req.addPart( part );
128 	}
129     
130     
131 	/***
132 	 * @see org.codehaus.xfire.java.wsdl.AbstractWSDL#createOutputParts(javax.wsdl.Message, org.codehaus.xfire.java.Operation)
133 	 */
134 	protected void createOutputParts( Message req, Operation op )
135 	{
136 		Class clazz = op.getOutParameterClass();
137         
138         // response message part
139         Part part = getDefinition().createPart();
140 
141         Type type = ((JavaService)getService()).getTypeMapping().getType( clazz );
142         addDependency( type );
143         
144         // Document style service
145         QName typeQName = createResponseDocumentType(op, part, type);
146         part.setElementName( typeQName );
147         part.setName( "parameters" );
148         
149         req.addPart( part );
150 	}
151 }