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();
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
142 Part part = getDefinition().createPart();
143
144
145 QName typeQName = createResponseDocumentType(op, part);
146 part.setElementName( typeQName );
147 part.setName( "parameters" );
148
149 req.addPart( part );
150 }
151 }