1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.springframework.ws.wsdl.wsdl11.provider;
18
19 import java.util.Iterator;
20 import java.util.List;
21 import javax.wsdl.Definition;
22 import javax.wsdl.Fault;
23 import javax.wsdl.Input;
24 import javax.wsdl.Message;
25 import javax.wsdl.Operation;
26 import javax.wsdl.OperationType;
27 import javax.wsdl.Output;
28 import javax.wsdl.PortType;
29 import javax.wsdl.WSDLException;
30 import javax.xml.namespace.QName;
31
32 import org.springframework.util.Assert;
33 import org.springframework.util.LinkedMultiValueMap;
34 import org.springframework.util.MultiValueMap;
35 import org.springframework.util.StringUtils;
36
37 import org.apache.commons.logging.Log;
38 import org.apache.commons.logging.LogFactory;
39
40
41
42
43
44
45
46 public abstract class AbstractPortTypesProvider implements PortTypesProvider {
47
48
49 protected final Log logger = LogFactory.getLog(getClass());
50
51 private String portTypeName;
52
53
54 public String getPortTypeName() {
55 return portTypeName;
56 }
57
58
59 public void setPortTypeName(String portTypeName) {
60 this.portTypeName = portTypeName;
61 }
62
63
64
65
66
67
68
69 public void addPortTypes(Definition definition) throws WSDLException {
70 Assert.notNull(getPortTypeName(), "'portTypeName' is required");
71 PortType portType = definition.createPortType();
72 populatePortType(definition, portType);
73 createOperations(definition, portType);
74 portType.setUndefined(false);
75 definition.addPortType(portType);
76 }
77
78
79
80
81
82
83
84
85
86
87 protected void populatePortType(Definition definition, PortType portType) throws WSDLException {
88 QName portTypeName = new QName(definition.getTargetNamespace(), getPortTypeName());
89 if (logger.isDebugEnabled()) {
90 logger.debug("Creating port type [" + portTypeName + "]");
91 }
92 portType.setQName(portTypeName);
93 }
94
95 private void createOperations(Definition definition, PortType portType) throws WSDLException {
96 MultiValueMap<String, Message> operations = new LinkedMultiValueMap<String, Message>();
97 for (Iterator<?> iterator = definition.getMessages().values().iterator(); iterator.hasNext();) {
98 Message message = (Message) iterator.next();
99 String operationName = getOperationName(message);
100 if (StringUtils.hasText(operationName)) {
101 operations.add(operationName,message);
102 }
103 }
104 if (operations.isEmpty() && logger.isWarnEnabled()) {
105 logger.warn("No operations were created, make sure the WSDL contains messages");
106 }
107 for (String operationName : operations.keySet()) {
108 Operation operation = definition.createOperation();
109 operation.setName(operationName);
110 List<Message> messages = operations.get(operationName);
111 for (Message message : messages) {
112 if (isInputMessage(message)) {
113 Input input = definition.createInput();
114 input.setMessage(message);
115 populateInput(definition, input);
116 operation.setInput(input);
117 }
118 else if (isOutputMessage(message)) {
119 Output output = definition.createOutput();
120 output.setMessage(message);
121 populateOutput(definition, output);
122 operation.setOutput(output);
123 }
124 else if (isFaultMessage(message)) {
125 Fault fault = definition.createFault();
126 fault.setMessage(message);
127 populateFault(definition, fault);
128 operation.addFault(fault);
129 }
130 }
131 operation.setStyle(getOperationType(operation));
132 operation.setUndefined(false);
133 if (logger.isDebugEnabled()) {
134 logger.debug(
135 "Adding operation [" + operation.getName() + "] to port type [" + portType.getQName() + "]");
136 }
137 portType.addOperation(operation);
138 }
139 }
140
141
142
143
144
145
146
147
148 protected abstract String getOperationName(Message message);
149
150
151
152
153
154
155
156 protected abstract boolean isInputMessage(Message message);
157
158
159
160
161
162
163
164
165
166
167 protected void populateInput(Definition definition, Input input) {
168 input.setName(input.getMessage().getQName().getLocalPart());
169 }
170
171
172
173
174
175
176
177 protected abstract boolean isOutputMessage(Message message);
178
179
180
181
182
183
184
185
186
187
188 protected void populateOutput(Definition definition, Output output) {
189 output.setName(output.getMessage().getQName().getLocalPart());
190 }
191
192
193
194
195
196
197
198 protected abstract boolean isFaultMessage(Message message);
199
200
201
202
203
204
205
206
207
208
209 protected void populateFault(Definition definition, Fault fault) {
210 fault.setName(fault.getMessage().getQName().getLocalPart());
211 }
212
213
214
215
216
217
218
219
220
221
222 protected OperationType getOperationType(Operation operation) {
223 if (operation.getInput() != null && operation.getOutput() != null) {
224 return OperationType.REQUEST_RESPONSE;
225 }
226 else if (operation.getInput() != null && operation.getOutput() == null) {
227 return OperationType.ONE_WAY;
228 }
229 else if (operation.getInput() == null && operation.getOutput() != null) {
230 return OperationType.NOTIFICATION;
231 }
232 else {
233 return null;
234 }
235 }
236
237
238 }
239
240
241