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();
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
139 Part part = getDefinition().createPart();
140
141 Type type = ((JavaService)getService()).getTypeMapping().getType( clazz );
142 addDependency( type );
143
144
145 QName typeQName = createResponseDocumentType(op, part, type);
146 part.setElementName( typeQName );
147 part.setName( "parameters" );
148
149 req.addPart( part );
150 }
151 }