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