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();
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
151 Part part = getDefinition().createPart();
152
153 Type type = ((JavaService)getService()).getTypeMapping().getType( clazz );
154 addDependency( type );
155
156
157 QName typeQName = createResponseDocumentType(op, part, type);
158 part.setElementName( typeQName );
159 part.setName( "parameters" );
160
161 req.addPart( part );
162 }
163 }