View Javadoc

1   package org.codehaus.xfire.wsdl11.builder;
2   
3   import java.util.Collection;
4   import java.util.Iterator;
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.service.object.ObjectService;
13  import org.codehaus.xfire.service.object.Operation;
14  import org.codehaus.xfire.service.object.Parameter;
15  import org.codehaus.xfire.type.Type;
16  import org.dom4j.Element;
17  import org.dom4j.Namespace;
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( ObjectService service, Collection transports ) throws WSDLException
29      {
30          super( service, transports );
31      }
32  
33      private QName createResponseDocumentType(Operation op, Part part)
34      {
35          ObjectService service = (ObjectService) getService();
36          
37          String opName = op.getName() + "Response";
38  
39          Element schemaEl = createSchemaType( service.getDefaultNamespace() );
40          Element element = schemaEl.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.getOutParameters().size() > 0 )
47          {
48              Element sequence = createSequence( complex );
49      
50              writeParametersSchema(op.getOutParameters(), sequence);
51          }
52  
53          return new QName( getService().getDefaultNamespace(), opName );
54      }
55  
56      private QName createRequestDocumentType(Operation op, Part part)
57      {
58          ObjectService service = (ObjectService) getService();
59          
60          String opName = op.getName();// + "Request";
61  
62          Element schemaEl = createSchemaType( service.getDefaultNamespace() );
63          Element element = schemaEl.addElement( elementQ );
64          element.addAttribute( "name", opName );
65          
66          org.dom4j.QName complexQ = new org.dom4j.QName("complexType", xsdNs);
67          Element complex = element.addElement( complexQ );
68          
69          if ( op.getInParameters().size() > 0 )
70          {
71              Element sequence = createSequence( complex );
72      
73              writeParametersSchema(op.getInParameters(), sequence);
74          }
75  
76          return new QName( getService().getDefaultNamespace(), opName );
77      }
78  
79      /***
80       * @param op
81       * @param sequence
82       */
83      private void writeParametersSchema(Collection params, Element sequence)
84      {
85          ObjectService service = (ObjectService) getService();
86          
87          for ( Iterator itr = params.iterator(); itr.hasNext(); )
88          {
89              Parameter param = (Parameter) itr.next();
90              
91              Class clazz = param.getTypeClass();
92              QName pName = param.getName();
93              Type type = service.getTypeMapping().getType(clazz);
94  
95              if (type == null)
96                  throw new XFireRuntimeException("Couldn't find type for parameter " + param.getName());
97              
98              addDependency( type );
99              QName schemaType = type.getSchemaType();
100 
101             Namespace typeNS = getNamespace( type.getSchemaType().getNamespaceURI() );
102             addNamespace( typeNS.getPrefix(), typeNS.getURI() );
103             
104             org.dom4j.QName outElementQ = new org.dom4j.QName("element", xsdNs);
105             Element outElement = sequence.addElement( outElementQ );
106 
107             outElement.addAttribute("name", pName.getLocalPart() );
108             outElement.addAttribute("type", typeNS.getPrefix() + ":" + type.getSchemaType().getLocalPart() );
109 
110             outElement.addAttribute("minOccurs", "1");
111             outElement.addAttribute("maxOccurs", "1");
112         }
113     }
114 
115     private Element createSequence( Element complex )
116     {
117         org.dom4j.QName sequenceQ = new org.dom4j.QName("sequence", xsdNs);
118         return complex.addElement( sequenceQ );
119     }
120 
121 	/***
122 	 * @see org.codehaus.xfire.wsdl11.builder.AbstractJavaWSDL#createInputParts(javax.wsdl.Message, org.codehaus.xfire.java.Operation)
123 	 */
124 	protected void createInputParts( Message req, Operation op )
125 	{
126         Part part = getDefinition().createPart();
127             
128         QName typeQName = createRequestDocumentType(op, part);
129         
130         part.setName( "parameters" );
131         part.setElementName( typeQName );
132         
133         req.addPart( part );
134 	}
135 
136 	/***
137 	 * @see org.codehaus.xfire.wsdl11.builder.AbstractJavaWSDL#createOutputParts(javax.wsdl.Message, org.codehaus.xfire.java.Operation)
138 	 */
139 	protected void createOutputParts( Message req, Operation op )
140 	{
141         // response message part
142         Part part = getDefinition().createPart();
143 
144         // Document style service
145         QName typeQName = createResponseDocumentType(op, part);
146         part.setElementName( typeQName );
147         part.setName( "parameters" );
148         
149         req.addPart( part );
150 	}
151 }